我想寫一個簡單的接口來自動增加一些值。我嘗試做如下(C)如何使用XADD增加內存中的值?
void foo()
{
int counter = 0;
assembly_xadd(&counter);
printf("counter is %d\n");
}
計數器爲0
這裏是我的彙編代碼我不知道如果我正確使用XADD:
.global assembly_xadd
assembly_xadd:
PUSHL %ebp
MOVL %esp,%ebp
PUSHL %edi
MOVL $0x1,%eax
MOVL 0x8(%ebp),%edi
XADDL %edi,%eax
MOVL %edi,%eax
POPL %edi
MOVL %ebp,%esp
POPL %ebp
RET
嗯,你代碼中的'xadd'沒有引用任何內存嗎? – 2013-02-12 01:13:20
我傳遞了第一個參數,它是存儲整數的地址。這是行 >> MOVL 0x8(%ebp),%edi – 2013-02-12 01:18:06
那麼,什麼?你的'xadd'仍然會把'edi'加到'eax'上,只是註冊,並且和(在'eax'中)不會寫入內存。然後,即使是這樣,如果你想以原子方式修改它,'xadd'的目的仍然會被擊敗,因爲'xadd'需要直接添加到內存操作數。最後,在'xadd'上需要一個'lock'前綴。 – 2013-02-12 01:26:08