首页 文章

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

提问于
浏览
1

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

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

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

但是杀死我的是分裂:

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

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

1 回答

  • 2

    这个问题最近出现了好几次 . 该算法类似于使用铅笔和纸进行划分,将多位数的红利除以单位数除数 . 这是一个代码片段,在edi:esi中保留64位被除数 . 注意,可以扩展相同的方法以将存储在存储器中的非常大的被除数除以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
    

相关问题