美文网首页
X86 Assemble指令--LEA

X86 Assemble指令--LEA

作者: None_Ling | 来源:发表于2018-09-04 12:04 被阅读43次

LEA指令描述

Opcode Mnemonic Description
8D /r LEA r16,m Store effective address for m in register r16
8D /r LEA r32,m Store effective address for m in register r32

LEA指令

LEA指令用来计算第二个操作数(源操作数)的有效地址,并且将该地址保存到第一个操作数(目的操作数)中。源操作数是CPU寻址模式中的内存寻址模式(支持偏移量)。而目标操作数是一个通用寄存器(GPR,general-purpose register)。这条指令被地址大小和操作数大小属性所影响,如上表所示。指令的操作数大小决定于使用的寄存器,而地址大小决定于代码段。

作用

LEA:Load Effective Address。加载有效地址。将源操作数的地址加载到目的寄存器中。注意:不是实际地址

如LEA EAX, [ EBX + ECX ],它相当于计算EBX和ECX的值,将这个值保存到EAX寄存器中。原因:由于EBX+ECX计算出来的值是该内存地址,而通过[EBX+ECX]得到的是内存地址保存的值,而LEA命令是加载该值的有效地址并且保存到目标寄存器中,也就是将EBX+ECX的值保存到EAX寄存器中
由于加载的是有效地址,而不是实际地址,所以EAX中保存的是EBX+ECX,而不是ds:EBX+ECX

实例

  1. 计算多个数据的运算
    一般要计算多个数据相加,例如,将1+2+EBX的值放入EAX寄存器中,ADD需要三条指令
ADD EAX,1;
ADD EAX,2;
ADD EAX,EBX;

而使用LEA的话,只需要一条指令

LEA EAX,[1+2+EBX];
  1. 计算地址指针
    例如现在有一个struct为Point,其中int占32位,4个byte。所以其中xcoord的偏移量为0,而ycoord的偏移量为4,整个struct大小为8byte。
struct Point
{
     int xcoord;
     int ycoord;
};

假如现在有一条语句为:

int y=points[i].ycoord

其中points是一个Point结构体的数组。而该数组的基址已经保存到了EBX寄存器中,而i的值保存在了EAX寄存器中。所以该条语句的汇编指令为:

MOV EDX [EBX+8*EAX+4];

由于数组基址在EBX寄存器中,并且每一个Point元素都占8个字节,而i保存在EAX寄存器中,所以EBX+8EAX得到的就是points[i]的基址,而ycoord的偏移量为4,所以EBX+8EAX+4得到的就是points[i].ycoord

y的值保存到了EDX寄存器中,并且EBX+8EAX+4的值为有效地址(effective address)。

而在C中有指针这一说,例如:

int *p = &points[i].ycoord;

这时候就需要LEA指令了。

LEA ESI, [EBX+8*EAX+4]

结果就将数组第i个数据结构的ycoord的地址保存在ESI寄存器中,也就是p中。

参考资料

What's the purpose of the LEA instruction?
Load Effective Address

相关文章

  • X86 Assemble指令--LEA

    LEA指令描述 LEA指令 LEA指令用来计算第二个操作数(源操作数)的有效地址,并且将该地址保存到第一个操作数(...

  • X86 Assemble指令--offset

    offset的作用 offset是一条伪指令,在编译的过程中,编译器会将该伪指令进行计算,并且替换成标号/变量的地...

  • X86 Assemble指令--ptr

    Assemble指令中标识大小 在Assemble中通常会看到WORD ptr或者DWORD ptr或者BYTE ...

  • X86 Assemble指令--MOVS指令簇

    介绍 MOVS系列的指令簇主要用来复制字符串(move string)。 作用 主要将DS:SI地址的数据复制到E...

  • X86 Assemble指令--REP指令前缀簇

    介绍 REP指令簇主要用来重复执行指令。REP前缀后加指令来协同完成。如: 描述 重复N次字符串指令,N的值存储在...

  • 汇编指令LEA

    LEA是微机8086/8088系列的一条指令,取自英语Load effect address——取有效地址,也就是...

  • 5.汇编中中括号[]作用以及lea和mov指令的区别

    现在总结一下:其中牵扯到lea指令,mov指令,[] 一.lea指令:对于寄存器来说:第二个操作数是寄存器必须要加...

  • 汇编基础知识六

    0x01 简介 这里开始熟悉汇编的指令格式 下图为X86版本的指令格式,X64的指令格式和X86差不多后面有需要的...

  • 汇编指令

    X86和X87汇编指令大全(有注释) ---------- 一、数据传输指令 ------------------...

  • 寻址相关

    相关链接:X86-64 架构指令解析 汇编中的指令详解 Intel AMD x64软件约定 x86/x64 指令编码内幕

网友评论

      本文标题:X86 Assemble指令--LEA

      本文链接:https://www.haomeiwen.com/subject/rhxgwftx.html