這是非常常見的聽力/閱讀評論,例如“匯編程式實際上是一種機器代碼,但使用符號而不是直接的二進制代碼”。
我的問題是:這種肯定一般意味著“多少真實”?
uj5u.com熱心網友回復:
如果您從機器代碼的“純文本”表示開始(例如,操作碼/數字替換為助記符,地址/數字替換為標簽);然后大多陣列裝者還:
a) 允許在運算元中使用更復雜的運算式(例如,允許諸如“mov eax,(1234*5 6)/7其中匯編程式為“ mov eax,882”指令計算正確值的內容)。
b) 擁有允許您撰寫宏等的前處理器。通常這包括條件代碼,有時它足夠強大以允許您創建新語言和/或高級語言結構(例如想象“while”和“endwhile”宏) .
c) 可以自動選擇最佳編碼。例如,如果指令可以使用 32 位立即數運算元或符號擴展為 32 位的 8 位立即數運算元進行編碼;然后匯編器可能會查看運算元并確定較短的符號擴展編碼是否有效。
所有這些都對源代碼維護產生了巨大的影響——例如,如果您在某處添加一些指令,您就不必手動重新計算呼叫/跳轉/分支目標和資料訪問的所有地址/偏移量;您可以在一處執行“#define COST_OF_CHEESE 123”,以便以后輕松更改(無需在使用該值的任何地方查找);等等。
uj5u.com熱心網友回復:
這是一個使用 y86 的示例。
add %rdi, %rsi
變得像
00 01 02
基本上,00是操作碼的位元組表示add。當計算機看到 時add,它知道將接下來的兩個位元組解釋為暫存器(這在 x86 中稍微復雜一些)。01和02分別是暫存器 %rdi 和 %rsi 的位元組“名稱”或編碼。
這個例子的某些部分可能并不完全反映現實,但這基本上是機器代碼和匯編之間的對應關系。指令是操作碼 1-5 個位元組,根據操作碼進行不同的解釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/341311.html
