Row*_*awn 5 x86 assembly instruction-set opcode
我正在读指令
imul 0xffffffd4(%ebp, %ebx, 4), %eax
Run Code Online (Sandbox Code Playgroud)
而且我对它正在做的事情感到困惑.我明白imul会增加,但我无法弄清楚语法.
Zoo*_*oba 11
(我知道并且更喜欢Intel/MASM语法,所以我将使用它.请注意,操作数的顺序与AT&T不同.)
您的指令实际上是一个双操作数imul,在Intel语法中是:
imul eax, DWORD PTR [ebp + ebx*4 + 0FFFFFFD4h]
Run Code Online (Sandbox Code Playgroud)
eax目标操作数在哪里,内存位置是源操作数.双操作数imul执行源操作数和目标操作数的有符号(二进制补码)乘法,并将结果存储在目标中.
该指令将寄存器乘以数组中的整数.很可能这出现在循环中,数组是局部变量.
三操作数imul指令是:
imul dest, source1, source2
Run Code Online (Sandbox Code Playgroud)
的source1操作数(或者存储器位置或寄存器)通过乘以source2操作数(可能是8位或16位/ 32位整数),并且结果被存储在dest操作数(16,32或64位寄存器).
Hooray for AT&T汇编基础/索引语法!它根本不是一个3操作数.这是你熟悉和喜爱的2操作数,只是第一个操作数有点复杂.它的意思是:
%ebp + (4 * %ebx) + 0xffffffd4
Run Code Online (Sandbox Code Playgroud)
要么:
%ebp + (4 * %ebx) - 44
Run Code Online (Sandbox Code Playgroud)
要更清楚一点(在基数10).AT&T基本/索引语法分解为:
offset(base, index, multiplier)
Run Code Online (Sandbox Code Playgroud)