gpt4 book ai didi

assembly - 有条件地将零移入寄存器?

转载 作者:行者123 更新时间:2023-12-04 17:22:56 24 4
gpt4 key购买 nike

有没有办法有条件地将零移动到汇编中的寄存器中?我正在尝试做

cmpb %r9b, %r8b #compare r9 and r8
cmovgq $0, %rcx #If r8>r9, move zero to rcx

但是编译器提示“cmovg 的操作数类型不匹配”,因为第一个操作数是立即常量。我考虑过有条件地跳转到 mov 但我不确定是否还有其他可能更好的操作码。我怎样才能有条件地将这个寄存器清零而不用掉另一个寄存器?

最佳答案

因为 cmovgq 指令不接受立即值操作数,不使用另一个寄存器的方法可能是将零值添加到堆栈,使用其对应的地址而不是使用立即数值,然后恢复堆栈指针。

pushq   $0            # push 0 onto the stack
cmpb %r9b, %r8b # compare r9b and r8b
cmovgq (%rsp), %rcx # if r8b > r9b, move zero to rcx
addq $8, %rsp # restore stack pointer

或者,不是将零压入堆栈然后恢复堆栈指针,而是可以将零值存储在内存中的其他位置。

  cmpb    %r9b, %r8b  # compare r9b and r8b
cmovgq zero, %rcx # if r8b > r9b, move zero to rcx
...

.section .rodata
zero:
.quad 0

条件跳转不是使用 cmovgq,而是一种替代方法,它不会使用另一个寄存器,并且会导致相同的行为(即,rcx 有条件地设置为0 如果 r8b > r9b).

  cmpb    %r9b, %r8b   # compare r9 and r8
jle destination # if r8b <= r9b, skip the next line
movq $0, %rcx # if r8b > r9b, move zero to rcx
destination:
...

关于assembly - 有条件地将零移入寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65078996/

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