0

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

连续订单

连续订单

另一个命令:

另一个订单

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

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.

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

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

4

1 回答 1

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=13hAL指定子服务,如本问题所述:

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

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

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

于 2013-09-29T10:21:53.397 回答