문제

저는 시스템이 실제로 모든 예쁜 그래픽 아래에서 어떻게 작동하는지에 대해 더 많이 배우려고 노력하고 있습니다. 그래서 저는 현재 BIOS가 시작시 BIOS로드 된 512BYTES에서 메모리를 가지고 놀고 있습니다. 어쨌든, 나는 인터럽트 벡터를 교체하고 있지만 문제가 있습니다. Interupt 09H (키보드)를 교체 한 후 Keypress '메모리 엉망'에서 올바르게 작동합니다. 그러나 아무것도 없습니다. 나중에 모든 키 프레스는 아무것도하지 않습니다. 시스템이 충돌하는지 또는 핸들러에서 무언가를 놓친 지 모르겠습니다. 코드는 다음과 같습니다.

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
도움이 되었습니까?

해결책

키보드 인터럽트를 다루기 위해 노력한 지 오래되었지만, 누락 된 내용은 실제로 키보드 하드웨어를 처리하는 것이므로 인터럽트 조건을 지우고 다른 인터럽트를 생성 할 준비가되어 있다고 생각합니다.

같은 것 :

         in     al, 60h     ; Read input buffer 

전부 일 수 있습니다.

기회가 생기면 키보드 드라이버를 썼을 때 오래된 메모 나 코드가 뒤로 누워 있는지 알 수 있습니다.

다른 팁

내 추측 (키보드 인터럽트 핸들러를 작성한 적이 없음)은 키보드 하드웨어와 대화하여 키 스트로크를 검색해야한다는 것입니다 (그렇지 않으면 키보드는 다음 인터럽트를 생성 할시기를 알지 못합니다).

나는 또 다른 문제를 발견했다. 두 번의 별도의 이동 검사로 ISR에 대한 새로운 인터럽트 벡터를 설정하면,이 모두 이동 검사 사이에서 인터럽트가 발생하고 오래된 위치의 한 부분이있는 깨진 벡터로부터 주소를 얻을 수 있습니다. ISR의 새로운 위치의 다른 부분. 그러나이 위치에는 ISR, 인터럽트 종료에 대한 지침이 없으며 IRET 명령이 없습니다.

이러한 나쁜 이벤트를 방지하기 위해서는 새로운 인터럽트 벡터를 설정하기위한 이동 지침에 CLI와 STI를 배치해야합니다.

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

단도

이것은 단지 거친 추측 일 뿐이지 만 문제는 int 9h 핸들러에서 int 10h를 호출한다는 것입니다. 스크린 메모리를 직접 작성하십시오 (0B800H : 0에서 바이트를 증가시키고 화면의 왼쪽 맨 위에 확인하십시오). 각 Keypress마다 증가하면 int 9h에서 int 10h를 호출하지 않아야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top