弹出的NASM(英特尔)ASM错误

时间:2017-01-04 19:59:32

标签: assembly x86 nasm

每当我尝试使用NASM编译我的代码时,有一个“pop”(在这种情况下为“pop al”),它会给我一个错误。

20: error: invalid combination of opcode and operands

在第20行,我有

pop al

有什么问题?

1 个答案:

答案 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位)