gpt4 book ai didi

c - 如何使用 XADD 来增加内存中的值?

转载 作者:太空宇宙 更新时间:2023-11-04 03:57:49 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的接口(interface)来自动增加一些值。我尝试执行以下操作(在 C 中)

void foo()
{
int counter = 0;
assembly_xadd(&counter);
printf("counter is %d\n");
}

counter is 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

最佳答案

你想要的是XADDL %eax, (%edi)。请记住,对于 gas 语法,目标始终是第二个值,并且您想要更改地址 %edi 处的内存。您改为向地址 %edi 添加一个并将其存储在 %eax 中。通常,具有两个寄存器的 xadd 是无用的(原子内存访问方式),因为寄存器操作始终是原子的。

您使用 MOVL 0x8(%ebp),%edi 所做的是将 32 位整数的地址移动到 %edi。另外,如果你想返回原始值,这就是我假设 MOVL %edi,%eax 的目的,你不应该这样做 MOVL %edi,%eax%eax 已包含 (%edi) 的先前值。

关于c - 如何使用 XADD 来增加内存中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com