汇编:键盘中断(int 9)

 键盘中断, 一般按下键盘上的某个按钮就会触发键盘中断.

assume cs:code, ds:data, ss:stack

data segment
	db 128 dup(0)
data ends

stack segment stack
	db 128 dup(0)
stack ends

code segment
	start:	mov ax, stack
		mov ss, ax
		mov sp, 128

		call cpy_new_int9
		call set_old_int9		
		call set_new_int9


testA:		mov ax, 1000H
		jmp testA


		call set_init_int9

		mov ax, 4C00H
		int 21H


;=======================================
set_init_int9:
		mov bx, 0
		mov es, bx

		cli
		push es:[200H]
		pop es:[9*4]
		push es:[202H]
		pop es:[9*4+2]
		sti

		ret
;=======================================
set_new_int9:	
		push bx
		push es

		mov bx, 0
		mov es, bx
		cli
		mov word ptr es:[9*4], 7E00H
		mov word ptr es:[9*4+2], 0
		sti

		pop es
		pop bx

		ret
;========================================
set_old_int9:
		push bx
		push es
		
		mov bx, 0
		mov es, bx
		
		cli
		push es:[9*4]
		pop es:[200H]      ; int9 ip
		push es:[9*4+2]
		pop es:[202H]	   ; int9 cs

		sti
		pop es
		pop bx
		ret
;=========================================
new_int9:
		push ax
		in al, 60H
		pushf

		call dword ptr cs:[200H]

		cmp al, 48H  ; 方向键-- 上  扫描码
		je isUp

		cmp al, 50H  ; 方向键-- 下  扫描码
		je isDown

		cmp al, 3BH  ; F1 扫描码
		jne int9Ret
		call change_screen_color

int9Ret:	pop ax
		iret	

;============================================================
isUp:
		mov di, 160*10+40*2
		mov bx, 0B800H
		mov es, bx
		mov byte ptr es:[di], 'U'
		jmp int9Ret

;============================================================
isDown:
		mov di, 160*10+40*2
		mov bx, 0B800H
		mov es, bx
		mov byte ptr es:[di], 'D'
		jmp int9Ret
;============================================================
change_screen_color:
		push bx
		push cx
		push es

		mov bx, 0B800H
		mov es, bx
		
		mov bx, 1
		mov cx, 2000   ; 整个屏幕是 25行  80列,  1列是2个字节, 所以一行一共160个字节
		
changeColor:	inc byte ptr es:[bx]
		;mov byte ptr es:[bx], 01000001B
		add bx, 2
		loop changeColor

		pop es
		pop cx
		pop bx
		ret
new_int9_end: nop

;========================================
cpy_new_int9:
		mov bx, cs
		mov ds, bx
		mov si, OFFSET new_int9

		mov bx, 0
		mov es, bx
		mov di, 7E00H
		
		mov cx, OFFSET new_int9_end - OFFSET new_int9
		cld
		rep movsb
		ret

code ends

end start

当按下"F1"键,会改变屏幕颜色,  当按 "上方向键",会在屏幕上打印"U", 按“下方向键”,会在屏幕上打印"D"

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值