比如你用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]
彙編指令解釋
mov ax,30h ax 0x30 mov ax,30h ax中的內容是記憶體位址30h裡儲存的數值 bx 40f6h,記憶體位置40f6h 40f7h兩個位址中存放的數是22h 23h mov ax,bx 2223h傳送到ax中 mov ax,bx 40f6h傳送到ax中ldr r0,x 用於載...
彙編名詞解釋
mov 暫存器之間傳送注意,源和目的不能同時是段暫存器 段暫存器cs不能作為目的 指令指標ip不能作為源和目的。立即數不能直接傳送段暫存器。源和目的運算元型別要一致 除了串操作指令外,源和目的不能同時是儲存器運算元。xchg交換指令 運算元可以是通用暫存器和儲存單元,但不包括段暫存器,也不能同時是儲...
彙編 特殊符號 解釋
算術運算子。巨集處理操作符。巨集擴充套件時不識別符號和字串中的形式引數,如果在形式引數前面加上乙個 記號,巨集匯程式設計序就能夠用實在引數代替這個形式引數了。位址計數器的值 記錄正在被匯程式設計序翻譯的語句位址。每個段均分配乙個計數器,段內定義的所有標號和變數的偏移位址就是當前彙編位址計數器的值。運...