我正在阅读指令
imul 0xffffffd4(%ebp, %ebx, 4), %eax
我对它正在做的事情感到困惑。我明白imul会增加,但我无法弄清楚语法。
答案 0 :(得分:10)
(我知道并且更喜欢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位寄存器)。
答案 1 :(得分:7)
Hooray for AT& T汇编基础/索引语法!它根本不是一个3操作数。这是你熟悉和喜爱的2操作数,只是第一个操作数有点复杂。这意味着:
%ebp + (4 * %ebx) + 0xffffffd4
或者:
%ebp + (4 * %ebx) - 44
要更清楚一点(在基数10)。 AT& T基本/索引语法分解为:
offset(base, index, multiplier)