天天看點

12、王爽《彙編語言》筆記_實驗15

安裝新的int 9中斷例程(按'A'鍵後顯示滿螢幕的'A')

;任務:安裝一個新的int 9中斷例程

;功能:在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		;設定ds:si指向源位址

     mov di,204h		;設定es:di指向目标位址

     mov cx,offset int9end-offset int9    ;設定cx為傳輸長度

     cld                ;設定傳輸方向為正

     rep movsb

;将原來的int 9中斷例程的入口位址儲存在ds:200、ds:202單元中

     push es:[9*4]

     pop es:[200h]

     push es:[9*4+2]

     pop es:[202h]

;在中斷向量表中設定新的int 9中斷例程的入口位址

     cli                ;設定IF=0屏蔽中斷

     mov word ptr es:[9*4],204h

     mov word ptr es:[9*4+2],0

     sti                ;設定IF=1不屏蔽中斷

;結束

     mov ax,4c00h

     int 21h

;新的int 9中斷例程

int9:    push ax

     push bx

     push cx

     push es

     in al,60h          ;從端口60h讀出鍵盤輸入

;對int指令進行模拟,調用原來的int 9中斷例程

     pushf                  ;标志寄存器入棧

     call dword ptr cs:[200h]    ;CS,IP入棧,(IP)=cs:[200h],(CS)=0

;如果是A斷碼,改變目前螢幕的顯示字元

     cmp al,9eh             ;和A的斷碼(1eh+80h)比較

     jne int9ret            ;不等于A時轉移

     mov ax,0b800h

     mov es,ax

     mov bx,0

     mov cx,2000

s:   mov byte ptr es:[bx],41h    ;将A的ASCII碼寫入,改變字元

     add bx,2

     loop s

int9ret:pop es

     pop cx

     pop bx

     pop ax

     iret

int9end:nop

code ends

end start