我正在尝试使用lock cmpxchg16b指令进行原子比较并交换C中的外部函数 . 对函数的调用有3个128位对象,其中我要比较前2个,并替换为第3个他们应该相互平等 .
这些是我收集的参数:
rdi:旧状态
rsi:cur状态
rdx:mod状态
现在,我想要做的是将rdi(不应该有下半部分?)加载到rax中,并将此状态的后半部分加载到rdx中 . (rdi 8 ??)
如果我在那里做的是正确的那么rdx将与rsi和rax与rsi 8进行比较
lock cmpxchg16b (%rsi)
对?因为它是小端
但是如何将rdi移动到rdx:rax?我试过这个:
movq (%rdi), %rdx
和
movq %rdi, %rdx
但我似乎无法让它工作,它总是喷出它们不相等,即使用相同的对象运行两次 .
现在全功能:
my_cmpr_swap:
#save rbx as we need the register
pushq %rbx
# set up registers rdx:rax
movq %rdx, (%rdi)
#compare-swap
lock cmpxchg16b (%rsi)
#return 1 if success, 0 if not
jz success
movq $0,%rax
jmp end
success:
movq $1,%rax
end:
popq %rbx
ret
2 回答
这个答案假定您通过引用传递旧值和新值 .
这个答案假设您按值传递旧值和新值 .