assembly 如何在x86-64上划分无符号128/64位?

7rfyedvj  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(137)

我需要将64位处理器上寄存器rdx:rax处的无符号128位数字除以rdi中的64位除数。低位在rax中,高位在rdx中。然而,DIV指令仅支持64/64位除法。
我的方法是在另一个寄存器中保存rax(数字的低位),然后将rdx寄存器中的位左移到rax中,以便用rdi执行长除法。并将计算步骤保存在另一个寄存器中,以逐步建立解决方案。
但我认为必须有一个更有效的方法。是否有指令支持在多个寄存器之间进行这种计算?

tag5nh1u

tag5nh1u1#

RDX:RAX中的无符号128位数除以RDI中的64位数

在x86-64上,需要2个除法的级联来将RDX:RAX中的128位值除以64位值。
第一个除法除以高被除数(用0扩展),得到一个高商。第二次除法除以低被除数(用第一次除法的余数扩展),得到低商。这是我们在RCX中返回的第二次除法的余数。

; IN (RDX:RAX,RDI) OUT (RDX:RAX,RCX)
    mov     rcx, rax       ; Temporarily store LowDividend in RCX
    mov     rax, rdx       ; First divide the HighDividend
    xor     edx, edx       ; Setup for division RDX:RAX / RDI
    div     rdi            ; -> RAX is HighQuotient, Remainder is re-used
    xchg    rax, rcx       ; Temporarily move it to RCX restoring LowDividend
    div     rdi            ; -> RAX is LowQuotient, Remainder RDX
    xchg    rdx, rcx       ; Build true 64-bit quotient in RDX:RAX
    ret                    ; and return remainder in RCX=[0,RDI-1]

相关问题