CPUID 输出取决于操作顺序

Posted

技术标签:

【中文标题】CPUID 输出取决于操作顺序【英文标题】:CPUID output depends on order of operations 【发布时间】:2013-09-28 23:55:27 【问题描述】:

我正在编写一个玩具操作系统,它应该是一个命令行。我尝试将 CPUID 添加到我的功能中,但当我按连续顺序调用 CPUID 时,我得到了奇怪的结果,即80000002h80000003h80000004h。如果我以任何其他顺序调用它,它工作正常。

连续顺序

另一个订单:

这是代码中有问题的部分。

prcpuinf:
    push dx

    mov eax, 80000002h
    cpuid
    mov [es:cpuinfo+0], eax
    mov [es:cpuinfo+4], ebx
    mov [es:cpuinfo+8], ecx
    mov [es:cpuinfo+12], edx  

    mov eax, 80000003h
    cpuid
    mov [es:cpuinfo+16], eax
    mov [es:cpuinfo+20], ebx
    mov [es:cpuinfo+24], ecx
    mov [es:cpuinfo+28], edx
    mov eax, 80000004h
    cpuid
;    jmp prnt
    mov [es:cpuinfo+32], eax
    mov [es:cpuinfo+36], ebx
    mov [es:cpuinfo+40], ecx
    mov [es:cpuinfo+44], edx
    nop
prnt:

    mov ah, 13h    
    mov ecx, 48;cpulen
    mov bh, 0
    mov bl, 0x07
    mov dh, 3
    mov dl, 3
    mov bp, cpuinfo
    int 10h

    pop dx
    mov ecx, 1
    ret

即使我不复制 CPU 品牌字符串的最后一部分,即取消注释 `jmp prnt 时,代码也会以这种方式运行。

因为这部分本身在一个文件中正常工作,我已经发布了我的整个代码here。

请注意,我不是在寻找解决方案,而是在寻找正在发生的事情的解释。

【问题讨论】:

在一阶中,每个奇数字节是字符,每个偶数字节是它的attributes。为什么会这样?因为AL 指定了子服务,如this question 中所述。将AL 设置为01 以获得您想要的。 @Rhymid 答案在下面的框中! @JensBjörnhager 我知道,我只是想在我提供它作为答案之前把它写得很好;) @Rhymoid 凌晨 3 点写代码不利于中断。谢谢。如果您愿意将您的评论变成答案,我会接受。 我睡得很好,所以我把它变成了一个答案。享受修补您的玩具操作系统的乐趣! :) 【参考方案1】:

简答:始终完全指定AX


我们来看这段代码:

mov ah, 13h
mov ecx, 48;cpulen
mov bh, 0
mov bl, 0x07
mov dh, 3
mov dl, 3
mov bp, cpuinfo
int 10h

您定义了 AHBXCXDXBP。您没有定义AL,它也是INT 10h 接口的一部分。对于AH=13hAL指定子服务,如this question中所述:

AL=0hBP是字符串,BL指定属性,不要更新光标 AL=1hBP为字符串,BL指定属性,更新光标 AL=2h:BP是一串字符属性对,不要更新光标 AL=3h:BP是一串字符属性对,更新光标

我认为实际的实现只是查看AL 的最低有效位,然后决定要做什么。具体来说,在您的情况下,只要设置了AL 的第 1 位,您就会看到乱码文本,但在重置时,您会看到正常文本。

因此,您看到的是乱码还是正常文本取决于最后一次调用CPUID 写入AL 的第1 位的内容。这正是它取决于调用顺序的原因。

【讨论】:

以上是关于CPUID 输出取决于操作顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何解释片上系统 CPU 供应商字符串?

使用 char 数组块作为内存输出操作数的内联汇编

JS - for in 和 for of 的遍历顺序

PostgreSQL 行排序详解

SSE 操作在 2D 数组上实现循环,其中每个输出取决于包含它的 3x3 正方形(生命游戏)

数据结构 顺序表