加载有效地址(load effective address)指令就是lea,他的指令形式就是从内存读取数据到寄存器,但是实际上他没有引用内存,而是将有效地址写入到目的的操作数,就像是C语言地址操作符&一样的功能,可以获取数据的地址。在实际使用中他有两种使用方式。
1.lea指令获取偏移地址
assume cs:codecode segmentstart:mov byte ptr ds:[98H],12hlea bx,ds:[98H]mov ax,4c00hint 21code endsend 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指令配合。
快三大小单双稳赚买法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指令配合。