【问题标题】:X86 assembly mul error masmX86 汇编 mul 错误 masm
【发布时间】:2016-01-02 20:16:11
【问题描述】:

一个简单的问题,为什么这不起作用:

    mov ebx,m[edx*4]
    mov eax,conv[edx*4]
    mul ebx

我检查了m[edx*4] 它有 2 个(应该在那里)与 conv[edx*4] 相同。

基本上只是一个2*3

mconvdd 2500 dup(?)

【问题讨论】:

  • 您知道 EDX 将被此乘法指令mul ebx? 覆盖
  • @Michael Petch,嗯,不,为什么?编辑..等待即使 EDX 不用于存储结果,它仍然被覆盖?
  • 参见mul 指令:x86.renejeschke.de/html/file_module_x86_id_210.html 32 位无符号整数 * 32 位无符号整数将被放入 EDX 的 64 位值中EAX 寄存器。 EDX 将具有结果的高 32 位,EAX 将具有结果的低 32 位。
  • 使用 EBX(而不是 EDX)作为数组索引,使用 EDX(而不是 EBX)来保存正确的操作数更有意义。因为后者被 MUL 覆盖是没有问题的。明智地选择您的寄存器。
  • 如果您需要 32 位乘法,请使用两个操作数 IMUL r32, r/m32 指令。

标签: assembly x86 masm


【解决方案1】:

我尝试遵循: 检查内存位置 m 和 conv 的 32 位值是什么 启动 mov ebx,m[edx*4] 时 edx 的值是多少 检查 ebx 和 eax 中的预期值是否正确 Edx 将被覆盖,因为 MUL 和 IMUL 指令将结果存储在 EDX 和 EAX 中 https://en.wikipedia.org/wiki/X86_instruction_listings

MUL 用于无符号乘法,IMUL 用于有符号乘法。这意味着,与 Jester 所说的相反:对于 32 位操作数,您使用 MUL(无符号),对于带符号的 31 位,第 32 位您使用 IMUL。

如果一切正常,如果 m[edx*4] = 2 和 conv[edx*4] = 3(反之亦然),你应该在 edx = 0 和 eax = 6 请注意,conv 和 m 是 32 位,最低有效字节位于最低内存位置。

如果我错了,请纠正我。

【讨论】:

    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多