代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

“leal 0x10”(%ebx),%eax”x86汇编指令中的0x10是什么?

  •  32
  • Tony The Lion  · 技术社区  · 14 年前

    leal 0x10(%ebx), %eax
    

    有人能澄清一下吗?这是Linux机器上的x86汇编程序。

    4 回复  |  直到 9 年前
        1
  •  71
  •   Nils Pipenbrinck    14 年前

    leal,或者lea全名是“Load effective address”,它确实做到了这一点:它进行地址计算。

    在您的示例中,地址计算非常简单,因为它只是将偏移量添加到ebx并将结果存储到eax中:

    eax=ebx+0x10

    莉亚能做的更多。它可以添加寄存器,用常数2、4和8乘寄存器,用于字、整数和双精度数的地址计算。它还可以添加偏移量。

        2
  •  4
  •   Community Keith    7 年前

    lea 代表“加载有效地址”;这是一种使用IA32指令集的高级寻址模式进行算术运算的方法。这个 l 后缀是一种在GNU-as语法中区分指令操作数大小的方法,您可以在Linux上找到它。

    所以,简而言之,是的,这是一种加法指令。它还可以同时处理2,4或8的乘法运算。

    另见 this related question (如果他们使用Intel语法讨论同一条指令):

        3
  •  2
  •   Ciro Santilli OurBigBook.com    8 年前

    GNU as 2.18文件

    https://sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html

    英特尔的语法是不言而喻的。

    更重要的是,这些文件还解释了一般情况:

    Intel语法形式的间接内存引用

     section:[base + index*scale + disp]
    

    转换为AT&T语法

     section:disp(base, index, scale)
    

    其中base和index是可选的32位基址和索引寄存器,disp是可选的位移,scale取值1、2、4和8,乘以index来计算操作数的地址

    当我们省略了地址的某些部分时,AT&T的情况确实有点混乱。 -4(%ebp) ,但是通过文档中的示例,我们可以很容易地推断出所有的语法情况。

    为了真正了解发生了什么,我建议您看看指令是如何编码的。这是一个很好的教程: http://www.c-jump.com/CIS77/CPU/x86/lecture.html 当你看到这一点时,就会明白为什么地址的某些部分会被省略,以及每个表单将被编译成什么。

        4
  •  0
  •   Kelvin Spencer    9 年前

    作为刷新程序,IA32汇编程序中的addresing模式通常为:

    IO(Rb,Ri,s),其中:

    IO=立即偏移量

    Rb=基址寄存器

    Ri=索引寄存器

    s=比例因子{1,2,4,8}

    所以有效地址计算为 s公司

    皮革 看起来和其他指令类似,比如movl,但是有点特别。 它不是从源读取到目标,而是复制有效的 源到目标的地址。

    所以它可以用来为以后的内存引用生成指针,而且

    例如:

    让寄存器%edx包含x值

    1%(%edx、%edx、8),%eax

    将1+x+8*x=1+9x的有效地址加载到寄存器%eax。

    皮革 来源 目的地 => = 地址

    如果您熟悉C,它相当于:

    字符*b=&a;

    其中char a的地址被分配给char指针b

    让寄存器%eax保持值x,寄存器%ecx保持值y

    皮革 (%eax、%ecx、4),%edx将值x+4y分配给寄存器%edx

    0xB(,%ecx,5),%edx将把值0xB+5y=11+5y赋给%edx

    皮革 (%eax、%eax、2),%eax将值3x分配给寄存器%eax

    希望这有帮助

    推荐文章