概述
在屏幕上交替显示a~z,按ESC字体变绿色
- assume cs:code,ds:data
- data segment
- dw 0,0;存放原9号中断的偏移和段地址
- data ends
- code segment
- ;;;;;;;;;;;;;;;;;;;;;;
- ;主程序
- ;;;;;;;;;;;;;;;;;;;;;;
- start:
- ;安装9号中断
- mov bx,data
- mov ds,bx
- mov bx,0
- mov es,bx
- mov ax,es:[9*4]
- mov ds:[0],ax
- mov ax,es:[9*4+2]
- mov ds:[2],ax
- mov word ptr es:[9*4],offset int9
- mov es:[9*4+2],cs
- mov bx,0b800h
- mov es,bx
- jmp restore
- s: mov es:[160*12+2*70],al
- call delay
- cmp al,'z'
- je restore
- inc al
- jmp s
- mov ax,4c00h
- int 21h
- restore:
- mov al,'a'
- jmp s
- delay:
- push ax
- push bx
- mov ax,2000h
- mov bx,0
- s1: sub bx,1
- sbb ax,0
- cmp ax,0
- jne s1
- cmp bx,0
- jne s1
- pop bx
- pop ax
- ret
- ;;;;;;;;;;;;;;;;;
- ;9号中断
- ;;;;;;;;;;;;;;;;;
- int9:
- push ax
- in al,60h
- cmp al,1
- jne int9_rtn
- mov byte ptr es:[160*12+2*70+1],00000010b
- int9_rtn:
- ;模拟中断发生过程
- pushf;保存标志寄存器内容
- ;设置标志寄存器的IF,TF为0
- pushf
- pop ax
- and ah,1100b
- push ax
- popf
- call dword ptr ds:[0];完成push cs,push ip
- pop ax
- iret
- code ends
- end start
需要注意的是es的值是0,因为中断向量表就起始于0地址处,我们知道,中断向量处理例程是在中断向量号乘以4,(相对于0这个基址的偏移),就是中断处理例程的地址,该
地址是16位的,同时在改地址之后的16位,则是改处理例程的段基址,所以在保存中断向量处理例程的时候不但要保存中断处理例程的地址,还要有其段基址,同样在安装钩
子,更换该处理例程的时候也要注意更换基址!!!
最后
以上就是高挑大树为你收集整理的【汇编】自定义9号中断(键盘输入处理中断)的全部内容,希望文章能够帮你解决【汇编】自定义9号中断(键盘输入处理中断)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复