彙編lea 指令與 mov 指令

2021-09-07 22:26:54 字數 1077 閱讀 2706

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

push   ebp  

mov   esp,   ebp  

sub   esp,   4  

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

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

mov   dword   ptr   [ebp-4],   4  

於是,這個區域性變數的「位址」就是ebp-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] 又有什麼不同呢?其實他們都是等效的。 後來知道實際上是乙個偏移量可以是立即數,也可以是經過四則運算的結果,更省空間,更有效率)

彙編Lea 指令與 Mov 指令

比如你用local在棧上定義了乙個區域性變數localvar,你知道實際的指令是什麼麼?一般都差不多像下面的樣子 push ebp mov esp,ebp sub esp,4 現在棧上就有了4各位元組的空間,這就是你的區域性變數。接下來,你執行mov localvar,4,那麼實際的指令又是什麼?是...

彙編Lea 指令與 Mov 指令

初學彙編,可能對lea指令很迷惑。關於lea指令,下面的文章寫的很好。比如你用local在棧上定義了乙個區域性變數localvar,你知道實際的指令是什麼麼?一般都差不多像下面的樣子 push ebp mov esp,ebp sub esp,4現在棧上就有了4各位元組的空間,這就是你的區域性變數。接...

彙編 lea指令和mov指令

load effective address,載入有效位址,可以將有效位址傳送到指定的的暫存器。指令形式是從儲存器讀資料到暫存器,效果是將儲存器的有效位址寫入到目的運算元,簡單說,就是c語言中的 在cpu內或cpu和儲存器之間傳送字或位元組,它傳送的資訊可以從暫存器到暫存器,立即數到暫存器,立即數到...