[英]C++ Passing arguments to inline assembler function
我在C ++中有内联汇编问题。 我正在尝试实现快速strlen,但是它不起作用-当我使用__declspec(naked)
关键字调试器时,输入的地址显示为0x000000,当我不使用该关键字时,eax指向一些垃圾,函数返回各种价值。
这是代码:
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;
}
有人可以指出我做错了什么吗?
请勿使用__declspec(naked)
因为在这种情况下,编译器不会生成结尾和序言指令,并且您需要生成一个序言,就像编译器希望访问fastStrlen
参数fastStrlen
。 由于您不知道编译器期望什么,您应该让它生成序言。
这意味着您不能只使用ret
返回到呼叫者,因为这意味着您要提供自己的结尾。 由于您不知道编译器使用了什么序言,因此您不知道需要实现什么尾声来反转它。 而是将返回值分配给您在内联汇编语句之前在函数内部声明的C变量,并在常规C return语句中返回该变量。 例如:
int fastStrlen(char *input)
{
int retval;
_asm
{
mov ecx, dword ptr input
...
Sxend:
mov retval,eax
}
return retval;
}
如您的注释中所述,您的代码将无法改善编译器运行时库中的strlen
实现。 它也会读取偶数长度的字符串末尾,如果未将字符串末尾的字节映射到内存中,则会导致内存错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.