2012-06-30 117 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」

缺少分號這是最後一個論點。