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

    技术2022-07-11  100

    实验要求:

    安装一个新的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

    运行截图:

    Processed: 0.013, SQL: 9