2009-12-25 55 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