1

このインラインasmに出くわしました。この構文がないとどうなるかわかりません...誰かに見せてもらえますか?

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

2 に答える 2

4
lock
incl   llvm_cbe_tmp__29

ただし、オペランドは抽象的に指定されているため、ロードとストアを意味する場合でも、コンパイラはオペランドを参照するために必要なコードを生成します。その結果、3つ以上の命令またはアドレッシングモードが追加される可能性があります。

于 2009-12-25T18:14:49.817 に答える
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
于 2009-12-25T18:17:58.360 に答える