Cir*_*四事件 5 x86 assembly x86-64
在学习x86-64汇编时,我遇到了我的第一个"x86-64"的Intel 64和AMD64实现之间的不兼容性:为什么syscall在NASM 32位输出中编译而popa不能在64位编译? syscall在一个而不是另一个的兼容模式下有效.
除了仔细阅读这两本手册并进行比较之外,还有更好的方法可以找出这些不兼容性吗?这样会容易出错,并且在针对可移植性时会重复我的手动阅读工作吗?
例如,如果有以下任何一种情况会更容易:
历史记录:英特尔在他们的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执行.