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

时间:2015-04-23 20:43:36

标签: assembly x86 x86-64

在学习x86-64程序集时,我遇到了我的第一个不兼容的英特尔64和AMD64实现" x86-64":Why does syscall compile in NASM 32 bit output while popa does not compile in 64 bit? syscall在兼容模式下有效一个而不是另一个。

除了仔细阅读这两本手册并进行比较之外,还有更好的方法可以找出这些不相容的内容吗?这样可能会出错,并且在针对便携性时会重复我的手动阅读工作?

例如,如果存在以下情况会容易得多:

  • 英特尔和AMD声称遵循的标准子集
  • 关于AMD兼容性的英特尔手册评论,因为AMD是发明x86-64的人。但当然,这对英特尔来说很难维持,而英特尔的手册并不包含AMD这个词。
  • 某些一般官方或非官方指南,确保某些部分的兼容性。例如,类似于:兼容模式可能不兼容,但64位模式不兼容。
  • 英特尔,AMD或某些第三方的一些维护良好的不兼容列表

1 个答案:

答案 0 :(得分:5)

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

AMD创建AMD64 ISA作为x86 ISA的增量演进。 AMD64很快得到了普及和接受,英特尔也采用了它,但在不同的时间称它为IA-32e,EM64T和Intel64。 Intel64和AMD64几乎完全相同,但存在一些差异。

Wikipedia列出了这些差异:

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

  • AMD64需要不同的微代码更新格式并控制MSR(特定型号的寄存器),而英特尔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时会引发浮点无效异常,而英特尔处理器则不会。

  • 英特尔64缺乏保存和恢复的浮点状态的减小(从而更快)版本(涉及FXSAVE和FXRSTOR指令)的能力。

  • 最近AMD64处理器已经重新引入了分割支持有限,经由长模式段限制使能(LMSLE)位,以缓解的64位客人虚拟化。

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