内联汇编错误:寄存器后的垃圾“-4(%ebp)”

时间:2012-06-30 12:59:26

标签: assembly linux-kernel kernel inline-assembly

GCC在我的以下代码注册错误后告诉垃圾“-4(%ebp)”:

  static __inline__ int xchg_asm(int* lock, int val)
    {
        int ret;

        __asm__ __volatile__(
                    LOCK "movl %1,%%eax;  xchg (%1),%2  ; movl %%eax %0"
                    :"=m" (ret)
                    :"d"(lock), "c"(val));
        return ret;
    }

我看不出如何修改它。

3 个答案:

答案 0 :(得分:1)

gas(gcc使用的GNU汇编程序)期望换行符为行结尾,而不是分号。您是否尝试使用"\n"代替";"

答案 1 :(得分:0)

尝试添加' \ n'在每次asm insruction之后:

 __asm__ __volatile__(
                LOCK "movl %1,%%eax \n  xchg (%1),%2 \n movl %%eax, %0 \n"
                :"=m" (ret)
                :"d"(lock), "c"(val));
    return ret;
}

如果出现此类错误,请将源代码编译为汇编程序文件 - 使用GCC的-S选项并检查气体报告的行。

答案 2 :(得分:0)

此行缺失

  

LOCK" movl%1,%% eax; xchg(%1),%2; movl %% eax%0"

缺少分号,因为它的最后一个论点。