我需要在汇编中打印64位整数,但我正在使用32位机器,因此我将64位整数存储在两个32位寄存器中。整数的高位部分存储在%edx中,低部分存储在%eax中。
我知道如何打印32位整数没问题,只需连续除以10并打印余数。
我也知道如何将我的64位数乘以32位。
但是杀死我的是分裂:
从我收集到的内容来看,我认为我必须将每个寄存器%edx和%eax除以10,并以某种方式将两个答案组合起来,就像我用乘法一样,但是我如何处理余数和商数每个部门?
我正在使用32位Linux机器上使用AT& T x86语法的GNU汇编程序。 谢谢
答案 0 :(得分:3)
这个问题最近出现了好几次。该算法类似于使用铅笔和纸进行划分,将多位数的红利除以单位数除数。这是一个代码片段,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