按下‘A’鍵後,除非不在鬆開,如果鬆開,就顯示滿屏幕的‘A’

 

;安裝一個新的int9中斷例程,功能:在dos下,按下‘A’鍵後,除非不在鬆開,
;如果鬆開,就顯示滿屏幕的‘A’,其他鍵照常處理(鬆開一個鍵的掃描碼稱爲斷碼)
assume cs:code
stack segment
 db 128 dup (0)
stack ends

code segment
start:mov ax,stack
      mov ss,ax
      mov sp,128

      push cs
      pop ds

      mov ax,0
      mov es,ax
     
      mov si,offset int9
      mov di,204h
      mov cx,offset int9end-offset int9   ;將新的int9中斷例程安裝在0:204處
      cld
      rep movsb

      push es:[9*4]
      pop es:[200h]
      push es:[9*4+2]
      pop es:[202h]   ;將原來的int9中斷在中斷向量表中的地址保存到es:[200],es:[202]

      cli    ;置IF=0,不響應可屏蔽中斷
      mov word ptr es:[9*4],204h
      mov word ptr es:[9*4+2],0 ;將新的int9的程序首地址0:204放到中斷向量表中
      sti    ;置IF=1,CPU在執行完當前指令後響應中斷
     
      mov ax,4c00h
      int 21h
 
 int9:push ax
      push bx
      push cx
      push es
      
      in al,60h

      pushf
      call dword ptr cs:[200h]  ;當此中斷執行時(cs)=0

     cmp ax,9eh  ;'A'鍵的掃描碼
     jne int9ret

     
      mov ax,0b800h
      mov es,ax
      mov bx,0
      mov cx,2000
   s: mov byte ptr es:[bx],'A'
      mov byte ptr es:[bx+1],02h
      add bx,2
      loop s

int9ret:pop es
        pop cx
 pop bx
 pop ax
 iret
int9end:nop
;名稱:延時程序
delay:push cx
      mov cx,10ffh
   s1:push cx
      mov cx,10ffh
   s2:nop
      loop s2
      pop cx
      loop s1
      pop cx
      ret    
code ends
end start

上述程序結束後,沒有恢復系統int9在中斷向量表中的地址,用以下程序來恢復其值:

;1 編寫一個程序實現如下功能
;  將從物理地址200h開始處的4個字節複製到9*4物理地址處。
;注:此程序是9號中斷處理程序入口地址修正程序。
;若新的9號中斷處理程序不在200h處,則該程序要做相應更改。(原來的int9中斷向量地址保存在200h處)
assume cs:code
code segment
start:mov ax,0
      mov es,ax
     
      mov ax,es:[200h]             
      mov es:[9*4],ax

      mov ax,es:[202h]
      mov es:[9*4+2],ax
     
      mov ah,4ch
      int 21h
code ends
end start

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章