1

我有一個64位整數,需要在彙編中打印,但我正在使用32位機器,所以我我的64位整數存儲在兩個32位寄存器中。整數的高位部分存儲在%edx中,低位部分存儲在%eax中。彙編:使用兩個32位寄存器中的值劃分,就好像它們是一個64位整數

我知道如何打印一個32位整數沒有問題,只需連續除10並打印餘數。

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

但是,什麼是我的命是師:

從我所收集的,我想我必須在10點我的每一個寄存器%EDX和%EAX劃分,並以某種方式結合兩個答案,因爲我會有乘法,但我如何處理每個部門的剩餘部分和商?

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

+0

我建議你使用迭代減法,這應該很容易實現,你甚至可以以正確的順序數字;) – Jester

+0

[DIV](http://www.felixcloutier.com/x86/DIV .html)已經將edx:eax除以源操作數,做64b/32b => 32b除法。問題在於,如果商不符合eax,它會出現分割錯誤(與零除相同)。在Linux上這會觸發一個SIGFPE。如果你只需要rcgldr的答案,如果商可能需要64位。 –

回答

2

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

請注意,一旦EDI <= 9,您可以切換到輔助「每個數字一個分位」循環。 – Brendan

+0

謝謝你們,我明白了! – antipistachio

相關問題