请验证AT& T装配线的含义

时间:2013-02-19 05:17:38

标签: assembly x86 att

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

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

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

eax = foo&0x800000ff;

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

[%edx + %ebx -1]

2 个答案:

答案 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表示移动(加载)一个字节,符号将其扩展为... (因此有movsbwmovsblmovsbq转换为word / short,long / int和quad / long long)。

您的程序集是32位(因为用于寻址的寄存器是32位),但其他含义是相同的。