X86 Assemble指令--LEA

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿份到

LeakCanary源码浅析

在Android开发中最让人们头疼的就是内存泄漏了,今天来介绍一个查看内存是否泄漏的工具LeakCanary,并通过研究源码明白它是如何分析和查找存在泄漏信息的...

36250
来自专栏小灰灰

JDK容器学习之Queue: ArrayBlockingQueue

基于数组阻塞队列 ArrayBlockingQueue 前面学习了基于数组的非阻塞双端队列ArrayDeque,其内部维护一个数组和指向队列头和队列尾索引的两...

24560
来自专栏技术博客

Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)

阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.h...

10430
来自专栏杂烩

大话HelloWord是如何出现在面前的-浅谈虚拟机运行流程

    初学Java,大都会用记事本写个Hello Word,然后用CMD编译出class文件,最后执行一下。当控制台输出Hello Word的时候,一个简单的...

16920
来自专栏偏前端工程师的驿站

前端魔法堂——调用栈,异常实例中的宝藏

15230
来自专栏c#开发者

BizTalk Orchestration execute Flat file disassembler ReceivePipeline

需求是这样,在一个inbound XML中有个一点节点使用平文件的方式存放,还要解析比如固定长度或根据特殊字符截取字段 也就是需要在流程里面先把输入的XML的节...

378130
来自专栏刘望舒

手动实现Android热修复

周一发布了新版本,当天晚上用户就为app未测试到的bug发飙了,恩,很快就找到了问题所在,一个容易疏忽的空指针。虽然只是一个小小的bug但是不修复是很影响用户体...

22250
来自专栏吴伟祥

手写tomcat监控工具---宕机重启 原

33930
来自专栏转载gongluck的CSDN博客

UNPv13:#第3章#套接字编程简介

IPv4套接字地址结构 POSIX规范只要求3个字段:sin_family、sin_addr和sin_port。 #include <netinet/in.h>...

34750
来自专栏Danny的专栏

探秘BOF 和EOF

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

12530

扫码关注云+社区

领取腾讯云代金券