我有一个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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句