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