assembly - 3 操作数 imul 指令在 ia-32 汇编中到底起什么作用?

标签 assembly x86 instruction-set instructions opcode

我正在阅读说明

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

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

最佳答案

(我知道并且更喜欢 Intel/MASM 语法,因此我将使用它。请注意,操作数的顺序在 AT&T 中是相反的。)

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

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

其中eax是目标操作数,内存位置是源操作数。双操作数 imul 执行源操作数和目标操作数的乘法,并将结果存储在目标中。与 1 操作数不同,它不会在任何地方写入高半部分,因此相同的指令适用于有符号和无符号,例如 add 和左移。

该指令将寄存器乘以数组中的整数。这很可能出现在循环中,并且数组是局部变量(在从 ebp-44 开始的堆栈上)。

<小时/>

三操作数imul指令是:

imul dest, source1, immediate
imul reg,  r/m,   imm           ; showing what kind of operand is allowed

source1 操作数(内存位置或寄存器)乘以立即数 操作数(8 位或 16/32 位常量),然后结果存储在 dest 操作数(16、32 或 64 位寄存器)中。

请参阅 Intel 的 imul 手册条目:https://www.felixcloutier.com/x86/imul

关于assembly - 3 操作数 imul 指令在 ia-32 汇编中到底起什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3860017/

相关文章:

gcc - 使用 GCC(内联汇编程序)将双倍加载到 FPU

x86 - Intel芯片组-GPIO编程

c++ - VM解释器-权衡性能的优点和缺点:较大的指令集/调度循环

c - 优化简单的模具操作,将变量保存在寄存器中

x86 - 如何为我的独立可启动代码启用 SSE?

mips - 零寄存器如何提高性能?

c - 如何从汇编调用 C 函数

assembly - ARM反汇编程序输出: When there are two arguments instead of three

c - 尝试从汇编程序(64 位)的 glibc 调用 C 函数

performance - 至强 CPU (E5-2603) 后向内存预取