我正在阅读说明
imul 0xffffffd4(%ebp, %ebx, 4), %eax
我对它到底在做什么感到困惑。我知道 imul 会成倍增加,但我无法弄清楚语法。
我正在阅读说明
imul 0xffffffd4(%ebp, %ebx, 4), %eax
我对它到底在做什么感到困惑。我知道 imul 会成倍增加,但我无法弄清楚语法。
(我知道并且更喜欢 Intel/MASM 语法,所以我会使用它。请注意,操作数的顺序与 AT&T 不同。)
您的指令实际上是一个双操作数imul
,在英特尔语法中是:
imul eax, DWORD PTR [ebp + ebx*4 + 0FFFFFFD4h]
目标操作数在哪里eax
,内存位置是源操作数。二操作数imul
执行源操作数和目标操作数的有符号(二进制补码)乘法,并将结果存储在目标中。
该指令将寄存器乘以数组中的整数。这很可能出现在循环中,并且数组是局部变量。
三操作数imul
指令是:
imul dest, source1, source2
操作数(source1
内存位置或寄存器)乘以source2
操作数(8 位或 16/32 位整数),结果存储在dest
操作数(16、32 或 64 位寄存器)中。
AT&T 汇编基础/索引语法万岁!它根本不是 3 操作数乘法。它与您熟悉和喜爱的 2 操作数相同,只是第一个操作数有点复杂。它的意思是:
%ebp + (4 * %ebx) + 0xffffffd4
或者:
%ebp + (4 * %ebx) - 44
更清楚一点(并且以 10 为基数)。AT&T 基本/索引语法分解为:
offset(base, index, multiplier)