2013-11-04 24 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標籤之前,或者插入跳轉指令以跳過它。