我正在尝试重写这段代码以在 visual studio 中工作,但我显然不明白如何使用冒号的用途和 __volatile__
的含义,
你能提供一些帮助吗:)?
__asm__ __volatile__ (
"mov %0, %%edi\n"
"xor %%eax, %%eax\n"
"xor %%ecx, %%ecx\n"
"dec %%ecx\n"
"repne scasb\n"
"sub %%ecx, %%eax\n"
"dec %%eax\n"
:
: "m" (src)
: "memory", "%ecx", "%edi", "%eax");
谢谢!
最佳答案
这两个内联汇编器是完全不同的。 Visual Studio 内联汇编器更原始但更易于使用。在 VS 中:
- 内联汇编语言不需要用字符串括起来;
- 指令操作数按dest,src顺序;
- C/C++ 变量按原样访问;
- 等等
您的代码没有任何输出运算符(在第一个冒号之后),所以我看不出它有什么影响。但是假设 eax
寄存器最后要保存在 src
变量中。那么你想要这样的东西:
char* src;
...
__asm {
mov edi,src
xor eax,eax
xor ecx,ecx
dec ecx
repne scasb
sub eax,ecx
dec eax
mov src,eax // save result
}
顺便说一句,它看起来对我来说不是最佳选择。 eax
的所有业务都可以通过 而不是 ecx
来完成,如果我正确理解代码的话:
__asm {
mov edi,src
xor al,al
xor ecx,ecx
dec ecx
repne scasb
not ecx
mov src,ecx // save result
}
关于c++ - 将 GCC/ATT 风格的汇编程序转换为 visual studio 汇编程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27678797/