gpt4 book ai didi

assembly - Intel 和 AMD x86-64 实现的兼容子集是什么?

转载 作者:行者123 更新时间:2023-12-04 19:04:00 29 4
gpt4 key购买 nike

在学习 x86-64 汇编时,我遇到了“x86-64”的 Intel 64 和 AMD64 实现之间的第一个不兼容性:Why does syscall compile in NASM 32 bit output while popa does not compile in 64 bit? syscall在一种兼容模式下有效,但在另一种兼容模式下无效。

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

例如,如果有:

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

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

    AMD 创建 AMD64 ISA 作为对 x86 的渐进式演进ISA。 AMD64 迅速流行和接受,Intel 也采用了它,但在不同时期将其称为 IA-32e、EM64T 和 Intel64。 Intel64 和 AMD64 几乎相同,但有一些差异。

    Wikipedia列出了这些差异:

  • 当源为零且操作数大小为 32 位时,Intel 64 的 BSF 和 BSR 指令的行为与 AMD64 的不同。处理器设置零标志并使目标的高 32 位未定义。
  • AMD64 需要不同的微码更新格式和控制 MSR(特定于模型的寄存器),而 Intel 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 时会引发浮点无效异常,而 Intel 处理器则不会。
  • Intel 64 缺乏保存和恢复浮点状态(涉及 FXSAVE 和 FXRSTOR 指令)的简化(因此更快)版本的能力。
  • 最近的 AMD64 处理器通过长模式分段限制启用 (LMSLE) 位重新引入了对分段的有限支持,以简化 64 位客户机的虚拟化。
  • 当使用 SYSRET 返回非规范地址时,AMD64 处理器在特权级别 3 中执行通用保护故障处理程序,而在 Intel 64 处理器上它在特权级别 0 中执行。
  • 关于assembly - Intel 和 AMD x86-64 实现的兼容子集是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29833938/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com