【问题标题】:multiplying 3 numbers in assembly x86在汇编 x86 中乘以 3 个数字
【发布时间】: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 位结果。加宽乘法(一个操作数mulimul)会做EDX:EAX = EAX * src。如果第一个乘法没有溢出,那么您可以使用 mul 两次。请参阅手册:felixcloutier.com/x86/mul。但是如果c 很小,所以a*b 会溢出32 位,而a*b*c 适合64 位,那就是个问题。
  • 您可以对最后一个值进行排序并保留最大值,或者使用多个 muladd 指令进行完整的 64x64 => 64 乘法运算。查看编译器输出。

标签: assembly x86 int multiplication sasm


【解决方案1】:

确实,将您的示例中的两个最小值相乘会得到一个 32 位的数字,但仅此而已。你不能假设情况总是如此。所以你有两个选择:

  • 使用教科书乘法手动实现 64x64 位乘法;
  • 构建 64 位应用程序。然后您可以使用 64 位 rax 等代替 32 位 eax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2021-02-11
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多