加载有效地址(load effective address)指令就是lea,他的指令形式就是从内存读取数据到寄存器,但是实际上他没有引用内存,而是将有效地址写入到目的的操作数,就像是C语言地址操作符&一样的功能,可以获取数据的地址。在实际使用中他有两种使用方式。

1.lea指令获取偏移地址 

assume cs:code
code segment
start:
mov byte ptr ds:[98H],12h
lea bx,ds:[98H]
mov  ax,4c00h
int 21
code ends
end start

结果

lea指令获取到了数据的偏移地址

2.x86-64处理器支持多种操作数格式,利用这种功能可以简单实现普通的算术操作,下面演示一下

long exchange(long x,long y,long z)
{
	long t = x + 4 *y +12 *z;
	return 0;
}

反汇编

	long t = x + 4 *y +12 *z;
00971C28  mov         eax,dword ptr [y]  
00971C2B  mov         ecx,dword ptr [x]  
00971C2E  lea         edx,[ecx+eax*4]  
00971C31  imul        eax,dword ptr [z],0Ch  
00971C35  add         edx,eax  
00971C37  mov         dword ptr [t],edx  
	

可以看到出现了lea         edx,[ecx+eax*4]  ,就是说把ecx+eax*4算出来直接把结果传递给edx,不用繁琐的imul与add指令配合。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐