CPUID输出取决于操作顺序

时间:2013-09-28 23:55:28

标签: assembly bios cpuid

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

连续订单

Consecutive order

另一个订单:

Another order

这是代码中令人讨厌的部分。

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 Brand String的最后一部分,即取消注释`jmp prnt。

,代码也会以这种方式运行。

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

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

1 个答案:

答案 0 :(得分:2)

简答:始终完全指定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=13h,则AL指定子服务,如this question中所述:

  • AL=0hBP是一个字符串,BL指定属性,不更新光标
  • AL=1hBP是一个字符串,BL指定属性,更新光标
  • AL=2hBP是一串字符 - 属性对,不更新光标
  • AL=3hBP是一串字符 - 属性对,更新光标

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

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