代码之家  ›  专栏  ›  技术社区  ›  SRobertJames

英特尔CPU如何确定x86或x64模式?

  •  -2
  • SRobertJames  · 技术社区  · 4 年前

    Intel x64 CPU也可以运行x86 asm。CPU中是否有标志或模式来确定指令应解码为x86还是x64?CPU如何知道指令是x86还是x64?

    在CPU级别(而不是操作系统级别!),是否可以混合使用x86和x64指令?

    注意:有很多SO问答;关于这个问题,在 操作系统级别 ; 我对感兴趣 CPU级别 .谈论库、文件等不是在CPU级别。

    0 回复  |  直到 4 年前
        1
  •  5
  •   prl    4 年前

    IA32_EFER MSR中的比特LMA(长模式活动)指示处理器处于长模式(64比特模式)。

    当处于长模式时,活动代码段描述符中的L位指示处理器是解码32位指令还是64位指令。

    为了更改LMA,软件清除CR0中的PG位,更改EFER中的LME位,然后设置PG。

    为了改变CS中的L位,软件执行一个远跳或远调用,以用具有所需值的代码段描述符的选择器加载CS。

        2
  •  1
  •   Brendan    4 年前

    对于80x86;CPU模式与代码大小或指令解码几乎没有关系(主要决定在昂贵的事情中发生什么,如段寄存器加载和降级为微代码的中断处理程序)。

    对于指令解码来说,重要的是代码大小(而不是CPU模式);有三种可能——16位代码、32位代码和64位代码。

    在长模式中,代码大小由代码段描述符中的2位决定。

    在保护模式下,代码大小由代码段描述符中的1位决定(64位代码不是选项)。

    在真实模式(以及其他一些情况下-虚拟8086模式、系统管理模式)中,代码大小“名义上固定”为16位(其中“名义上不变”意味着有办法暂时切换到另一种模式来混淆事情)。

    推荐文章