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+2+EBX的值放入EAX寄存器中,ADD需要三條指令
ADD EAX,1; ADD EAX,2; ADD EAX,EBX;
而使用LEA的話,只需要一條指令
LEA EAX,[1+2+EBX];
- 計算地址指針
例如現在有一個
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