2

这条线对我来说不是很清楚(我对大会很陌生):

movsbl 0xffffffff(%edx,%ebx,1),%eax

我理解mov,但movsbl对我来说是新的。在一个使用foo而不是0xffffffff(%edx,%ebx,1)我理解的更简单的示例中(完全不确定这是正确的,只是搜索了一个相关主题):

eax = foo&0x800000ff;

我从来没有一行汇编引用-1(0xffffffff),输入的信息%eax究竟来自哪里?是否存储在:

[%edx + %ebx -1]
4

2 回答 2

6
movsbl <%x, %y, 1>, %z

说,从第一个操作数 (x) 寻址的内存位置读取一个字节,将该字节扩展为 32 位,并将结果存储在寄存器 (z) 中。

<%x, %y, 1>是x和y的值相加形成的内存地址;1 是应用于 y 的乘数。

于 2013-02-19T05:23:40.007 回答
1

如果你用 C 语言编写它,该行将类似于:

#include <stdlib.h>

int loadByte(char *base, size_t index)
{
    return (int)base[index - 1];
}

编译它(在 UN*X 上,对于 64 位 x86)会产生以下目标代码:

部分.text的反汇编:

0000000000000000 :
   0: 0f 为 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 位的),但其他含义是相同的。

于 2013-02-19T09:49:30.573 回答