【问题标题】:What exactly does the 3 operand imul instruction do in ia-32 assembly?ia-32 汇编中的 3 个操作数 imul 指令究竟做了什么?
【发布时间】:2011-04-21 01:48:15
【问题描述】:

我正在阅读说明

imul 0xffffffd4(%ebp, %ebx, 4), %eax

我对它到底在做什么感到困惑。我知道 imul 会相乘,但我无法弄清楚语法。

【问题讨论】:

    标签: assembly opcode instruction-set x86


    【解决方案1】:

    (我知道并且更喜欢 Intel/MASM 语法,所以我会使用它。请注意,操作数的顺序与 AT&T 不同。)

    您的指令实际上是一个双操作数imul,在 Intel 语法中是:

    imul eax, DWORD PTR [ebp + ebx*4 + 0FFFFFFD4h]
    

    其中eax 是目标操作数,内存位置是源操作数。二操作数imul 执行源操作数和目标操作数的有符号(二进制补码)乘法,并将结果存储在目标中。

    该指令将寄存器乘以数组中的整数。这很可能出现在循环中,并且数组是局部变量。


    三操作数imul指令为:

    imul dest, source1, source2
    

    source1 操作数(内存位置或寄存器)乘以 source2 操作数(8 位或 16/32 位整数),结果存储在 dest 操作数中(16、32 或 64 位寄存器)。

    【讨论】:

    • (我已经为通过标题搜索到这里的人回答了这两个问题。)
    【解决方案2】:

    AT&T 汇编基础/索引语法万岁!它根本不是 3 操作数乘法。它与您熟悉和喜爱的 2 操作数相同,只是第一个操作数有点复杂。意思是:

    %ebp + (4 * %ebx) + 0xffffffd4
    

    或者:

    %ebp + (4 * %ebx) - 44
    

    更清楚一点(并且以 10 为底)。 AT&T 基本/索引语法分解为:

    offset(base, index, multiplier)
    

    【讨论】:

    • +1,该指令将eax 中的值乘以(可能)本地数组中的一个整数。
    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 2020-04-28
    • 2012-07-10
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2016-09-10
    相关资源
    最近更新 更多