首先说明汇编指令有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上看到一个解释的很清楚的回答:
From <assembly - What is the difference between MOV and LEA? - Stack Overflow>
健康小知识:
适量食用浆果(草莓,蓝莓,沙棘,桑葚,巴西莓,树莓,猕猴桃等等)对大脑是有好处的,但要注意对牙齿的腐蚀作用。
健康是工作和生活的本钱。