2017-01-04 13 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位)。