Xcode:运行ASM

13

我有这段汇编代码,一直试图在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:未知指令助记符的使用,没有大小后缀

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

我正在运行Xcode 5.0.2。

是否有人知道我需要在Xcode中设置什么以便运行它?


听起来编译器期望使用 gas 语法(其中每个指令都有一个后缀显示其大小,寄存器名称以 % 开头,并且源和目标操作数被颠倒)。它看起来像是 pushl %eax movl (A), %eax 等等,或者非常接近这样的语法。 - cHao
你可以尝试使用-Xassembler -msyntax=intel来让编译器识别你的代码。 - cHao
需要掌握的知识远不止这些。请访问http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax了解更多信息。 - cHao
1
在为x86编写汇编语言时,有两种常见格式:intel格式和att格式。这些格式之间有许多差异(如Unheilig提到的%)。根据你的汇编器,你可以要求它使用一种格式或另一种格式。你发布的代码看起来像是intel格式。错误消息清楚地表明它正在编译att格式。你需要告诉你的编译器使用intel格式(cHao试图建议的方式),或者重新编写代码以符合att格式。这两种格式都有许多参考资料(请查看谷歌)。 - David Wohlferd
1个回答

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));

1
如果目标是交换两个值,那么只需要使用 asm ("" : "=r" (b), "=r" (a) : "0" (a), "1" (b)); 如何?难以超越 0 条语句的性能... - David Wohlferd
如果原帖的代码应该是一个实际的例子,我的建议是使用我给出的C/C++示例代码。 - Ross Ridge
没错,那可能是最好的选择。 - David Wohlferd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接