我遇到了這個內聯asm。如果沒有這個語法,我不知道它應該是什麼樣的......有人可以向我展示它嗎?你可以將這個內聯asm轉換爲非內聯嗎?
__asm__ volatile ("lock\n\tincl %0"
:"=m"(llvm_cbe_tmp__29)
:"m"(*(llvm_cbe_tmp__29))"cc");
我遇到了這個內聯asm。如果沒有這個語法,我不知道它應該是什麼樣的......有人可以向我展示它嗎?你可以將這個內聯asm轉換爲非內聯嗎?
__asm__ volatile ("lock\n\tincl %0"
:"=m"(llvm_cbe_tmp__29)
:"m"(*(llvm_cbe_tmp__29))"cc");
lock
incl llvm_cbe_tmp__29
但是,因爲抽象地指定操作數時,編譯器會生成引用它所需的代碼,即使這意味着一個加載和存儲。因此,可能會添加兩條以上的指令或尋址模式。
除了它確實需要加載和存儲代碼在這種情況下不起作用。 – Joshua 2011-06-29 19:05:15
在此使用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
注意,在你面前 「CC」 需要一個冒號。 – 2009-12-25 18:33:15
這個C代碼是由llvm生成的,這個C代碼有可能是不正確的? – Aftershock 2009-12-26 13:42:26