Вот накидал простое не оптимизированное решение:
#include
#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;
}
Лучшее форматирование кода: http://pastebin.com/yMDCEM3e