程序集IA-32:如何将64位有符号数除以奇数(存储在2个寄存器中)

时间:2018-10-20 15:33:28

标签: assembly x86 64-bit 32bit-64bit 32-bit

IA-32 架构上,我如何将带符号数字除以3(例如)存储在2个寄存器edx:eax中的值( 64位值)。我想将整个值(64位)除以3(不仅是32位),并将其存储在2个寄存器中。

我假设只能使用 shifts 操作来完成此操作,因为imul仅适用于乘以32位数字。但只有找到用2^n数字除法的解决方案。

我该如何实现?

1 个答案:

答案 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