我在阅读说明书
imul 0xffffffd4(%ebp, %ebx, 4), %eax
我不知道它到底在做什么我知道imul乘法,但我不知道语法。
imul
yqyhoc1h1#
(我知道并且更喜欢Intel/MASM语法,所以我将使用它。注意,操作数的顺序在AT & T中是颠倒的。)您的指令实际上是一个双操作数imul,在Intel语法中为:
imul eax, DWORD PTR [ebp + ebx*4 + 0FFFFFFD4h]
其中eax是目标操作数,内存位置是源操作数。双操作数imul执行源操作数和目标操作数的乘法,并将结果存储在目标中。与1操作数不同的是,它不会在任何地方写入高半部分,因此相同的指令适用于有符号和无符号,就像add和左移位一样。此指令是将寄存器乘以数组中的整数。这很可能出现在循环中,数组是一个局部变量(在堆栈上从ebp-44开始)。三操作数imul指令是:
eax
add
ebp-44
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
source1
immediate
dest
zzoitvuj2#
AT&T汇编库/索引语法万岁!它根本不是3操作数乘法。这是你熟悉和喜欢的2操作数,只是第一个有点复杂。意思是:
%ebp + (4 * %ebx) + 0xffffffd4
或者:
%ebp + (4 * %ebx) - 44
更清楚一点(以10为基数)。AT&T的base/index语法如下:
offset(base, index, multiplier)
2条答案
按热度按时间yqyhoc1h1#
(我知道并且更喜欢Intel/MASM语法,所以我将使用它。注意,操作数的顺序在AT & T中是颠倒的。)
您的指令实际上是一个双操作数
imul
,在Intel语法中为:其中
eax
是目标操作数,内存位置是源操作数。双操作数imul
执行源操作数和目标操作数的乘法,并将结果存储在目标中。与1操作数不同的是,它不会在任何地方写入高半部分,因此相同的指令适用于有符号和无符号,就像add
和左移位一样。此指令是将寄存器乘以数组中的整数。这很可能出现在循环中,数组是一个局部变量(在堆栈上从
ebp-44
开始)。三操作数
imul
指令是:source1
操作数(内存位置或寄存器)乘以immediate
操作数(8位或16/32位常数),结果存储在dest
操作数(16、32或64位寄存器)中。请参阅英特尔的
imul
手册条目:https://www.felixcloutier.com/x86/imulzzoitvuj2#
AT&T汇编库/索引语法万岁!它根本不是3操作数乘法。这是你熟悉和喜欢的2操作数,只是第一个有点复杂。意思是:
或者:
更清楚一点(以10为基数)。AT&T的base/index语法如下: