저는 명령 줄로 간주되는 장난감 OS를 작성하고 있습니다. 내 기능에 CPUID를 추가하려고 시도했지만 연속 된 순서로 CPUID를 호출하면 이상한 결과가 발생합니다 (예 : 80000002h
, 80000003h
, 80000004h
). 다른 순서로 호출하면 정상적으로 작동합니다.CPUID 출력은 조작 순서에 따라 다릅니다.
연속 순서
또 다른 순서 :
이 코드의 잘못된 부분입니다.
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
코드는 JMP PRNT`의 주석 때의 CPU 브랜드 문자열, 즉의 마지막 부분을 복사하지 않는 경우에도이 방식으로 동작합니다.
이 부분은 파일 자체로 정상적으로 작동하므로 전체 코드 here을 게시했습니다.
해결책을 찾고있는 것이 아니라 무슨 일이 일어나고 있는지 설명하고 있습니다.
첫 번째 순서에서는 모든 홀수 바이트가 문자이고 짝수 바이트는 모두 [특성] (https://en.wikipedia.org/wiki/BIOS_color_attributes)입니다. 왜 이런 일이 생길까요? 'AL'은 서브 서비스를 지정하기 때문에 [이 질문에] (http://stackoverflow.com/questions/12556973/how-does-int-10-13h-work-with-attributes)에서 언급했다. 'AL'을 '0'또는 '1'로 설정하여 원하는 것을 얻으십시오. –
@Rhymid 답변은 아래 상자에 들어갑니다! –
@ JensBjörnhager 나는 대답으로 제공하기 전에 그것을 멋지게 작성하고 싶다.) –