你能把这个内联asm转换成非内联的吗?

时间:2009-12-25 18:09:25

标签: gcc assembly inline-assembly

我遇到了这个内联的asm。如果没有这种语法,我不确定应该怎么看...有人能给我看一下吗?

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

2 个答案:

答案 0 :(得分:4)

lock
incl   llvm_cbe_tmp__29

但是,因为操作数是抽象地指定的,所以编译器将生成引用它所需的代码,即使这意味着加载和存储。因此,可能会添加两个以上的指令或寻址模式。

答案 1 :(得分: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