2009-05-09 4 views
6

시스템이 실제로 어떻게 작동하는지에 대해 자세히 알고 싶습니다. 그래서 저는 BIOS가 시작시에로드하는 512byte의 메모리를 가지고 놀고 있습니다. 실제로 추측 할 때 부트 로더라고 부를 수는 없습니다. 어쨌든, 나는 인터럽트 벡터를 대체 할 것이지만 문제는있다. interupt 09h (키보드)를 바꾼 후에는 올바르게 작동하고, 키를 누르면 'Memory messing'이 출력됩니다. 하지만 아무것도. 이후의 모든 키 누르기는 아무 것도하지 않습니다. 내 처리기에서 뭔가를 누락하는 경우 시스템이 충돌하거나 경우 나도 몰라, 여기에 코드입니다 :리얼 모드, 인터럽트 벡터 교체 오류가 발생했습니다.

jmp start 
times 100 db 0 ; Cleared space for stack 

start: 
xor ax, ax 
mov ax, start 
sub ax, 80 
mov sp, ax 

mov al, 0x09 ; Interupt number 
mov bl, 4 
mul bl 
mov bx, ax 
xor ax, ax 
mov es, ax 
mov [es:bx], word prints ; My interupt handler 
add bx, 2 
mov [es:bx], word 0x00 

bloader: 
    jmp bloader 

prints: 
    cli 
    push ax 
    push bx 
    push si 
    mov si, msg  ; Message to print 
    mov bl, 0x07 
    mov bh, 0x00 
    printnb: 
     lodsb  ; Grab byte from message 
     cmp al, 0 ; End of message 
     je printf 
     mov ah, 0x0E 
     int 0x10 ; Print byte 
     jmp printnb 
    printf: 
     mov al, 0x20 
     out 0x20, al ; Inform interupt controller interupt has been handled 
     pop si 
     pop bx 
     pop ax 
     sti 
     iret ; Interupt return 

msg db "Memory messing",0 

times 510 - ($ - $$) db 0 
dw 0xAA55 

답변

6

키보드 인터럽트를 처리 한 이후 오랜 시간이 걸렸지 만 키보드 하드웨어를 실제로 처리하고있어 인터럽트 조건을 지우고 다른 인터럽트를 생성 할 준비가되어 있다고 생각합니다. 같은

뭔가 :

  in  al, 60h  ; Read input buffer 

이 걸리는 모든 수 있습니다.

키보드 드라이버를 작성했을 때 이전 메모 나 코드가 돌아 왔는지 확인할 수 있습니다.

+0

cli mov [es:bx], word prints ; My interupt handler mov [es:bx+2], word 0x00 sti 

이 그것을 고정. 로드에 감사드립니다. – Dave

0

이것은 단지 추측이지만, 어쩌면 문제는 INT의 10H 호출하는 것입니다 int 9h 핸들러에서. 화면 메모리에 직접 쓰십시오 (0b800h : 0에서 바이트를 증가시키고 화면의 왼쪽 상단 문자를 확인하십시오). 각 키 누름마다 증가하면 int 9h에서 int 10h를 호출하면 안됩니다.

1

내 생각 엔 키보드 인터럽트 핸들러를 작성한 적이 없다. 키보드 하드웨어와 대화하여 키보드 입력을 검색해야한다. 그렇지 않으면 키보드는 다음 인터럽트를 생성 할시기를 알 수 없다.

1

다른 문제가 발견되었습니다. 두 개의 별도의 이동 명령을 사용하여 ISR에 대한 새로운 인터럽트 벡터를 설정하면이 두 mov 명령 사이에 인터럽트가 발생한 다음 이전 위치의 한 부분과 중단 된 벡터에서 주소를 가져올 수 있습니다 ISR의 새로운 위치의 다른 부분. 그러나이 위치에는 ISR이 없으며 인터럽트 END 및 아무런 지시도없는 명령어가 없습니다.

이러한 나쁜 이벤트를 방지하기 위해 우리는 새로운 인터럽트 벡터를 설정하기 위해 이동 명령 주위에 cli 및 sti를 배치해야합니다. 더크

관련 문제