2013-09-28 2 views
0

저는 명령 줄로 간주되는 장난감 OS를 작성하고 있습니다. 내 기능에 CPUID를 추가하려고 시도했지만 연속 된 순서로 CPUID를 호출하면 이상한 결과가 발생합니다 (예 : 80000002h, 80000003h, 80000004h). 다른 순서로 호출하면 정상적으로 작동합니다.CPUID 출력은 조작 순서에 따라 다릅니다.

연속 순서

Consecutive order

또 다른 순서 :

Another order

이 코드의 잘못된 부분입니다.

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을 게시했습니다.

해결책을 찾고있는 것이 아니라 무슨 일이 일어나고 있는지 설명하고 있습니다.

+0

첫 번째 순서에서는 모든 홀수 바이트가 문자이고 짝수 바이트는 모두 [특성] (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'로 설정하여 원하는 것을 얻으십시오. –

+0

@Rhymid 답변은 아래 상자에 들어갑니다! –

+0

@ JensBjörnhager 나는 대답으로 제공하기 전에 그것을 멋지게 작성하고 싶다.) –

답변

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, DXBP을 정의했다. AL을 정의하지 않았으며 이는 INT 10h의 인터페이스 일부이기도합니다.

  • AL=0h을 : BP은 문자열이며 BL이 속성을 지정 커서를
  • AL=1h를 업데이트하지 : this question에서 언급 한 바와 같이 AH=13h의 경우, AL이, 하위 서비스를 지정 BP는 문자열이며, BL은 속성을 지정하고 커서를 업데이트합니다.
  • AL=2h : BP은 문자 - 속성 쌍의 문자열입니다. 커서를 업데이트하지 마십시오.
  • AL=3h : BP 문자 - 속성 쌍의 문자열입니다, 내가 실제 구현은 단지 AL의 최하위 비트 볼 생각 커서

을 업데이트하고, 무엇을 결정한다. 특히, 귀하의 경우에는 AL의 비트 1이 설정 될 때마다 깨진 텍스트가 표시되지만 다시 설정하면 일반 텍스트가 표시됩니다.

왜곡되거나 정상적인 텍스트가 있는지 여부는 CPUID의 마지막 호출이 AL의 비트 1에 쓴 내용에 따라 다릅니다. 이것이 바로 호출 순서에 의존하는 이유입니다.

관련 문제