CPUID 输出取决于操作顺序
Posted
技术标签:
【中文标题】CPUID 输出取决于操作顺序【英文标题】:CPUID output depends on order of operations 【发布时间】:2013-09-28 23:55:27 【问题描述】:我正在编写一个玩具操作系统,它应该是一个命令行。我尝试将 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 时,代码也会以这种方式运行。
因为这部分本身在一个文件中正常工作,我已经发布了我的整个代码here。
请注意,我不是在寻找解决方案,而是在寻找正在发生的事情的解释。
【问题讨论】:
在一阶中,每个奇数字节是字符,每个偶数字节是它的attributes。为什么会这样?因为AL
指定了子服务,如this question 中所述。将AL
设置为0
或1
以获得您想要的。
@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
您定义了 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 位的内容。这正是它取决于调用顺序的原因。
【讨论】:
以上是关于CPUID 输出取决于操作顺序的主要内容,如果未能解决你的问题,请参考以下文章