首页 文章

在ASM中为cmpxchg16b设置寄存器

提问于
浏览
0

我正在尝试使用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 回答

  • -1

    这个答案假定您通过引用传递旧值和新值 .

    my_cmpr_swap:
        #save rbx as we need the register
        pushq %rbx
    
        # set up registers rcx:rbx
        movq (%rdx), %rbx
        movq 8(%rdx), %rcx
    
        # set up registers rdx:rax
        movq (%rdi), %rax
        movq 8(%rdi), %rdx
    
        #compare-swap
        lock cmpxchg16b (%rsi)
    
        #return 1 if success, 0 if not
        jz success
    
        # store updated rdx:rax
        movq %rax, (%rdi)
        movq %rdx, 8(%rdi)
    
        movq $0,%rax
        jmp end
    success:
        movq $1,%rax
    end:
        popq %rbx
        ret
    
  • -1

    这个答案假设您按值传递旧值和新值 .

    my_cmpr_swap:
        #save rbx as we need the register
        pushq %rbx
    
        mov %rdx, %r10
    
        # set up registers rcx:rbx
        movq %rcx, %rbx
        movq %r8, %rcx
    
        # set up registers rdx:rax
        movq %rdi, %rax
        movq %rsi, %rdx
    
        #compare-swap
        lock cmpxchg16b (%r10)
    
        #return 1 if success, 0 if not
        jz success
    
        movq $0,%rax
        jmp end
    success:
        movq $1,%rax
    end:
        popq %rbx
        ret
    

相关问题