我正在编写一个玩具操作系统,它应该是一个命令行。我尝试将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时,代码也是这样运行的。
因为这个部分通常在一个文件中正常工作,所以我已经发布了我的整个代码这里。
请注意,我不是在寻找解决方案,而是想要对正在发生的事情作出解释。
发布于 2013-09-29 10:21:53
简短的回答:总是完全指定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指定子服务,如这个问题中所述
AL=0h:BP是一个字符串,BL指定属性,不要更新游标AL=1h:BP是一个字符串,BL指定属性,更新游标AL=2h:BP是字符-属性对的字符串,不要更新游标。AL=3h:BP是字符-属性对的字符串,更新游标我认为实际的实现只需查看AL中最不重要的部分,并决定要做什么。特别地,在您的情况下,每当设置AL的第1位时,您就会看到乱码文本,但是当它被重置时,您将看到普通文本。
因此,无论您看到的是乱码还是普通文本,都取决于对CPUID的最后一次调用写到了AL的第1位。这正是它取决于呼叫顺序的原因。
https://stackoverflow.com/questions/19072948
复制相似问题