王爽汇编语言 实验15(中断例程)

实验要求:

安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开如果松开,就显示满屏的“A”,其他键照常处理。
提示:按下一个键时产生的扫描码称为通码,松开一个键产生的码叫做断码。断码 = 通码 + 80h。

掌握:

一、设置中断例程:
1.设置ds:si指向源地址
2.设置es:di指向目的地址
3.设置cx为传输长度
4.设置传输方向为正(cld)
5.设置中断向量表
6.中断代码内容

二、int指令执行时,CPU进行的工作
1 取中断类型码n
2 标志寄存器入栈
3 IF=0,TF=0
4 CS、IP入栈
5 IP = n4, CS = n4+2

三、键盘输入的处理过程:
1、键盘产生扫描码
2、扫描码送入60h端口
3、引发中断
4、CPU执行中断例程,处理键盘输入

思路:

将编写的 int9中断代码放在0:204处,将原来的int9中断向量保存0:200-0:204中,在调用新的int9时,做到先调用原来的int9中断用来处理其他硬件细节
中断代码中要做到先调用原来的int9
则用pushf指令和call dword ptr ds:[200]来模拟int指令

设计代码:

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
		mov di,204h
		mov cx,offset int9end-offset int9
		cld
		rep movsb

		push es:[4*9]
		pop es:[200h]
		push es:[4*9+2]
		pop es:[202h]

		cli
		mov word ptr es:[4*9],204h
		mov word ptr es:[4*9+2],0
		sti

		mov ax,4c00h
		int 21h

int9:   push ax
        push bx
		push cx
		push es

		in al,60h

		pushf                     模拟用来执行原int9的中断例程
		call dword ptr cs:[200h]  因为此段代码在段地址0处,所以此处cs为0

		cmp al,9eh                A的通码为1Eh  断码+80h
		jne int9ret  

		mov ax,0b800h
		mov es,ax
		mov bx,0
		mov cx,2000
s:		mov byte ptr es:[bx],'A'
        mov byte ptr es:[bx+1],7h
		add bx,2
		loop s

int9ret:pop es
        pop cx
		pop bx
		pop ax
		iret

int9end:nop

code ends
end start

运行截图:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值