我正在写一个玩具操作系统,它应该是一个命令行。我已经尝试将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 Brand String的最后一部分,即取消注释`jmp prnt。
,代码也会以这种方式运行。因为这部分本身在文件中正常工作,所以我发布了我的整个代码here。
请注意,我不是在寻找解决方案,而是要解释正在发生的事情。
答案 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
您定义了AH
,BX
,CX
,DX
和BP
。您没有定义AL
,它也是INT 10h
的界面的一部分。如果是AH=13h
,则AL
指定子服务,如this question中所述:
AL=0h
:BP
是一个字符串,BL
指定属性,不更新光标AL=1h
:BP
是一个字符串,BL
指定属性,更新光标AL=2h
:BP
是一串字符 - 属性对,不更新光标AL=3h
:BP
是一串字符 - 属性对,更新光标我认为实际的实现只是查看AL
的最低有效位,并决定要做什么。具体来说,在您的情况下,只要设置AL
的第1位,您就会看到乱码文本,但是当它重置时,您会看到正常文本。
因此,您是否看到乱码或普通文本取决于对CPUID
的最后一次调用写入AL
的第1位的内容。这正是它取决于通话顺序的原因。