; 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]
1条答案
按热度按时间tag5nh1u1#
RDX:RAX中的无符号128位数除以RDI中的64位数
在x86-64上,需要2个除法的级联来将RDX:RAX中的128位值除以64位值。
第一个除法除以高被除数(用0扩展),得到一个高商。第二次除法除以低被除数(用第一次除法的余数扩展),得到低商。这是我们在RCX中返回的第二次除法的余数。