每当我尝试使用NASM编译我的代码时,有一个“pop”(在这种情况下为“pop al”),它会给我一个错误。
20: error: invalid combination of opcode and operands
在第20行,我有
pop al
有什么问题?
答案 0 :(得分:5)
问题实际上是汇编程序提供的错误消息:“操作码和操作数的无效组合”。 POP
指令无法进行POP r8
编码。换句话说,您不能从堆栈中弹出8位值
最接近的等价物是pop ax
,它使用POP r16
编码将堆栈中的16位值弹出到ax
寄存器中。但是,这与您的代码不完全相同,因为它将修改16位的低8位半(al
)和高8位半(ah
){ {1}}注册。
另一种方法是使用ax
之类的东西直接从堆栈加载值。因为这不会改变堆栈指针,所以需要手动调整它。
下次还请指定您的目标平台。这很重要,因为与32位和64位保护模式相比,16位实模式寻址模式的可能性非常有限。如果您未指定要定位的模式,则您获得的答案可能不适合您。就像这里一样,我不知道mov al, BYTE PTR [(r/e)sp]
指令是使用mov
(64位),rsp
(32位)还是esp
(16位)