2017-01-04 54 views
-2

每次我嘗試編譯我的NASM,那裏是一個「流行」的代碼錯誤(「流行人」在這種情況下),它給了我一個錯誤。NASM(英特爾)ASM上彈出

20: error: invalid combination of opcode and operands 

在第20行,我有

pop al 

什麼問題?

+4

你甚至閱讀使用手冊嗎?即使是謙卑的8086(從「al」假設)也可以「推」或「彈出」一個8位寄存器。 –

+1

我建議你谷歌爲「8086指令集」,尤其是對「adressing器官功能障礙綜合徵」,並試圖瞭解這一切'R32,R/m32'等東西手段 – Tommylee2k

回答

5

問題實際上是彙編程序提供的錯誤信息:「操作碼和操作數的無效組合」。指令POP沒有POP r8編碼可能。換句話說,可以不彈出一個8位的值從堆棧

最接近的等效將pop ax,它使用一個POP r16編碼彈出一個16位的值從堆棧入ax寄存器。然而,這是不完全一樣的代碼,因爲它會修改這兩個低8位的一半(al)和16位ax寄存器的高8位的一半(ah)。

另一種方法是直接從堆棧加載值,使用類似mov al, BYTE PTR [(r/e)sp]。因爲這不會改變堆棧指針,所以您需要手動調整它。


下一次,請同時指定您的目標平臺是什麼。這很重要,因爲與32位和64位保護模式相比,16位實模式尋址模式的可能性非常有限。如果您沒有指定您定位的模式,那麼您得到的答案可能不適合您。喜歡這裏,我不知道該mov指令是否應該使用rsp(64位),esp(32位),或sp(16位)。