【问题标题】:MUL operation in assembly装配中的 MUL 操作
【发布时间】:2018-07-25 11:24:12
【问题描述】:

我有以下装配线:

...
MOV ECX, 0x36EE80
MOV EDX, 0x95217CB1
MUL EDX
SHR EDX, 0x15
MOV DWORD PTR SS:[EBP-0x3C8], EDX
....
....

所以,在http://en.wikibooks.org/wiki/X86_Assembly/Arithmetic 中,我读到 MUL 的操作数(在这种情况下是 EDX)的值与 EAX 中的值相乘。因此,在 EAX 中,我的值为 0330FD3B(十进制:53542203)。在 EDX 中,我的值为 95217CB1(十进制:2501999793)。 但是在 MUL 操作之后,我在 EDX 中有值 01DBEE41(十进制:31190593)。但这一定是错误的,因为 53542203 * 2501999793 不是 31190593...

有人可以解释一下吗?

【问题讨论】:

  • 如果这是专门关于 x86 程序集的,你应该这样标记它。
  • 当您将 EDX 乘以 EAX 时,结果为 EDX:EAX0330FD3B * 95217CB11DBEE41EB22A9CB 所以 EDX 将是 1DBEE41 而 EAX 将是 EB22A9CB 形成整个答案。
  • 仔细阅读您发布的链接,OP :)
  • 看起来这可能是除以一个常数,因为它是如何正确移动结果的高半部分。 Why does GCC use multiplication by a strange number in implementing integer division?

标签: assembly x86


【解决方案1】:

The description 对于MUL r/m32Unsigned multiply (EDX:EAX <- EAX * r/m32).

这意味着 64 位 乘积将存储在 EDX:EAX 中,即高 32 位最终存储在 EDX 中,低 32 位存储在 EAX 中。这符合您看到的结果,因为产品应该是 0x1DBEE41EB22A9CB。

【讨论】:

    【解决方案2】:

    结果是01DBEE41 EB22A9CB,EDX 存储其中的大部分。
    处理数字的二进制表示时,十进制数字不可连接。

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2021-11-08
      相关资源
      最近更新 更多