Assembly 为什么syscall在NASM 32位输出中编译,而popa不在64位输出中编译?

Assembly 为什么syscall在NASM 32位输出中编译,而popa不在64位输出中编译?,assembly,x86,nasm,Assembly,X86,Nasm,报告说: syscall指令对于兼容模式(32位)无效 popa对于64位模式无效 那么NASM有什么理由: 如果将popa与-f elf64一起使用,则给出64位模式下不支持的编译错误指令 如果将syscall与-f elf32一起使用,则不会给出编译错误。如果我运行可执行文件,我会得到预期的非法指令(内核转储) 为什么要区别对待这两种情况 在Ubuntu 14.04上使用NASM版本2.10.09进行测试(应与操作系统无关)。因为syscall指令在32位模式的AMD处理器上也存在(

报告说:

  • syscall
    指令对于兼容模式(32位)无效
  • popa
    对于64位模式无效
那么NASM有什么理由:

  • 如果将
    popa
    -f elf64
    一起使用,则给出64位模式下不支持的编译错误
    指令
  • 如果将
    syscall
    -f elf32
    一起使用,则不会给出编译错误。如果我运行可执行文件,我会得到预期的
    非法指令(内核转储)
为什么要区别对待这两种情况


在Ubuntu 14.04上使用NASM版本2.10.09进行测试(应与操作系统无关)。

因为
syscall
指令在32位模式的AMD处理器上也存在(并工作)。从历史上看,英特尔使用的是
syscenter
指令,但当AMD推出64位扩展时,他们使用了自己的
syscall
,因此当英特尔接管扩展时,他们也开始支持
syscall
,但仅在64位模式下。

我太天真了,没有想到Intel和AMD会兼容:-)接受,因为AMD手册说
popa
在64位模式下是非法的,并且没有说
syscall
在compat模式下是非法的。我问是否有一种好方法可以在以下位置找到兼容子集: