比如你用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和儲存器之間傳送字或位元組,它傳送的資訊可以從暫存器到暫存器,立即數到暫存器,立即數到...