在学习x86-64程序集时,我遇到了我的第一个不兼容的英特尔64和AMD64实现" x86-64":Why does syscall compile in NASM 32 bit output while popa does not compile in 64 bit? syscall
在兼容模式下有效一个而不是另一个。
除了仔细阅读这两本手册并进行比较之外,还有更好的方法可以找出这些不相容的内容吗?这样可能会出错,并且在针对便携性时会重复我的手动阅读工作?
例如,如果存在以下情况会容易得多:
答案 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执行。