我想写一个简单的接口来自动增加一些值。我尝试做如下(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