【问题标题】:x86 assembly - MASM32 - multiplying 3 numbersx86 程序集 - MASM32 - 乘以 3 个数字
【发布时间】:2012-07-15 00:10:23
【问题描述】:

我有一个将 3 个数字相乘的程序,我正在努力理解。我有一些问题,我希望有人能解释这个程序发生了什么,并告诉我我是否走在正确的轨道上。我知道我有不止一个问题,所以我很抱歉。

.data?
  num1 dd ?
  num2 dd ?
  num3 dd ?

.data
sum dd 0
prod dd 0

.code

start:



main proc


mov EAX, sval(input("Enter a number: "))
mov num1, EAX
mov EAX, sval(input("Enter a number: "))
mov num2, EAX
mov EAX, sval(input("Enter a number: "))
mov num3, EAX





mov EAX, num1
mov EBX, num2
mul BL                 

mov EBX, num3
mul BX              

mov prod, EDX

这让我很困惑......

mov EBX, num3
mul BX

所以,我们将 num3 存储到 BL 中? 但由于 num1 和 num2 的结果是 16 位并存储到 AX 我们 mul BX?而不是BL?但是BL中不是num3吗?

对不起,没有一个具体的问题。如果我的逻辑不正确或接近,您能否逐条解释发生了什么以及为什么?

谢谢

【问题讨论】:

  • 这段代码绝对不是“乘以 3 个数字”,它做了一些奇怪和令人困惑的事情。为什么不使用IMUL
  • 即使在最坏的情况下乘以 255,它也确实有效
  • 所以实际上是“输入一个介于0和255之间的数字”?否则,它就无法正常工作。
  • 如果您添加 0 - 255 之间的任何数字,它都可以工作。

标签: assembly masm32


【解决方案1】:

当你做一个像mul bl这样的8位乘法时,它需要al,乘以指定的输入,然后把结果放在ax中。

当您进行像mul bx 这样的 16 位乘法时,它需要 ax,将其乘以指定的输入,然后将结果放入 dx:ax(即结果的 16 个最高有效位放入 @ 987654327@,以及ax 中结果的 16 个最低有效位)。

(仅出于完整性考虑):如果您执行像 mul ebx 这样的 32 位乘法运算,它会将 eax 乘以 ebx,然后将结果放入 edx:eax 中(顺便说一下,我不太记得了,但我猜 64 位乘法的工作方式大致相同)。

BLBX 而言(或AL/AH/AX 等),你所拥有的并不是真正独立的寄存器——AL 真的是AX 的 8 个最低有效位。 AH 是 AX 的 8 个最高有效位。 BL 是 BX 的 8 个最低有效位,BH 是 BX 的 8 个最高有效位(CL/CH/DL/DH 以此类推)。

例如,如果你执行如下代码:

xor bx, bx
mov bl, 1

BH 将等于 0(由 xor bx, bx 设置为零),BL 将等于 1(由 mov 设置)并且 bx 也将等于 1(因为它现在包含位模式 00000000 00000001)。

【讨论】:

  • 如果我再添加一个数字会是 32 位乘法吗?如果是这样,那么结果将在 edx:eax?然后我会将 eax 转换为 edx 吗?
  • 是的,64 位也是一样。 rdx:rax
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多