【发布时间】:2020-05-12 17:32:28
【问题描述】:
这里是数字
a = 234234
b = 2394729
c = 12323
a*b*c = 6912302836717278
但我得到了这个结果:3945371358。
我想我必须使用 LONG,因为它超过了 int 的限制,但我不知道如何,因为在 x86 汇编中没有 long,我必须改变什么?在此先感谢
%include "io.inc"
section .bss
a resd 1
b resd 1
c resd 1
section .text
global CMAIN
CMAIN:
mov ebp, esp; for correct debugging
xor eax,eax
GET_UDEC 4,a
GET_UDEC 4,b
GET_UDEC 4,c
mov eax,dword[a]
mov ebx,dword[b]
imul ebx
mov ecx,dword[c]
imul ecx
PRINT_UDEC 4, eax
xor eax, eax
ret
【问题讨论】:
-
"我正在使用 imul,因为它们必须是无符号的" 你反过来说,MUL 是无符号乘法,IMUL 是有符号乘法。
-
您只打印结果的低位 dword(来自 EAX)。此外,第二次乘法仅读取第一次的 32 位结果。加宽乘法(一个操作数
mul或imul)会做EDX:EAX = EAX * src。如果第一个乘法没有溢出,那么您可以使用mul两次。请参阅手册:felixcloutier.com/x86/mul。但是如果c很小,所以a*b会溢出32 位,而a*b*c适合64 位,那就是个问题。 -
您可以对最后一个值进行排序并保留最大值,或者使用多个
mul和add指令进行完整的 64x64 => 64 乘法运算。查看编译器输出。
标签: assembly x86 int multiplication sasm