簡體   English   中英

匯編:使用兩個32位寄存器中的值進行除法,就好像它們是一個64位整數一樣

[英]Assembly: division using the values in two 32-bit registers as if they were one 64-bit integer

我有一個64位整數需要在匯編中打印,但是我在32位計算機上工作,因此我將64位整數存儲在兩個32位寄存器中。 整數的高位部分存儲在%edx中,低位部分存儲在%eax中。

我知道如何打印32位整數沒有問題,只需連續除以10並打印余數即可。

我也知道如何將我的64位數字乘以32位。

但是殺死我的是分裂:

從我收集的數據中,我認為我必須將寄存器%edx和%eax的每一個除以十,然后以某種方式將兩個答案組合在一起,就像乘法一樣,但是如何處理每個除法的余數和商?

我正在32位Linux機器上使用AT&T x86語法使用GNU匯編器。 謝謝

這個問題最近出現了好幾次。 該算法類似於用鉛筆和紙進行除法,將多位數的除數除以一位數的除數。 這是一個代碼段,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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM