2014-09-05 2 views
1

나는 문제는 그 INT 화재 한 번만입니다 키보드 인터럽트 핸들러 화재는 한 번만

아래처럼

인터럽트 정의와 중단은 0x09 교체합니다.

키를 여러 번 눌러도 한 번만 실행됩니다.

나는 Virtualbox에서 테스트를 마쳤습니다.

org 0x7c00 

jmp start 

handler: 
jmp handler_code 
cur_x: 
db 0 
handler_code: 
    mov bh,0 
    mov dh, 5 
    mov dl, [cur_x] 
    mov ah, 2 
    int 0x10 

    mov al, 'A' 
    mov cx, 1 
    mov bh, 0 
    mov ah, 0x0a 
    int 0x10 
    add byte [cur_x], 1 

    iret 

start: 
push cs 
pop ds 

push 0 
pop es 
mov bx, 36 

mov word [es:bx], handler 
mov word [es:bx+2], cs 

jmp $ 

times 510 - ($-$$) db 0 
db 0x55 
db 0xaa 

times 1474560 - ($-$$) db 0 

코드가 0x7c00에로드되었습니다. 시작 부분으로 건너 뜁니다. 시작 부분에 인터럽트 교체 루틴이 있습니다. 현재 주소로 jmp하므로 영원히 반복됩니다. 아무것도하지 않는 영원한 루프라도 키를 눌러 핸들러를 작동시킬 수 있습니다. 키를 누르면 발사됩니다. 그러나 다음 번에는 아무 일도 없었습니다.

이상한 건 입니다. 다음 코드를 jmp $ 위에 올리면 인터럽트가 5 번 발생합니다. 그래서 방해 자체가 잘못되지 않은 것처럼 보입니다.

int 9 
int 9 
int 9 
int 9 
int 9 
+0

단지 참고 사항 : 나는 당신에게 주어진대로 코드에서'cs '를 사용할 때 조심할 것입니다. 명시 적으로'org 0x7c00'을 사용하기 때문에, 다른 것을하기 전에'cs'를 0으로 설정해야합니다. 특정 설정에서는 문제가되지 않지만 다른 설정 (즉, 다른 가상 컴퓨터)에서는 문제가 될 수 있습니다. 또한 문제는 원래 'int 9'루틴이 수행하지 않는 작업, 즉 키를 확인하는 것입니다. –

+0

인터럽트는 어디에서 인정합니까? –

+0

'인터럽트를 확인합니다.' 나는 이해하지 못한다. – Taeyun

답변

1

해결되었습니다. 의견에 감사드립니다.

handler: 
jmp handler_code 
cur_x: 
db 0 
handler_code: 
    mov bh,0 
    mov dh, 5 
    mov dl, [cur_x] 
    mov ah, 2 
    int 0x10 


    mov al, 'A' 
    mov cx, 1 
    mov bh, 0 
    mov ah, 0x0a 
    int 0x10 
    add byte [cur_x], 1 

    push ax 
    in al, 0x60 

    mov al, 0x20 
    out 0x20, al 
    pop ax 
    iret 

문제는 인터럽트 승인입니다. 을 추가했습니다.

push ax 
in al, 0x60 
mov al, 0x20 
out 0x20, al 
pop ax 

예상대로 발생합니다.

감사합니다.