汇编语言 第15章 编程 按下F1键换色

assume cs:codesg
codesg segment
start:
	mov ax,cs
	mov ds,ax
	mov si,offset int9								;设置源地址
	
	mov ax,0			
	mov es,ax
	mov di,204h										;设置目的地址
	
	mov cx,offset int9End - offset int9				;循环次数
	cld												;设置DF=0 正向传送
	rep movsb										;将新的9号中断程序安装到指定位置
;----------------------------------以上程序为安装新的9号中断程序到 0200h:4 地址处-----------------------
	mov ax,es:[9*4]									;**注意不是直接 mov word ptr es:[200h],9*4+2  是要保存内存单元 0:9*4 处数据**
	mov word ptr es:[200h],ax						;保存原来的9号中断例程IP  87 E9 00 F0
	mov ax,es:[9*4+2]
	mov word ptr es:[202h],ax						;保存原来的9号中断例程CS
	
	cli																;IF=0 禁止中断发生  防止还没保存好中断例程时 就开始调用用中断例程
	mov word ptr es:[9*4],204h						;设置新的9号中断例程入口
	mov word ptr es:[9*4+2],0
	sti

;--------------------------使用空循环来测试新安装的中断例程 start-------------------------
	mov ax,0ffffh
	mov dx,0ffffh
s1:	sub ax,1
	cmp ax,0
	jne s1
	sbb dx,0				;借位减法
	cmp dx,0
	jne s1
	
	cli												;IF=0 禁止中断发生  防止还没保存好中断例程时 就开始调用用中断例程
	mov ax,es:[200h]
	mov word ptr es:[9*4],ax
	mov ax,es:[202h]
	mov word ptr es:[9*4+2],ax
	sti												;测试完成 回复原来的中断例程
;--------------------------使用空循环来测试新安装的中断例程  end-------------------------
	mov ax,4c00h
	int 21h
	
int9:
	push ax
	push bx
	push cx
	push es
	push si
	
	in al,60h										;从60h端口中读取 键盘输入产生的扫描码
	pushf											;标志寄存器入栈
	call dword ptr es:[200h]
	cmp al,3bh
	jne int9ret
	mov cx,2000
	mov ax,0b800h
	mov es,ax
	mov si,1
s:	inc byte ptr es:[si]
	add si,2
	loop s
	
int9ret:
	pop si
	pop es
	pop cx
	pop bx
	pop ax
	iret

int9End:nop
codesg ends
end start

需要注意的地方
在保存原来的9号中断例程的中断向量时,不是

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

应该将9号中断例程的中断向量保存到对应的内存单元

mov ax,es:[9*4]	
mov word ptr es:[200h],ax	;保存原来的9号中断例程IP  87 E9 00 F0
mov ax,es:[9*4+2]
mov word ptr es:[202h],ax	;保存原来的9号中断例程CS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值