[英]segmentation fault with cmpxchg in inline asm
我正在使用嵌入式asm編寫my_simple_mutex。 下面的代碼部分被注釋掉可以正常工作,但是,帶有cmpxchg的版本以segfault結尾。 我在cygwin中使用g ++ 4.8.2。
void simple_mutex::spin_lock(){
/*asm ("spin_lock:\n\t"
"rep; nop;\n\t"
"lock; bts $0x00, %0;\n\t"
"jc spin_lock;\n\t"
:"=m"(lock)
:"m"(lock)
:
);
*/
asm ("spin_lock:\n\t"
"rep; nop;\n\t"
"movl $0x00, %%eax\n\t"
"movl $0x01, %%edx\n\t"
"lock; cmpxchg %%edx, %0\n\t"
"jnz spin_lock;\n\t"
:"=m"(lock)
:"m"(lock)
:
);
}
變量lock
的類型為int
。 有什么想法我做錯了嗎?
由於您忘記告訴編譯器您修改了eax
和edx
,因此故障可能出在其他地方。 解決方法是將它們列為“ clobbers”(在第三個冒號之后的部分)。 除非您被迫使用內聯匯編,否則請使用原子內置函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.