【问题标题】:imul assembly instruction - one operand?imul 汇编指令 - 一个操作数?
【发布时间】:2011-04-18 15:20:58
【问题描述】:

我正在使用运行时调试器。

EAX: 0000 0023 EDX:5555 5556

imul edx

EAX:aaaa aac2 EDX:0000 000b

我完全糊涂了,不知道这个乘法是如何工作的。这里发生了什么事?我在类似的 question here 中注意到 imul ebx ; result in EDX:EAX 虽然我不理解 EDX:EAX 符号:/

【问题讨论】:

    标签: assembly x86 multiplication


    【解决方案1】:

    imul 的单操作数形式传递一个32 位参数时,它实际上意味着EAX * src 其中EAX 和源操作数都是32 位寄存器或内存。

    两个 32 位值的乘积不一定适合 32 位:完整的乘法结果最多可占用 64 位。答案的高 32 位将写入EDX 寄存器,低 32 位将写入EAX 寄存器;这用EDX:EAX 表示法表示。

    在您使用imul edx 的情况下,您会得到EDX:EAX = EAX * EDX。显式源操作数可以是隐式操作数之一,甚至 EAX 可以平方成 EDX:EAX


    如果只想要结果的低 32 位,请使用 imul 的 2 操作数形式;它运行得更快并且没有任何隐式操作数(因此您可以使用最方便的任何寄存器)。

    imul ecx, esi 会像您期望的那样执行ecx *= esi,而无需触及EAXEDX。就像在 C 中,unsigned x=...; x *= y; 的结果宽度与输入的宽度相同。

    imul 也有一个直接形式:imul ecx, ebx, 1234ecx = ebx * 1234。许多汇编程序会接受imul ecx, 1234 作为imul ecx, ecx, 1234 的简写。


    这些 32x32 => 32 位形式的 imul 可以正确用于有符号或无符号;单操作数 mulimul 的结果仅在上半部分(在 EDX 中)不同,而不是在下半部分 EAX 输出。

    Intel's instruction reference manual entry for imul

    【讨论】:

    • 当给imul的寄存器是eax时会发生什么?它仍然做同样的事情吗?如果你给它的不是eaxedx,比如eax 会怎样?
    • imul 指令有多种形式。采用单个 32 位参数(内存或寄存器)的形式始终以 EDX:EAX 对返回结果。
    猜你喜欢
    • 2011-04-21
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多