assume cs:code,ds:data,ss:stack
data segment;定义两个字的空间以存放原来的中断地址
dw 0,0
data ends
stack segment;定义128个字节的栈段,以存储数据
db 128 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,128
mov ax,0
mov es,ax
push es:[9*4];此为IP地址
pop ds:[0]
push es:[9*4+2]
pop ds:[2]
cli;屏蔽中断
mov word ptr es:[9*4],offset wodezhongduan
mov es:[9*4+2],cs
sti;还原中断
;===========以上将原9号中断的处理程序地址存入内存中,并将新的中断地址写入中断向量表中
mov ax,0b800h
mov es,ax
mov di,160*12+80
mov bl,'a'
s: mov es:[di],bl
call xunhuan
cmp bl,'z'
je s3
inc bl
jmp short s
s3: mov ax,0
mov es,ax
push ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2]
mov ax,4c00h
int 21h
wodezhongduan:
push ax;因为要用到AL来与端口通信,所以将它入栈。
push di
in al,60h;获取端口扫描码信息
pushf
call dword ptr ds:[0];调用原来的中断处理程序处理硬件细节
cmp al,1;判断按下的是否是ESC键
jne s1
mov ax,0b800h
mov es,ax
mov di,160*12+80
mov byte ptr es:[di+1],00000100b
s1: pop di
pop ax
iret
xunhuan:
push ax
push dx
mov ax,0
mov dx,1000h
s2: sub ax,1
sbb dx,1
cmp ax,0
jne s2
cmp dx,0
jne s2
pop dx
pop ax
ret
code ends
end start
- [tinyparticle] 没有问题。 09/20 22:30
- [wsrf] 要求是在显示过程中只要按下ESC键,字母的颜色就要发生一次改变。 09/16 08:17
- [huibian2009] 多谢指点,是我太大意了。 09/14 16:29
- [tinyparticle] popf call dword ptr ds:[0] 所以此处只要将标志寄存器入栈就可以 09/11 20:10
- [huibian2009] 多谢您的提醒,使我对汇编又多了一些了解。这里的ASSUME不能省略。再次感谢! 09/11 11:28
- [lwbfq] 没有问题。 09/10 18:59
- [lwbfq] 正确。 09/10 18:59
- [lwbfq] 这个程序有点问题。博主运行一下看看结果就知道了。 09/10 18:58
- [lwbfq] 没问题,博主继续努力。 09/10 18:50
- [wsrf] 没有问题。 09/10 08:34
- [scuzg] 谢谢你的意见,我也希望和同学交流,以提高授课效率。我的QQ是28926141,有空聊聊。 11/12 11:09