X86 Assemble指令--LEA

LEA指令描述

Opcode

Mnemonic

Description

8D /r

LEA r16,m

Store effective address for m in register r16

8D /r

LEA r32,m

Store effective address for m in register r32

LEA指令

LEA指令用來計算第二個操作數(源操作數)的有效地址,並且將該地址保存到第一個操作數(目的操作數)中。源操作數是CPU尋址模式中的內存尋址模式(支持偏移量)。而目標操作數是一個通用寄存器(GPR,general-purpose register)。這條指令被地址大小和操作數大小屬性所影響,如上表所示。指令的操作數大小決定於使用的寄存器,而地址大小決定於代碼段。

作用

LEA:Load Effective Address。加載有效地址。將源操作數的地址加載到目的寄存器中。注意:不是實際地址

如LEA EAX, [ EBX + ECX ],它相當於計算EBX和ECX的值,將這個值保存到EAX寄存器中。原因:由於EBX+ECX計算出來的值是該內存地址,而通過[EBX+ECX]得到的是內存地址保存的值,而LEA命令是加載該值的有效地址並且保存到目標寄存器中,也就是將EBX+ECX的值保存到EAX寄存器中 由於加載的是有效地址,而不是實際地址,所以EAX中保存的是EBX+ECX,而不是ds:EBX+ECX

實例

  1. 計算多個數據的運算 一般要計算多個數據相加,例如,將1+2+EBX的值放入EAX寄存器中,ADD需要三條指令
ADD EAX,1;
ADD EAX,2;
ADD EAX,EBX;

而使用LEA的話,只需要一條指令

LEA EAX,[1+2+EBX];
  1. 計算地址指針 例如現在有一個struct爲Point,其中int佔32位,4個byte。所以其中xcoord的偏移量爲0,而ycoord的偏移量爲4,整個struct大小爲8byte。
struct Point
{
     int xcoord;
     int ycoord;
};

假如現在有一條語句爲:

int y=points[i].ycoord

其中points是一個Point結構體的數組。而該數組的基址已經保存到了EBX寄存器中,而i的值保存在了EAX寄存器中。所以該條語句的彙編指令爲:

MOV EDX [EBX+8*EAX+4];

由於數組基址在EBX寄存器中,並且每一個Point元素都佔8個字節,而i保存在EAX寄存器中,所以EBX+8EAX得到的就是points[i]的基址,而ycoord的偏移量爲4,所以EBX+8EAX+4得到的就是points[i].ycoord

y的值保存到了EDX寄存器中,並且EBX+8EAX+4的值爲有效地址(effective address)。

而在C中有指針這一說,例如:

int *p = &points[i].ycoord;

這時候就需要LEA指令了。

LEA ESI, [EBX+8*EAX+4]

結果就將數組第i個數據結構的ycoord的地址保存在ESI寄存器中,也就是p中。

參考資料

What's the purpose of the LEA instruction? Load Effective Address

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章