2016-04-11 60 views
-3

所以我最近試圖進入程序集,發現自己真的和NASM的工作方式混淆了。據我瞭解,這是一種彙編的「編譯器」,它將(無效的)指令轉換爲實際的機器代碼。現在我想知道NASM手冊(www.nasm.us/doc/nasmdocb.html)中列出的說明與我的機器所使用的操作碼之間的區別是什麼?就像我們假裝我的英特爾處理器有某種祕密操作碼,沒有人知道,並且沒有在手冊中列出,NASM是否仍然可以組裝它?或者它只會返回'無效指令'?並且說我知道操作碼的機器碼格式,我是否可以手動插入它?assembly - opcodes vs. nasm instructions

回答

6

NASM支持NASM支持的內容。

確實可能存在「內部」指令,或者在建立NASM版本後引入的指令,然後它不知道。

那些(或實際上任何指令)可以由您使用db序列或類似手動編碼。

+0

您的第一段是正確的(NASM只有一個助記表),但它確實知道英特爾沒有在ISA中記錄的一些指令。看到我的答案。 –

0

old version of the nasm manual包含一些英特爾沒有記錄的說明,但NASM支持。 (該鏈接來自標記wiki。)

這些是「祕密操作碼」,即人們做的知道的。我假設人們至少測試了每個可能的最多3或4個字節的序列,以查找這樣的未公開的操作碼。當然,你不需要NASM知道如何對它們進行編碼,因爲你可以使用db將你想要的任何字節組裝到目標文件中。

這不是您實際詢問的答案,但可能更符合您想知道的內容。就像@ 500 ...所說,NASM只是一個從已知助記符表中查找字節序列的程序。它甚至不需要在x86 CPU上運行,也沒有用於查詢CPU指令名稱的接口。

你可能想編輯你的問題到一個更有趣的答案。


例如:

SALC ; D6 [8086,UNDOC]

SALC在概念上SETcc(部分A.150)類似的早期無證指令。它的功能是在進位標誌清零時將AL置零,如果置位則置爲0xFF。

它實際上工作在我的Core2 CPU上的32位模式。 (NASM和YASM在組裝64位代碼時都拒絕它)。

如果不明顯請勿在便攜式代碼中使用此功能。在將來某些CPU使用D6作爲其他指令編碼的第一個字節時,它會受到破壞。英特爾insn ref手冊附錄A中操作碼映射中的D6條目爲空。

操作碼映射中的所有空白都是保留的,不得使用。不要依賴 未定義或空白操作碼的操作。


current version of the NASM manual沒有列出的描述,但確實還列出所有助記符,包括那些標記UNDOC。據推測,這個附錄因SSE指示而變得過於臃腫。