汇编语言lea指令的使用方法

首先说明汇编指令有Intel语法和at&t两种不同的语法,本文使用的是at&t语法。

如果采用at&t 汇编格式来讨论的话,lea指令的语法是这样的:

lea 源, 目的

源操作数必须是某个地址数值,指向某个内存地址处,目的操作数必须是某个通用寄存器

例子如下:

leaq     (%rdi,%rdi,8), %rax

假设% rdi的值为x, 上面这行会将%rax的值设置为”x+8*x”.

和这个指令看上去有些类似的是movq,如果换成movq的话会好理解一些:

movq     (%rdi,%rdi,8), %rax

就是计算%rdi+%rdi*8这个内存地址处的值,然后放到%rax寄存器中

leaq和movq的不同之处就在于源操作数处的括号的用法不一样了,leaq不再获取括号里面的值所指向的内存里存储的数值,而是直接使用括号里面的值,把它赋给目的操作数。

在汇编指令(lea source, destination)中,位于源操作数位置的source,其实表示*(source),也就是计算source地址处的值,那么lea指令相当于c语言中的&,那么这条汇编指令就相当于&(*(source)),也就是获得source地址,并放到destination寄存器中

在Stack Overflow上看到一个解释的很清楚的回答:

4c7523b4fa2344b4b39940cad0ad423d.png

c59b608db2794e7ea93ea525da0931db.png

From <assembly - What is the difference between MOV and LEA? - Stack Overflow>

健康小知识:

适量食用浆果(草莓,蓝莓,沙棘,桑葚,巴西莓,树莓,猕猴桃等等)对大脑是有好处的,但要注意对牙齿的腐蚀作用。

健康是工作和生活的本钱。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值