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 ;设置ds==cs
mov ax,0
mov es,ax ;设置目标段地址为0
mov si,offset int9 ;源地址 为本安装程序的cs:si
mov di,204h ;新例程的安装地址
mov cx,offset int9end-offset int9 ;新例程的大小
cld ;正向传送
rep movsb
push es:[9*4]
pop es:[200h] ;保存原int9例程的偏移地址到0:200单元
push es:[9*4+2]
pop es:[202h] ;保存原int9例程的段地址到0:202单元
cli ;屏蔽了可屏蔽中断
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0 ;设置现在的int9中断向量表
sti ;接收可屏蔽中断
mov ax,4c00h
int 21h
int9:
jmp intStart
pressedFlag: db 0 ;a按下就将这个标志设置为1,松开就设置为0,默认为0
intStart:
push ax
push cx
push es
push di
in al,60h
pushf
call dword ptr cs:[200h] ;调用原int9例程
cmp al,1Eh
je setFlag ;是A按下了
cmp al,9Eh
jne intExit
;是A松开了
mov ax,offset pressedFlag
mov ds,ax
cmp byte ptr ds:[0],1
jne intExit
;以前被按下过,标志为1
;满屏A
mov ax,0b800h
mov es,ax
mov di,0
mov cx,2000
intS:
mov byte ptr es:[di],41h
add di,2
loop intS
;设置标志为0
mov byte ptr ds:[0],0
intExit:
pop di
pop es
pop cx
pop ax
iret
setFlag:
;设置标志为1
mov ax,offset pressedFlag
mov ds,ax
mov byte ptr ds:[0],1
jmp intExit
int9end:
nop
code ends
end start
汇编语言(第3版)实验15安装新的int 9中断例程
最新推荐文章于 2021-10-24 21:16:56 发布