我是一名在我自己的時間學習彙編語言的大學學生。我注意到雖然有像add和mul這樣的指令,但算術運算符經常在指令中使用。例如:彙編語言:+ vs add
mov eax,[ebx+ecx]
是否相當於以下?
add ebx,ecx
mov eax,[ebx]
(忽略EBX的內容的變化)
我是一名在我自己的時間學習彙編語言的大學學生。我注意到雖然有像add和mul這樣的指令,但算術運算符經常在指令中使用。例如:彙編語言:+ vs add
mov eax,[ebx+ecx]
是否相當於以下?
add ebx,ecx
mov eax,[ebx]
(忽略EBX的內容的變化)
至於從內存中讀取的東西,它們在功能上是相同的。已經提到的差異已經提到,在嚴格用於寄存器偏移尋址[ebx + ecx]的時候不要修改標誌,並且修改ebx並銷燬基地址。你也消耗兩倍的指令,兩倍的提取。 x86是可變指令長度,這不一定意味着指令的字節數是指令字節的兩倍,但是這意味着更多的時鐘週期和更多的緩存空間用於執行相同的任務。
希望你會繼續在你自己的時間學習程序集,我還建議學習其他指令集(ARM,thumb,mips,msp430,avr等)。您經常會看到這些折衷,有時您特別想要添加而不破壞寄存器並且不修改標誌。有時候你想要或者需要寄存器偏移地址來使代碼更快或者更清潔,比如在每個循環中必須使用一個寄存器和每個引用的額外指令。由於知道許多處理器具有寄存器偏移量尋址功能,如果您對性能感興趣,例如通用和特定目標都可以編寫高級代碼以利用這些優勢。
不,這是不等價的。如果這是真實代碼,那麼括號內的內容就是addressing mode的一個例子。尋址模式控制如何計算操作的有效地址,但它通常不會產生持續影響。您的第二個代碼片段實際上會添加到ebx
寄存器中,以更改其內容以獲取以下任何說明。
更新:我剛剛看到了關於忽略更改的最後一句話......如果您想忽略這一點,那麼是的,我相信這兩個片段是等效的。
接近... 此索引地址方法([ebx + ecx]或任何其他)通常用於尋址某些數組或記錄中的元素。在你的情況下,ebx可以是指向字節數組的指針,並且ecx是索引。使用索引尋址可能是危險的,因爲算術運算後沒有efected標誌,所以我們不能檢查數組範圍溢出。調試模式下的常規高級編譯器使用clasic較慢的方法,以便我們能夠檢測到數組範圍溢出。當我們將編譯器切換到relase模式(並且我們確信沒有更多可能的錯誤)時,更快的索引尋址方法正在使用中。