汇编:lea指令学习
加载有效地址(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指令配合。