Xcode:运行ASM

时间:2014-01-09 20:54:51

标签: xcode assembly

我有这个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__,但错误仍然存​​在:

  

内联asm:6:2:未使用没有大小后缀的指令助记符

我在网上搜索了几个小时,但似乎没有人回答我的问题。

我正在运行Xcode 5.0.2。

有人知道我在Xcode中设置的内容是为了运行吗?

1 个答案:

答案 0 :(得分:10)

等效的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,%%ebx\n\t"
    "xor %%ebx,%%eax\n\t"
    "mov %%eax,%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));