C++에서 인라인 asm에 문제가 있습니다. 빠른 strlen을 구현하려고하지만 작동하지 않습니다. __declspec(naked)
키워드 디버거는 입력 주소를 0x000000으로 표시합니다. 키워드를 사용하지 않으면 eax가 일부 휴지통을 가리키고 함수는 다양한 값을 반환합니다.C++ 인라인 어셈블러 함수에 인수 전달
여기에 코드입니다 :
int fastStrlen(char *input) // I know that function does not calculate strlen
{ // properly, but I just want to know why it crashes
_asm // access violation when I try to write to variable x
{
mov ecx, dword ptr input
xor eax, eax
start:
mov bx, [ecx]
cmp bl, '\0'
je Sxend
inc eax
cmp bh, '\0'
je Sxend
inc eax
add ecx, 2
jmp start
Sxend:
ret
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char* test = "test";
int x = fastStrlen(test);
cout << x;
return 0;
}
아무도 내가 잘못 뭐하는 거지 저를 지적 할 수 있습니까?
'mov'가 아닌 'lea'를 원한다. 또한 길이를 반환하지 않으면 주소를 반환합니다. 16 비트 레지스터를' '\ 0' '과 비교하는 것은 여러분이 원하는 것을 할 수 없습니다. 그건 그렇고, 이것은 굉장히 빠르지 않을 것이고, 당신은 이것을하기 위해 정말로 asm이 필요하지 않습니다. – Jester
@Jester mov가 작동하지 않으며 예, 나는 잘못된 값으로 돌아오고 있음을 알고 있지만 오류는 ESI 레지스터 사용으로 인한 것이라고 생각하여 이것을 변경했습니다. – encoree1337
ABI에만 해당됩니다 (실제로 프로세서, 운영 체제, 컴파일러에 따라 다름). –