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

时间:2015-04-21 21:57:32

标签: assembly x86 nasm

Intel manual说:

  • syscall指令对兼容模式(32位)无效
  • popa对64位模式无效

NASM是否有原因:

    如果我将instruction not supported in 64-bit modepopa 一起使用,则
  • 会出现编译错误-f elf64 如果我将syscall-f elf32一起使用,则
  • 不会给出编译错误。如果我运行可执行文件,我会按预期获得Illegal instruction (core dumped)

为什么要区别对待这两种情况?

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

1 个答案:

答案 0 :(得分:3)

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