2013-11-04 5 views
0

어셈블리 클래스에 대한 할당 작업 중입니다.MS-DOS에서 새로운 키보드 인터럽트를 연결하는 데 도움이 필요합니다.

이전에는 타이머 인터럽트 디스플레이를 표시하고 매시간마다 '시계'를 업데이트했습니다.

이 지식을 사용하여 키보드 인터럽트를 대체하려고합니다. 그러나 새 키보드 인터럽트 핸들러 설치를 주석 처리 할 때도 내 프로그램이 MS-DOS 작업을 방해합니다 (즉, 실행 파일을 실행할 수 없으며 'dir', 'cd'및 이와 유사한 명령 만 사용할 수 있습니다).

.model tiny 
.8086 
.code 
     org 100h 
start: 
     jmp setup 

new_key PROC 
     jmp cs: old_key 
new_key ENDP 

setup: 
     mov ax, cs 
     mov ds, ax 

     old_key DD 00000000h 

     MOV AL, 9h     ;+- 
     MOV AH, 35h     ;| Save old_key 
     INT 21h      ;| 
     MOV WORD PTR [old_key],BX 
     MOV WORD PTR [old_key][2],ES 


     ; cli 
     ; PUSH CS      ;| Install new_key 
     ; POP DS      ;| 
     ; LEA DX, new_key 
     ; MOV AL, 9h 
     ; MOV AH, 25h 
     ; INT 21h 


     cli 
     push ds 
     LDS DX,CS:[old_key]   ;+- 
     MOV AL, 9h     ;| Disinstall new_key 
     MOV AH, 25h     ;| 
     INT 21h 
     POP DS 
     STI 


     mov ax, TSR 
     int CALLDOS 

end start 

설치가 주석 처리 된 경우에도 문제가 있으므로 제거 또는 old_key 저장에 문제가 있다고 생각합니다. 그러나 나는 무엇이 잘못되었는지 모른다. 설치 및 제거 코드가 본질적으로 유사한 타이머 인터럽트의 설치/제거 코드가 아니어야합니까?

지원을 부탁드립니다. 미리 감사드립니다.

+0

다소 화제가되어 이전 키보드 인터럽트에 새로운 키보드 인터럽트를 연결하는 데 도움이되었습니다. 그러나 여전히 제거에 도움이되지 않습니다 : http://stackoverflow.com/questions/15119745/assembly-on-dos-tasm-creating-tsr-with-a-new-handler-on-int-21h?rq=1 – 3932695

답변

1
mov ds, ax 

    old_key DD 00000000h 

    MOV AL, 9h     ;+- 

그런 코드와 데이터를 섞어서는 안됩니다. CPU는 old_key에 대한 지식이 없으므로 코드를 실행하려고합니다. 변수를 setup 레이블 앞에 놓거나 점프 명령을 삽입하여 건너 뛰십시오.