为int 9H中断新增功能:修改屏幕字符属性

视频参考

功能描述:按F1键修改屏幕字符属性

assume cs:code
stack segment
	db 128 dup(0)
stack ends

code segment
start:
	;设置各寄存器的值
	mov ax,stack
	mov ss,ax
	mov sp,128
	mov ax,0
	mov es,ax
	push cs
	pop ds
	;将int9程序转移到0,204H
	mov si,offset int9
	mov di,204H
	mov cx,offset int9_end - offset int9
	cld
	rep movsb
	;将原中断地址保存在0:200H
	push es:[9*4]
	pop es:[200H]
	push es:[9*4+2]
	pop es:[202H]
	;修改9号中断的程序入口地址,0,204H
	cli	;关中断
	mov word ptr es:[9*4],204H
	mov word ptr es:[9*4+2],0
	sti	;开中断
	mov ax,4c00H
	int 21H

int9:	
    ;保存要使用的寄存器
    push ax
	push bx
	push cx
	push es
	;调用原中断程序
	in al,60H
	pushf    ;flag寄存器入栈
	pushf    
	pop bx
	and bh,11111100b    ;修改IF、TF位
	call dword ptr cs:[200H]	;该程序已经移动到0:204H处,此时cs为0
	;判断按键值
	cmp al,3bH	;F1的扫描码	
	jne int9ret
    ;循环修改屏幕颜色
	mov ax,0b800H
	mov es,ax
	mov bx,1
	mov cx,2000
s:	inc byte ptr es:[bx]
	add bx,2
	loop s
    ;中断返回,寄存器弹出
int9ret:
	pop es
	pop cx
	pop bx
	pop ax
	iret
int9_end: nop
code ends
end start

核心流程:

1.通过in指令将按键的扫描码放入al中

2.模拟int指令,flag入栈、修改IF、TF

3.比较al与自己想检测的按键判断是否要执行自己的逻辑

4.不是检测按键:跳到int9ret,做返回前的必要工作,是检测按键:执行自己的逻辑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值