彻底弄懂汇编指令lea
lea 是地址传送指令,在汇编程序中很常见。
其功能就是把一个存储器操作数的地址传入通用寄存器。(一个十六位通用寄存器)
例如:lea ax,[bx][si]
EA(偏移量)=(bx)+(si)
其实就是将后者的偏移地址 送人通用寄存器中。
为什么要这样做呢?
建立一个地址指针呗!(用C语言的思维像是这样的,不过汇编里是没有指针的概念的,指针,寻址呗!)
让我们来反汇编一段简单的C程序:
#include<stdio.h>
其功能就是把一个存储器操作数的地址传入通用寄存器。(一个十六位通用寄存器)
例如:lea ax,[bx][si]
EA(偏移量)=(bx)+(si)
其实就是将后者的偏移地址 送人通用寄存器中。
为什么要这样做呢?
建立一个地址指针呗!(用C语言的思维像是这样的,不过汇编里是没有指针的概念的,指针,寻址呗!)
让我们来反汇编一段简单的C程序:
#include<stdio.h>
void main()
{
int x1=11;
int *p1;
p1=&x1;
printf("%d",*p1);
}
在VC中对应的汇编代码:

看得出来,变量x1对应dword ptr [ebp-4]
int *p1;
p1=&x1;
对应
lea eax,[ebp-4]
mov dword ptr [ebp-8],eax
将x1的地址存放在dword ptr [ebp-8]中。
而printf("%d",*p1);使用指针变量来输出。
对应
mov ecx,dword ptr [ebp-8]
mov edx,dword ptr [ecx]
dword ptr [ebp-8] 中已储存了变量x1的偏移地址。
先将这个地址放入通用寄存器ecx中。
而后借助dword ptr [ecx] 找到x1。
如果不用指针:
在VC中对应的汇编代码:
看得出来,变量x1对应dword ptr [ebp-4]
int *p1;
p1=&x1;
对应
lea eax,[ebp-4]
mov dword ptr [ebp-8],eax
将x1的地址存放在dword ptr [ebp-8]中。
而printf("%d",*p1);使用指针变量来输出。
对应
mov ecx,dword ptr [ebp-8]
mov edx,dword ptr [ecx]
dword ptr [ebp-8] 中已储存了变量x1的偏移地址。
先将这个地址放入通用寄存器ecx中。
而后借助dword ptr [ecx] 找到x1。
如果不用指针:
#include<stdio.h>
void main()
{
int x1=11;
printf("%d",x1);
}
对应的汇编代码:

相比较着看,其意义就不言而喻了吧!
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
对应的汇编代码:
相比较着看,其意义就不言而喻了吧!
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈