在 IA-32 架构上,我如何将带符号数字除以3(例如)存储在2个寄存器edx:eax中的值( 64位值)。我想将整个值(64位)除以3(不仅是32位),并将其存储在2个寄存器中。
我假设只能使用 shifts 操作来完成此操作,因为imul
仅适用于乘以32位数字。但只有找到用2^n
数字除法的解决方案。
我该如何实现?
答案 0 :(得分:3)
您可以将任意长度的数字除以32位数字并进行连续除法,将前一个除法的余数用作下一个除法的除法的最高有效32位,类似于长手除法
请注意,我需要修复此代码以处理负除数,但它应与正除数和有符号的除数一起使用。
请注意,此代码四舍五入为负无穷大:-10/3:商= -4,余数= +2。为了处理负数除数,该代码可以对除数和除数进行求反,然后对余数取反。
mov ecx,000000003h ;ecx = signed dvsr (must be positive)
mov edi,0fedcba98h ;edi:esi = signed dvnd
mov esi,076543210h
;; inputs
mov eax,edi ;eax = upper 32 bits dvnd
cdq ; sign-extend that into EDX:EAX
idiv ecx
test edx,edx ;br if sign rmdr == sign dvsr
jns short div0
dec eax ;dec quot
add edx,ecx ;rem += dvsr
div0: mov edi,eax ;edi = upper 32 bits quot
mov eax,esi ;eax = lower 32 bits dvnd
div ecx
mov esi,eax ;esi = lower 32 bits quot
; ;edx = remainder