【问题标题】:How to add and multiply double words in assembly language [duplicate]如何在汇编语言中添加和乘以双字[重复]
【发布时间】:2016-12-15 21:06:26
【问题描述】:

我有一个令人难以置信的项目,它一直困扰着我。我需要编写一个程序来从输入中获取 2 个数字,将它们相加或相乘。这个程序应该也能得到双字。

我知道如何从输入中获取数字,如果它们的大小最大为一个单词,如何相加或相乘,但我无法解决这个双字问题。

有人有密码吗?

提前谢谢.....

【问题讨论】:

  • 是否允许使用像 EAX 这样的 32 位寄存器?是否允许使用 RAX 之类的 64 位寄存器?
  • 带进位添加。去谷歌上查询。在您的搜索中包含目标架构,这样您就可以获得您感兴趣的任何机器的结果。

标签: assembly


【解决方案1】:

我将假设分配目标是让您使用两倍于寄存器大小的数字,例如 16 位模式下的 32 位数字,或 32 位模式下的 64 位数字。可以像长手乘法一样进行乘法运算。我假设您可以使用乘法指令,其中乘积是被乘数或乘数大小的两倍。此示例显示了数字的“单词”之间的空格:

            aaaa bbbb        ;multiplicand
x           cccc dddd        ;multiplier
---------------------
            eeee eeee        ;bbbb x dddd
       ffff ffff             ;aaaa x dddd
       gggg gggg             ;bbbb x cccc
+ hhhh hhhh                  ;aaaa x cccc
---------------------
  pppp pppp pppp pppp        ;product

【讨论】:

    【解决方案2】:

    在 x86 中:

    MOV EBX,OP1
    MOV EAX,OP2
    IMUL EBX
    

    结果在 EDX:EAX(32 位寄存器)中 高位 32 位存储在 EDX 寄存器中,低位 32 位存储在 EAX 寄存器中。

    如果您需要更多解释,此链接应该会有所帮助: https://www.tutorialspoint.com/assembly_programming/assembly_arithmetic_instructions.htm

    【讨论】:

    • 加宽乘法是用于在 32 位 x86 上创建 64 位 * 64 位乘法的构建块,但您需要其中 3 个才能获得 64 位结果。 (其中 4 个获得完整的 128b 结果)。我认为 OP 是在询问使用两倍于寄存器的操作数,而不仅仅是如何在 x86 中乘以 DWORD。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多