詳解LEA指令

2021-06-16 09:09:06 字數 1151 閱讀 8445

初學彙編,可能對lea指令很迷惑。關於lea指令,下面的文章寫的很好。

比如你用local在棧上定義了乙個區域性變數localvar,你知道實際的指令是什麼麼?一般都差不多像下面的樣子:

push   ebp  

mov   esp,   ebp  

sub   esp,   4  

現在棧上就有了4各位元組的空間,這就是你的區域性變數。  

接下來,你執行mov   localvar,   4,那麼實際的指令又是什麼?是這樣:

mov   dword   ptr   [ebp-4],   4

invoke/call   somefunc,   addr   localvar

實際生成的指令是:

lea   eax,   [ebp-4] 

push   eax  

call   somefunc

當然,你也可以寫成:

mov   eax,   ebp  

sub   eax,   4  

push   eax  

call   somefunc

看到了,這裡多了一條指令。這就是lea的好處。於是,lea又多了乙個非常美妙的用途:作簡單的算術計算,特別是有了32位指令的增強定址方式,更是「如虎添翼」:  

比如你要算eax*4+ebx+3,結果放入edx,怎麼辦?

mov   edx,   eax  

shl   edx,   2  

add   edx,   ebx  

add   edx,   3  

現在用lea一條指令搞定: 

lea   edx,   [ebx+eax*4+3]

lea的英文解釋是: load effective address.(加入有效位址,開始迷惑效位址是什麼???既然是有效位址與mov ax , [address] 又有什麼不同呢?其實他們都是等效的。 後來知道實際上是乙個偏移量可以是立即數,也可以是經過四則運算的結果,更省空間,更有效率)

X86 LEA指令詳解

1.sdm指令功能描述 lea lea 總體描述 從第二個運算元 源運算元 計算有效位址,並將結果存入第乙個運算元 目的運算元 源運算元是指定了一種訪存操作的記憶體位址,目的運算元為乙個通用暫存器。位址大小和運算元大小都會影響該指令的結果,運算元大小被指令中指定的暫存器大小決定,位址大小由 段描述符...

彙編指令lea

徹底弄懂彙編指令lea lea 是位址傳送指令,在匯程式設計序中很常見。其功能就是把乙個儲存器運算元的位址傳入通用暫存器。乙個十六位通用暫存器 例如 lea ax,bx si ea 偏移量 bx si 其實就是將後者的偏移位址 送人通用暫存器中。為什麼要這樣做呢?建立乙個位址指標唄!用c語言的思維像...

彙編 LEA指令

lea指令返回間接運算元的偏移位址。由於間接運算元可能使用乙個或多個暫存器,因此其偏移值是在執行時計算的。void makearray 雖然陣列有30位元組,但按4位元組對其,esp減去了32。makearray proc push ebp mov ebp,esp sub wsp,32 lea es...