首页 > 解决方案 > 汇编 IA-32:如何将 64 位有符号数除以奇数(存储在 2 个寄存器中)

问题描述

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

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

我怎样才能做到这一点?

标签: assemblyx8664-bit32bit-64bit32-bit

解决方案


您可以通过连续除法将任何长度数除以 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

推荐阅读