在16位模式下启动时,获得x86 CPU支持的“位”

时间:2017-12-08 13:41:41

标签: assembly x86 x86-16

我正在开发一个x86引导程序并遇到了这个问题(我想这应该是非常简单的,但到目前为止我还没能解决):我想检测CPU主机的位数(例如,如果它只有16位,或支持32位或64位)。

我已经使用了CPUID指令,但它是用486引入的,因此无法检测仅16位与支持32位保护模式(或32位操作数大小)的386兼容CPU在带有前缀的实模式中。

1 个答案:

答案 0 :(得分:1)

检查32位(参见http://www.rcollins.org/ddj/Sep96/Sep96.html):

  • 在执行pushf
  • 时,没有保护模式的16位CPU(8088/8086/80186)将始终设置标志寄存器的高4位(15-12)
  • 80286将始终在pushf上清除高4位(在实模式下运行时)
  • 支持32位的CPU允许使用popf修改实模式中的高4位(但是所有4位应该具有相同的值 - 全部设置或全部清除)

通过使用pushfpopf并修改堆栈上的数据,您可以检查是否可以修改高4位;如果是,它必须是32位CPU。

检查CPUID

  • 确保CPU支持32位(参见上文)
  • 切换到32位模式
  • 检查EFLAGS的第21位是否可以修改(设置和清除);如果该位的值不固定(可以从0更改为1,反之亦然),则支持cpuid指令。