【问题标题】:Why does syscall compile in NASM 32 bit output while popa does not compile in 64 bit?为什么 syscall 在 NASM 32 位输出中编译,而 popa 不在 64 位中编译?
【发布时间】:2015-06-29 07:17:57
【问题描述】:

Intel manual 说:

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

那么为什么 NASM 是有原因的:

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

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

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

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案1】:

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

    【讨论】:

    • 我太天真了,认为 Intel 和 AMD 会兼容 :-) 接受,因为 AMD 手册说 popa 在 64 位中是非法的,而没有说 syscall 在 64 位中是非法的兼容模式。
    • 我已经询问是否有一个很好的方法来找出兼容的子集:stackoverflow.com/questions/29833938/…
    猜你喜欢
    • 2021-06-08
    • 2018-08-04
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2021-06-25
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多