彙編Lea 指令與 Mov 指令

2021-07-04 19:23:47 字數 1068 閱讀 5745

比如你用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 指令

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

彙編lea 指令與 mov 指令

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

彙編 lea指令和mov指令

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