前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >X86 Assemble指令--LEA

X86 Assemble指令--LEA

作者头像
None_Ling
发布2018-10-24 14:37:39
1.7K0
发布2018-10-24 14:37:39
举报
文章被收录于专栏:Android相关Android相关

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需要三条指令
代码语言:javascript
复制
ADD EAX,1;
ADD EAX,2;
ADD EAX,EBX;

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

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

假如现在有一条语句为:

代码语言:javascript
复制
int y=points[i].ycoord

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

代码语言:javascript
复制
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中有指针这一说,例如:

代码语言:javascript
复制
int *p = &points[i].ycoord;

这时候就需要LEA指令了。

代码语言:javascript
复制
LEA ESI, [EBX+8*EAX+4]

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

参考资料

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LEA指令描述
  • LEA指令
  • 作用
  • 实例
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档