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