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

Cir*_*四事件 5 x86 assembly x86-64

在学习x86-64汇编时,我遇到了我的第一个"x86-64"的Intel 64和AMD64实现之间的不兼容性:为什么syscall在NASM 32位输出中编译而popa不能在64位编译? syscall在一个而不是另一个的兼容模式下有效.

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

例如,如果有以下任何一种情况会更容易:

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

RaG*_*aGe 5

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

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

维基百科列出了这些差异:

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

  • AMD64需要不同的微代码更新格式并控制MSR(特定型号的寄存器),而英特尔64实现的微代码更新与其32位处理器相同.

  • 英特尔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执行.

  • 你的历史倒退了:IA64/Itanium(与IA32/x86完全不同)早于AMD64.(英特尔最初并不打算将x86 CPU用于他们的高端高价位64位服务器产品线). (2认同)