【问题标题】:Two different results of multiplication两种不同的乘法结果
【发布时间】:2021-07-28 17:46:08
【问题描述】:

结果差异的原因是什么:

mov  eax, 0
mov  al,  2
mov  ah,  4
mul  ah;  eax == 0x08

和:

mov  eax, 0
mov  al,  2
mov  ah,  4
mul  al;  eax == 0x10

【问题讨论】:

  • 最后一条指令使用不同的寄存器。
  • imulmul 指令的单操作数形式隐式乘以给定大小的 A 寄存器,raxeaxaxal。当您将ah 指定为显式操作数时,隐式操作数为alal 寄存器是一个不同的寄存器,但也是字节大小的。所以mul al 将显式al 乘以隐式操作数al
  • 您最后的评论是错误的。 al 等于 2 导致 ax 等于 4,而不是 10 小时。
  • @ScottHunter 这很明显。
  • @ecm 这是我得到的结果。

标签: assembly x86 nasm


【解决方案1】:

对于 8 位寄存器 mul,隐含的第二个操作数是 al。在伪代码中:

mul ah 表示ax = ah * al

mul al 表示ax = al * al

x86 程序集经常使用隐含操作数,因此最好阅读指令参考以了解它们。

【讨论】:

  • 抱歉,我的问题中没有足够的信息。我知道这部分。正确的问题是:为什么al * al 不起作用?我熟悉 C 编程,其中 a *= a 之类的东西可以正常工作。
  • 我不确定是什么导致了您的结果,但超出了 mul 应该做的规范,当我实际运行您的代码时,第一个设置 ax0x0008 和第二组 ax0x0004
  • 不管寄存器的内容如何。使用mul al 不正确吗?如果是这样,为什么?
  • mul al 完全有效。如果你没有得到预期的结果 4 (al * al) 我不知道如何解释。
猜你喜欢
  • 1970-01-01
  • 2019-08-23
  • 2019-12-19
  • 2022-08-03
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
相关资源
最近更新 更多