这条线对我来说不是很清楚(我对大会很新):
movsbl 0xffffffff(%edx,%ebx,1),%eax
我理解mov
,但movsbl
对我来说是新的。在一个使用foo
而不是0xffffffff(%edx,%ebx,1)
的简单示例中,我理解为此(完全不确定这是正确的,只搜索了相关主题):
eax = foo&0x800000ff;
我从未有过一行汇编引用-1(0xffffffff
),来自%eax
的信息究竟来自哪里?是否存储在:
[%edx + %ebx -1]
答案 0 :(得分:6)
movsbl <%x, %y, 1>, %z
表示从第一个操作数(x)寻址的存储单元读取一个字节,将字节扩展为32位,并将结果存储在寄存器(z)中。
&lt;%x,%y,1&gt;是通过将x和y的值相加而形成的存储器地址; 1是应用于y的乘数。
答案 1 :(得分:0)
如果你用C语言写,那么该行将类似于:
#include <stdlib.h>
int loadByte(char *base, size_t index)
{
return (int)base[index - 1];
}
编译它(在UN * X上,对于64位x86)会产生以下对象代码:
Disassembly of section .text: 0000000000000000 : 0: 0f be 44 37 ff movsbl 0xffffffffffffffff(%rdi,%rsi,1),%eax 5: c3 retq
如前所述,movsb
表示移动(加载)一个字节,符号将其扩展为... (因此有movsbw
,movsbl
和movsbq
转换为word / short
,long / int
和quad / long long
)。
您的程序集是32位(因为用于寻址的寄存器是32位),但其他含义是相同的。