【问题标题】:error: invalid 'asm': operand number missing after %-letter when using inline assembly with GCC错误:无效的“asm”:在 GCC 中使用内联汇编时,在 %-letter 后缺少操作数编号
【发布时间】:2013-02-27 13:51:20
【问题描述】:

我正在尝试转换 MS 的简单汇编代码以与 gcc 一起使用,我尝试转换的 MS 汇编就在下面。我有两个int 变量,number_return

mov eax, number
neg eax
return, eax

而且,我已经尝试过了:

asm("movl %eax, %0" :: "g" ( number));
asm("neg %eax");
asm("movl %0, %%eax" : "=g" ( return ));

但是,编译器给了我这个错误:

main.c:17:9: error: invalid 'asm': %-letter 后缺少操作数

错误在哪里,我该如何解决这个错误? 谢谢

【问题讨论】:

    标签: gcc assembly x86 inline-assembly


    【解决方案1】:

    你不能那样做,因为你在不告诉编译器的情况下覆盖寄存器。另外,% 是一个特殊字符,类似于 printf。

    最好将所有指令放在一个asm 中,否则编译器可能会在两者之间做一些意想不到的事情。

    试试这个:

    asm("movl %%eax, %1\n\t"
        "neg %%eax\n\t"
        "movl %0, %%eax" : "=g" ( _return )  : "g" ( number) : "eax");
    

    不过,可能还有更好的方法:

    asm("neg %0": "=a" ( _return )  : "a" ( number));
    

    我不知道你为什么不能(在 C 中):

    _return = -number;
    

    【讨论】:

    • 查看生成程序集,我看到了: ... "mov DWORD PTR [esp+24], 0 ... "%eax, ebx" ... "neg %eax" "movl ebx, %eax" (变量错误:()
    • 你的第一个块是向后的; AT&T 语法将目的地放在最后,请参阅 Aki 的回答。如果你用-masm=intel 编译,那么你不应该在你的寄存器名称上使用%。您也不需要强制 EAX,只需使用 neg %0"+r" 约束。但是,是的,显然内联汇编是一个糟糕的主意。
    【解决方案2】:

    尝试类似:

    #include <stdio.h>
    #include <stdlib.h>
    int main(int ac,char**av)
    {
        int n=ac>1?atoi(av[1]):42;
        asm ("movl %0, %%eax \n\t"
             "neg %%eax \n\t"
             "movl %%eax, %0 \n\t" : "+r" (n)::"eax");
        printf("%d\n",n);
    }     
    

    问题是:

    • 操作数的顺序是instr src,dst
    • %% 而不是 %
    • 没有独立的汇编程序行——输入/输出/clobber 列表与汇编程序块的所有相关联
    • '+r' 拥有一个既可作为输入又可作为输出的参数
    • 我怀疑 MS 是否允许这样使用关键字“return”

    并使其更加高效:

    asm("neg %0" : "+r" (n) ::);  // works as well
    

    【讨论】:

    • 你在正确的轨道上——我只是无法从问题中找出所有重要的规范:它是asm("mov %1, %0\n\t neg %0\n\t" : "=r" (_return_value) : "r" (input):); 如果你稍后再做return _return_value,gcc 很可能会分配eax 注册为%0
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2016-09-06
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2018-02-11
    相关资源
    最近更新 更多