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 位) .
每次我尝试用 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 位) .