Assembly 英特尔&x27;的兼容子集是什么;s和AMD';什么是x86-64实现?

Assembly 英特尔&x27;的兼容子集是什么;s和AMD';什么是x86-64实现?,assembly,x86,x86-64,Assembly,X86,X86 64,在学习x86-64汇编时,我遇到了“x86-64”的Intel 64和AMD64实现之间的第一个不兼容问题:syscall在一种兼容模式下有效,但在另一种模式下无效 除了仔细阅读两本手册并比较它们之外,还有没有更好的方法来找出这些不兼容的地方?这很容易出错,而且在追求可移植性时重复了我的手册阅读工作 例如,如果存在以下两种情况之一,则会容易得多: 英特尔和AMD都声称遵循的标准子集 关于AMD兼容性的英特尔手册评论,因为AMD是x86-64的发明者。但当然,这对英特尔来说很难维护,而且英特尔手

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

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

例如,如果存在以下两种情况之一,则会容易得多:

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

历史注释:英特尔在安腾系列处理器中实现了64位ISA,他们称之为IA-64,它完全取代了32位x86 ISA。IA-64与x86不向后兼容,在高端服务器市场之外从未真正流行

AMD创建了AMD64 ISA,作为对
x86
ISA的增量改进。AMD64很快得到了普及和接受,Intel也采用了它,但在不同的时间称它为IA-32e、EM64T和Intel64。Intel64和AMD64几乎相同,但有一些不同

列出这些差异:

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

  • AMD64需要不同的微码更新格式和控制MSR(特定于型号的寄存器),而Intel 64则在其仅32位处理器上实现微码更新,保持不变

  • 英特尔64缺少一些在AMD64中被视为体系结构的MSR。其中包括SYSCFG、TOP_MEM和TOP_MEM2

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

  • 在64位模式下,前缀为66H(操作数大小覆盖)的近分支的行为不同。英特尔64忽略此前缀:指令具有32位符号扩展偏移量,并且指令指针不会被截断。AMD64在指令中使用16位偏移量字段,并清除指令指针的前48位

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

  • 英特尔64无法保存和恢复浮点状态的简化版(因此速度更快)(涉及FXSAVE和FXRSTOR指令)

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

  • 使用SYSRET返回非规范地址时,AMD64处理器在特权级别3中执行常规保护故障处理程序,而在英特尔64处理器上,它在特权级别0中执行


一如既往,这是一个很好的起点@愤怒你是对的,我觉得很傻:-)你让你的历史倒退了:IA64/Itanium(与IA32/x86完全不同)早于AMD64。(英特尔最初并不打算让x86 CPU蚕食其高端高价64位服务器产品线)。