[英]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.