Assembly 将两个32位数字相乘并将64位结果打印为十进制NASM程序集

Assembly 将两个32位数字相乘并将64位结果打印为十进制NASM程序集,assembly,x86,nasm,Assembly,X86,Nasm,我在使用NASM汇编时遇到问题 我不知道如何将两个数字相乘并打印到屏幕上 问题是我们只允许使用只打印32位长度数字的函数;不是64位长度的数字 所以我的问题可能是数学,我想我需要用霍纳的方法来得到十进制数;就像我在下面指出的 如果我有 AF / A = 11 remaining 5 11 / A = 1 remaining 7 1 / A = 0 remaining 1 ->175哪个是正确的结果 但当我把它分成两个寄存器时,这里每个4字节只是一个例子 A | F A / A = 1

我在使用NASM汇编时遇到问题

我不知道如何将两个数字相乘并打印到屏幕上

问题是我们只允许使用只打印32位长度数字的函数;不是64位长度的数字

所以我的问题可能是数学,我想我需要用霍纳的方法来得到十进制数;就像我在下面指出的

如果我有

AF / A = 11 remaining 5 
11 / A = 1 remaining 7
1 / A = 0 remaining 1
->175哪个是正确的结果

但当我把它分成两个寄存器时,这里每个4字节只是一个例子

A | F    A / A = 1 remaining 0 and F / A = 1 remaining 5
         1 / A = 0 remaining 1
->哪一个是错的

这是我的汇编代码

mov eax, [Zahl1]
mul dword [Zahl2]
mov [High], edx


;---- low-----
mov ebx, 10
loopbegin:
;dividing by 10
xor edx, edx
div ebx

;counting
inc dword [counter]

;saving the number 
push edx
cmp eax, 0
jne loopbegin

mov ebx, 10
; --- high ----
mov eax, [High]
highloop:
xor edx, edx
div ebx

inc dword [counter]

push edx
cmp eax, 0
jne highloop

这里遵循从堆栈打印数字的循环

您不能只转换并分别打印两个半部分,因为高半部分的位代表整个64位数字中的
4294967296*hi

4294967296
不是10的幂,因此高半部的位会影响低小数位数。如果您是以2的幂为基数(如十六进制或八进制)打印,您的方法会起作用,因为按基数除法只是一个移位:即低十六进制数字仅由低4位决定。但低位十进制数字取决于所有64位二进制位


相反,您需要将64位除以10。这需要多条
div
指令,因为如果商溢出32位,则
div r32
(64b/32b=>32b)会出现故障有关扩展精度除法的工作代码,请参阅。(但不要对内存使用
xchg
,而是使用一些额外的寄存器)

div
在现代CPU上速度很慢,而
mul
在现代CPU上速度非常快;可能值得进行扩展精度乘法,以获得64b*64b=>128b乘法的高半部分,从而更快地除以10。)



此外,您不需要按下数字,也不需要内存中的计数器。只需为从缓冲区末尾开始的指针使用一个额外的寄存器。有关如何编写周围代码的信息,请参阅,使用两条
div
指令将内环中的32位除法替换为扩展精度。

这是所有的汇编代码吗?请你编辑一下,把所有的内容都包括进去。