天天看点

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