2012-06-30 119 views
1

GCC告诉垃圾`-4(%EBP)' 寄存器错误后,我的如下代码:内联汇编错误:垃圾`-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; 
    } 

我看不出修改它。

+4

您在第二个“movl”中缺少'''。 – Mat

+0

不相关,但非常重要 - 在破坏数据列表中定义EAX。否则,GCC会假定EAX不会被此代码所改变,并且您可能会收到令人讨厌的错误。 – ugoren

回答

1

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

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选项,检查报告用气行。

0

此行缺少

LOCK “MOVL%1,%% EAX; XCHG(%1),2%; MOVL EAX %%%0”

缺少分号这是最后一个论点。