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

lkaoscv7  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(121)

我在阅读说明书

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

我不知道它到底在做什么我知道imul乘法,但我不知道语法。

yqyhoc1h

yqyhoc1h1#

(我知道并且更喜欢Intel/MASM语法,所以我将使用它。注意,操作数的顺序在AT & T中是颠倒的。)
您的指令实际上是一个双操作数imul,在Intel语法中为:

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操作数(内存位置或寄存器)乘以immediate操作数(8位或16/32位常数),结果存储在dest操作数(16、32或64位寄存器)中。
请参阅英特尔的imul手册条目:https://www.felixcloutier.com/x86/imul

zzoitvuj

zzoitvuj2#

AT&T汇编库/索引语法万岁!它根本不是3操作数乘法。这是你熟悉和喜欢的2操作数,只是第一个有点复杂。意思是:

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

或者:

%ebp + (4 * %ebx) - 44

更清楚一点(以10为基数)。AT&T的base/index语法如下:

offset(base, index, multiplier)

相关问题