Advertisement
Guest User

my strlen

a guest
Jun 22nd, 2014
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.90 KB | None | 0 0
  1. //(c)Terminator
  2. #include <stdio.h>
  3.  
  4. #ifdef __GNUC__
  5.  
  6. //Длинна строки(32-бит синтаксис AT)
  7. size_t  __length(const char* s){
  8.     size_t n = 0;
  9.     asm("movl %0, %%esi"::"d"(s));
  10.     asm("movl %esi, %edi\n\t"
  11.         "__next:\n\t"
  12.         "mov (%esi), %al\n\t"
  13.         "or  $0, %al\n\t"
  14.         "jz __end;\n\t"
  15.         "incl %esi\n\t"
  16.         "jmp __next;\n\t"
  17.         "__end:\n\t"
  18.         "subl %edi, %esi\n\t");
  19.     asm("movl %%esi, %0" :"=r"(n));
  20.     return n;
  21. }
  22.  
  23. #else
  24.  
  25. //Длинна строки(32-бит синтаксис INTEL)
  26. size_t  __length(const char* s){
  27.     size_t n = 0;
  28.     __asm {
  29.         mov esi, s
  30. __next:
  31.         mov al, byte ptr[esi]
  32.         or  al, 0
  33.         jz  __end;
  34.         inc  esi
  35.         jmp __next;
  36. __end:
  37.         mov edx,  dword ptr s
  38.         sub esi,  edx
  39.         mov dword ptr n, esi
  40.     };
  41.     return n;
  42. }
  43.  
  44. #endif
  45.  
  46.  
  47. int  main(void){
  48.     char str[] = "Terminator Cyborg";
  49.     printf("length: %u\n", __length(str));
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement