安裝新的中斷例程9

我們在之前編寫的int9安裝例程基礎上加一個功能
功能:在DOS下,按F1鍵後改變屏幕當前的顯示顏色,其他的按鍵照常處理。
我們簡單分析一下:

(1)改變屏幕的顯示顏色

我們知道,在80x25的彩色字符模式顯示緩衝區中每頁約有4000個字節的內容顯示在屏幕上,因此程序如下:

   mov ax, 0b800h
   mov es, ax
   mov bx, 1
   mov cx, 2000
s: inc byte ptr es:[bx]	;屬性值加1改變顏色
   add bx, 2
   loop s
(2)其他按鍵照常處理

可以調用原有的int9中斷處理程序

(3)原有int9中斷例程的保存

因爲我們在編寫的int9中斷例程中要調用原來的int9中斷例程,因此要保存原有int9中斷例程,顯然不能保存在安裝程序中,因爲安裝程序返回後地址
將丟失,因此我們將地址保存在0:200單元處
(4)新int9中斷例程
我們將新int9中斷例程安裝在0:204單元處
完整的程序如下:

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 si, offset int9
		  
		  mov ax, 0
		  mov es, ax
		  mov di, 204h
		  mov cx, offset int9end - offset int9
		  cld
		  rep movsb
		  
		  
		  
		  ;保存原有int 9號中斷處理程序的入口地址
		  push es:[9*4]
		  pop es:[200h]
		  push es:[9*4+2]
		  pop es:[202h]
		  
		  cli
		  mov word ptr es:[9*4], 204h
		  mov word ptr es:[9*4+2], 0
		  sti
		  
		  mov ax, 4c00h
		  int 21h
		  
	;-----------新的int 9中斷例程-------------	  
	int9: push ax
		  push bx
		  push cx
		  push es
		  
		  in al, 60h	;從端口60h讀出鍵盤的輸入
		  pushf	;標誌寄存器入棧
		  ;CS, IP入棧,IP = n*4, CS = n*4+2
		  call dword ptr cs:[200h]	;對int指令進行模擬,調用原來的int 9中斷例程
		  
		  cmp al, 3bh	;F1鍵的掃描碼爲3bh
		  jne int9ret
		  
		  mov ax, 0b800h
		  mov es, ax
		  mov bx, 1
		  mov cx, 2000
	  s:  inc byte ptr es:[bx]	;屬性值加1改變顏色
		  add bx, 2
		  loop s
		  
  int9ret:pop es
		  pop cx
		  pop bx
		  pop ax
		  iret
  int9end:nop
code ends
end start 

程序執行結果:
在這裏插入圖片描述
總結:
(1)外設的輸入送入端口
(2)向cpu發出外中斷(可屏蔽中斷)信息
(3)cpu檢測到可屏蔽中斷信息,如果IF=1,cpu在執行完當前指令後響應中斷,執行相應的中斷例程
(4)可在中斷例程中實現實現對外設輸入的處理。
端口和中斷機制,是cpu進行I/O的基礎。

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