我有这个ASM,我一直试图运行在
Xcode没有成功:
_asm
{
push eax
push ebx
push ecx
mov eax,[A]
mov ebx,[B]
xor eax,ebx
mov ecx,eax
xor ecx,ebx
mov ebx,ecx
xor eax,ebx
mov [A],eax
mov [B],ebx
pop eax
pop ebx
pop ecx
}
我已经尝试将其更改为__asm__,但错误仍然持续:
inline asm:6:2: UnkNown use of instruction mnemonic without a size suffix
我在网上搜了几个小时,但似乎没有回答我的问题.
我正在运行Xcode 5.0.2.
有谁知道我可能需要设置在Xcode为了运行这个?
解决方法
等效的GCC风格的asm语句将是:
__asm__(
"push %%eax\n\t"
"push %%ebx\n\t"
"push %%ecx\n\t"
"mov %0,%%eax\n\t"
"mov %1,%%ebx\n\t"
"xor %%ebx,%%eax\n\t"
"mov %%eax,%%ecx\n\t"
"xor %%ebx,%%ecx\n\t"
"mov %%ecx,%0\n\t"
"mov %%ebx,%0\n\t"
"pop %%ecx\n\t"
"pop %%ebx\n\t"
"pop %%eax"
: "+m" (A),"+m" (B));
(我已经通过将堆栈上保存的值弹出回原始寄存器来更正了一个明显的错误.)
我不知道这个汇编语句的意思是什么.要做一些可以在三行C/C++代码中更有效地完成的工作:
temp = A; A = B; B = temp;
如果我假装它做了一些有用的东西,而不只是交换两个变量,那么我建议摆脱这样显然不重要的PUSH / POP指令:
__asm__(
"xor %1,%0\n\t"
"mov %0,%2\n\t"
"xor %1,%2\n\t"
"mov %2,%1\n\t"
"xor %1,%0"
: "+r" (A),"+r" (B),"=r" (temp));