内联汇编:错误的寄存器名称

R. *_* 久蔵 0 c gcc inline-assembly

编译时我得到"错误:错误的寄存器名称'%% ecx'"

#include <stdio.h>

int main(void){
    asm("mov 3, %%ecx\n\t");
    // ...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*zar 5

当您想要使用gcc的"扩展内联汇编",输入,输出和clobber列表时,会使用寄存器的双百分号.这是因为内联汇编程序保留了单百分号,用于替换实际操作数名称,基于这些列表和后面的数字%.

如果您不想使用"扩展"内联汇编,只需使用普通的AT&T语法.做这样的事情:

int main(void)
{
    asm("mov 3, %ecx\n\t");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

与gcc 4.6.3完美搭配.我也假设你知道之间的区别mov 3, %ecxmov $3, %ecx.

  • @キューゾリファイ当你使用_extended_格式`asm()`(和**只有**扩展格式)时,你必须在寄存器上使用`%%`,在操作数上只使用一个`%`.阅读您之前评论过的链接! (2认同)