lea
指令是汇编语言中非常重要且独特的一条指令,它的意思是:
✅ 一句话总结:
lea
(Load Effective Address)指令用于将“地址表达式的计算结果”加载到寄存器中,而不是访问该地址的内容。
🔍 举个最经典的例子:
lea eax, [ebx + 4*esi + 8]
这行汇编的意思是:
把
ebx + 4 × esi + 8
这个地址本身的数值,算出来放到eax
中,但不访问这个地址指向的内容。
🧠 和 mov
的对比:
指令 | 含义 |
---|---|
mov eax, [ebx] | 从地址 ebx 指向的内存中取值放到 eax |
lea eax, [ebx] | 把地址 ebx 的值本身放到 eax ,不访问内存 |
🧱 指令结构:
lea 目标寄存器, [基址 + 指数寄存器 × 比例 + 偏移]
所有的 [地址]
只是地址计算表达式,而不会访问那块地址指向的内存。
✅ 常见用途:
1️⃣ 指针运算(常用于 C 编译结果)
int arr[10];
int *p = &arr[5];
对应汇编通常是:
lea rax, [arr + 20] ; 假设每个 int 占 4 字节,5×4=20
2️⃣ 快速整数运算(不用动内存)
lea eax, [eax + eax*4] ; 等价于 eax = eax * 5
这比 imul
快,因为 lea
是加法电路计算,不用乘法器。
3️⃣ 栈帧地址计算
比如函数里访问局部变量:
lea eax, [ebp - 8] ; 把某个局部变量地址装进 eax
⚠️ 注意点:
lea
从不访问内存内容!只计算地址表达式的“结果”- 所以不能用
lea eax, 1234
这种立即数(要用mov eax, 1234
)
✅ 总结句:
lea
是“加载地址值”的指令,用于指针计算、地址偏移、快速整数运算。它不读内存,只把“地址表达式的值”算出来放到寄存器里。