NASM (Intel) 弹出 ASM 错误

NASM (Intel) ASM Error on pop

每次我尝试用 NASM 编译我的代码时,其中有一个 "pop"(在本例中为 "pop al"),它给我一个错误。

20: error: invalid combination of opcode and operands

在第 20 行,我有

pop al

有什么问题?

问题实际上是汇编程序提供的错误消息:"invalid combination of opcode and operands"POP 指令没有 POP r8 编码可能。换句话说,您不能从堆栈中弹出 8 位值

最接近的等效项是 pop ax,它使用 POP r16 编码将 16 位值从堆栈弹出到 ax 寄存器中。但是,这与您的代码并不完全相同,因为它会同时修改 16 位 ax注册.

另一种方法是直接从堆栈加载值,使用类似 mov al, BYTE PTR [(r/e)sp] 的方法。因为这不会改变堆栈指针,所以您需要手动调整它。


下次也请说明您的目标平台是什么。这一点很重要,因为与 32 位和 64 位保护模式相比,16 位实模式的寻址模式可能性非常有限。如果您不指定您的目标模式,您得到的答案可能不适合您。像这里一样,我不知道 mov 指令应该使用 rsp(64 位)、esp(32 位)还是 sp(16 位) .