2009-12-25 52 views
1

我遇到了這個內聯asm。如果沒有這個語法,我不知道它應該是什麼樣的......有人可以向我展示它嗎?你可以將這個內聯asm轉換爲非內聯嗎?

__asm__ volatile ("lock\n\tincl %0" 
     :"=m"(llvm_cbe_tmp__29) 
     :"m"(*(llvm_cbe_tmp__29))"cc"); 
+0

注意,在你面前 「CC」 需要一個冒號。 – 2009-12-25 18:33:15

+0

這個C代碼是由llvm生成的,這個C代碼有可能是不正確的? – Aftershock 2009-12-26 13:42:26

回答

4
lock 
incl llvm_cbe_tmp__29 

但是,因爲抽象地指定操作數時,編譯器會生成引用它所需的代碼,即使這意味着一個加載和存儲。因此,可能會添加兩條以上的指令或尋址模式。

+0

除了它確實需要加載和存儲代碼在這種情況下不起作用。 – Joshua 2011-06-29 19:05:15

3

在此使用gcc -S:

int main() 
{ 
    int *p; 
    asm volatile ("lock\n\tincl %0":"=m"(p):"m"(*(p)):"cc"); 
} 

.type main, @function 
main: 
    leal 4(%esp), %ecx 
    andl $-16, %esp 
    pushl -4(%ecx) 
    pushl %ebp 
    movl %esp, %ebp 
    pushl %ecx 
    subl $20, %esp 
    movl -8(%ebp), %eax 
#APP 
# 4 "asm.c" 1 
    lock 
    incl -8(%ebp) 
# 0 "" 2 
#NO_APP 
    addl $20, %esp 
    popl %ecx 
    popl %ebp 
    leal -4(%ecx), %esp 
    ret