需要正確理解lea指令的功能。
該指令有兩個運算元。左邊是目的運算元,表示操作結果儲存在此,該指令目的運算元只能是8個通用暫存器之一。逗號右邊的是源運算元,該指令的源運算元只能是乙個儲存單元,表達儲存單元有多種定址方式。
lea指令的功能是將源運算元、即儲存單元的有效位址(偏移位址)傳送到目的運算元。
示例指令中,[bx+si+0f54h]採用相對基址變址的定址方式表達儲存單元,它表示的儲存單元的有效位址是:bx內容加si內容加0f54h。這個結果被傳送到bx中。
是否是很煩瑣?
該指令涉及了多個基本知識點,尤其是儲存器定址方式。問題很有可能是前面的內容並沒有真正理解和掌握。
這是組合語言程式設計課程的乙個特點,知識點點滴滴,需要靜心學習。
--------------------------------------------
這個指令一般用於加法或者乘法的優化,以獲得更高的執行效率
這個指令是用來取ea位址的,一般情況是可以和mov ax,offset buffer等效,但是還是有區別的:1,執行一條lea大約是100條offset指令的時間,2,offset不可以用於相對基址變址這樣的複雜定址方式
offset屬偽指令範疇,是在彙編時處理的,對位址不變的變數可以取其有效位址。如樓上的「mov dx,offset a」
但是,如果位址是變數(也就是指標),其有效位址是隨程式執行而變化的,offset是肯定無法取其有效位址的。因為「偽指令」不可能在程式執行時起作用。例如,「mov dx,offset 1234[si+bx]」肯定是不行的。
lea是指令,可以在位址是變數(也就是指標)的情況下,取其有效位址。
例如,「lea dx,1234[si+bx]」肯定是可以的。因此,它從來就不是多餘的。
------------------------------------------
堆疊種分配的區域性變數所謂的「標號」,你以為是什麼?(都是那些該死的巨集惹的禍,大家要都是老老實實寫**,就不會有這些疑問了)。
比如你用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]
git指令彙總
倉庫中檔案相關操作 顯示工作區目錄和暫存區的狀態 建立空目錄 檢視專案的歷史資訊 檢視系統有沒有安裝git 顯示有關git的幫助資訊 1.獲取並設定儲存庫或全域性選項 git config2.配置使用者名稱和密碼git config global users.name your name git c...
Ubuntu常用指令彙總
名字 描述 根目錄 bin 基本命令 boot linux核心,重啟載入檔案 dev 裝置檔案 etc 系統配置檔案 home 使用者目錄 lib 共享庫 核心模組 lost found 系統恢復檔案目錄 media 可移動媒介的掛載點,比如 軟盤 mnt 本地 遠端檔案系統的常規掛載點 opt a...
Dockerfile指令大彙總
一 指令格式 下面對於dockerfile用的一些指令進行簡單的說明。首先,指令的一般格式為 instruction arguments 有一點很重要,指令必須都是大寫。二 dockerfile指令介紹 from 格式為from或from 第一條指令必須為from指令,注釋除外。並且,如果在同乙個d...