汇编:使用两个32位寄存器中的值进行除法,就像它们是一个64位整数一样

时间:2014-03-26 02:08:22

标签: assembly x86 gas integer-division cpu-registers

我需要在汇编中打印64位整数,但我正在使用32位机器,因此我将64位整数存储在两个32位寄存器中。整数的高位部分存储在%edx中,低部分存储在%eax中。

我知道如何打印32位整数没问题,只需连续除以10并打印余数。

我也知道如何将我的64位数乘以32位。

但是杀死我的是分裂:

从我收集到的内容来看,我认为我必须将每个寄存器%edx和%eax除以10,并以某种方式将两个答案组合起来,就像我用乘法一样,但是我如何处理余数和商数每个部门?

我正在使用32位Linux机器上使用AT& T x86语法的GNU汇编程序。 谢谢

1 个答案:

答案 0 :(得分:3)

这个问题最近出现了好几次。该算法类似于使用铅笔和纸进行划分,将多位数的红利除以单位数除数。这是一个代码片段,64位被分配在edi:esi中。注意,同样的方法可以扩展为将存储在存储器中的非常大的被除数除以32位除数。

        .data
decstr  db      24 dup (0)
pfstr   db      '%','s',0dh,0ah,0
        .code
        extrn   _printf:NEAR
_main   proc    near
        mov     edi,000000002h          ;edi = high order dvnd
        mov     esi,04CB016EAh          ;esi = low  order dvnd
        lea     ebx,decstr+23           ;ebx = ptr to end string
        mov     ecx,10                  ;ecx = 10 (constant)
div0:   xor     edx,edx                 ;clear edx
        mov     eax,edi                 ;divide high order
        div     ecx
        mov     edi,eax
        mov     eax,esi                 ;divide low order
        div     ecx
        mov     esi,eax
        add     dl,'0'                  ;store ascii digit
        dec     ebx
        mov     [ebx],dl
        mov     eax,edi                 ;repeat till dvnd == 0
        or      eax,esi
        jnz     div0
        push    ebx                     ;display string
        push    offset pfstr
        call    _printf
        add     sp,8
        xor     eax,eax
        ret
_main   endp