Intel 和 AMD x86-64 实现的兼容子集是什么?

What is the compatible subset of Intel's and AMD's x86-64 implementations?

在学习 x86-64 汇编时,我遇到了 "x86-64" 的 Intel 64 和 AMD64 实现之间的第一个不兼容问题: syscall 在兼容模式下有效,但不是另一个。

除了仔细阅读两本手册并进行比较之外,是否有更好的方法来找出这些不兼容的地方,这很容易出错,并且在追求可移植性时会重复我的手册阅读工作?

例如,如果有:

历史记录:英特尔在其 Itanium 系列处理器中实现了他们的 64 位 ISA,他们称之为 IA-64,完全替代了 32 位 x86 ISA。 IA-64 不向后兼容 x86,并且从未在高端服务器市场之外真正流行起来。

AMD 创建了 AMD64 ISA 作为 x86 ISA 的增量演进。 AMD64 迅速普及和接受,Intel 也采用了它,但在不同时期将其称为 IA-32e、EM64T 和 Intel64。 Intel64 和 AMD64 几乎相同,只有一些差异。

Wikipedia 列出了这些差异:

  • 当源为零且操作数大小为 32 位时,Intel 64 的 BSF 和 BSR 指令与 AMD64 的行为不同。处理器设置零标志并保留目标的高 32 位未定义。

  • AMD64 需要不同的微码更新格式和控制 MSR(特定于型号的寄存器),而 Intel 64 实现微码更新与其 32 位处理器相比没有变化。

  • Intel 64 缺少一些在 AMD64 中被认为是架构的 MSR。这些包括 SYSCFG、TOP_MEM 和 TOP_MEM2.

  • Intel 64 仅在 64 位模式下允许 SYSCALL/SYSRET(不在兼容模式下),并且在两种模式下都允许 SYSENTER/SYSEXIT。 AMD64在长模式的两个子模式中都缺少SYSENTER/SYSEXIT。

  • 在 64 位模式下,带有 66H(操作数大小覆盖)前缀的附近分支的行为不同。 Intel 64 忽略这个前缀:指令有 32 位符号扩展偏移量,指令指针没有被截断。 AMD64在指令中使用了16位的偏移域,并清除了指令指针的高48位。

  • AMD 处理器在执行 80 位信号 NaN 的 FLD 或 FSTP 时引发浮点无效异常,而英特尔处理器则不会。

  • Intel 64 缺乏保存和恢复简化(因此更快)版本的浮点状态(涉及 FXSAVE 和 FXRSTOR 指令)的能力。

  • 最近的 AMD64 处理器通过长模式段限制启用 (LMSLE) 位重新引入了对分段的有限支持,以简化 64 位客户机的虚拟化。

  • 当使用 SYSRET 返回到非规范地址时,AMD64 处理器以特权级别 3 执行一般保护故障处理程序,而在 Intel 64 处理器上,它以特权级别 0 执行。