Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //(c)Terminator
- #include <stdio.h>
- #ifdef __GNUC__
- //Длинна строки(32-бит синтаксис AT)
- size_t __length(const char* s){
- size_t n = 0;
- asm("movl %0, %%esi"::"d"(s));
- asm("movl %esi, %edi\n\t"
- "__next:\n\t"
- "mov (%esi), %al\n\t"
- "or $0, %al\n\t"
- "jz __end;\n\t"
- "incl %esi\n\t"
- "jmp __next;\n\t"
- "__end:\n\t"
- "subl %edi, %esi\n\t");
- asm("movl %%esi, %0" :"=r"(n));
- return n;
- }
- #else
- //Длинна строки(32-бит синтаксис INTEL)
- size_t __length(const char* s){
- size_t n = 0;
- __asm {
- mov esi, s
- __next:
- mov al, byte ptr[esi]
- or al, 0
- jz __end;
- inc esi
- jmp __next;
- __end:
- mov edx, dword ptr s
- sub esi, edx
- mov dword ptr n, esi
- };
- return n;
- }
- #endif
- int main(void){
- char str[] = "Terminator Cyborg";
- printf("length: %u\n", __length(str));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement