2017-04-01 58 views
1

我想做彙編編譯器。爲此,我應該對Assembly操作碼進行研究,所以我在Web上找到了它。當我考到編譯NASM一些代碼,就像這樣:但是如何閱讀彙編操作碼參考

6601C0

,當我看到彙編操作碼的參考,:

add eax, eax 

它輸出這種二元它顯示此屏幕:​​ Snapshot

其中ADD操作碼是00,01,02,03,04,05。 哪個操作碼是正確的?我可以全部使用它們,還是應該使用01(基於與NASM編譯的二進制文件)。

+1

您需要使用與使用的操作數匹配的操作碼。您應該下載英特爾手冊並閱讀前兩卷,特別是第二卷,其中包含有關指令編碼的所有詳細信息。 –

回答

3

你發現的只是互聯網上的某些人的參考。 權威參考來自英特爾,可以在這裏下載:Intel® 64 and IA-32 Architectures Software Developer Manuals

你明顯地組裝了16位實模式環境(如DOS)的代碼,在那裏它被彙編到6601C0

  1. 看看第一個字節66。這由英特爾「操作數大小覆蓋前綴」和您的參考「OPSIZE」調用。它將操作數的大小從16位更改爲32位(AXEAX)。這就是爲什麼我猜環境是一個16位系統。

  2. 第二個字節01ADD指令中第二行在第一行中的引用。您的參考號稱ADD Ev Gv。英特爾手冊稱它爲ADD r/m16, r16。使用操作數大小覆蓋前綴,您可以將其讀作ADD r/m32, r32

  3. 第三個字節C0是參考文獻(Intel:「r/m32,r32」)中的「Ev Gv」。英特爾將其稱爲「ModR/M」字節。該字節中的一些位定義目標(「Ev」),一些位定義源(「Gv」)。請參閱Intel手冊中的表格「表2-1。ModR/M字節的16位尋址表格」。

要回答你的問題:不,你必須使用具體ADD指令爲特定目的。 ADD指令執行不同的操作。

+0

那麼EvGv和GvEv有什麼區別?請向我解釋。 –

+0

@DanaPrakoso:定義什麼是來源,什麼是目標。第一個縮寫是目標,第二個是來源。縮寫應在你的參考文獻中解釋。 – rkhb

+0

我以前從未見過這個Ev,Gv等符號。這看起來像是由那個特定參考發明的東西,這是一個窮人和令人困惑的選擇。我不清楚爲什麼他們不只是遵循英特爾文檔所使用的標準符號,正如你在答案中提到的那樣。 –