王爽汇编(第三版)第15章实验15

写这篇博客的时候,已经快晚上12点了;至于为什么这个时候写,我也不想,无奈失眠。PS:半个小时解决

实验15 安装新的int 9中断例程

安装一个新的 int 9中断例程,功能:在DOS下,按下“A”键后,除非不再松开,如果松开,就显示满屏的“A”,其他的键照看处理。

提示,按下一个键时产生的扫描称为通码,松开一个键产生的扫描码称为断码。断码=通码+80H

这里的程序,其实只要在之前的地方稍微改动下就行了。

我简单的分析下:在按下键盘的一个键时(不松开),会产生一个扫描码(通码),此时的通码会被送入主板上的相关接口的芯片的寄存器中,该寄存器的端口地址为60h。(这些是由硬件自动完成的)

同样的在释放的时候,也会产生一个扫描码(断码),也会被送到端口为60h的寄存器,就是👆说那个,一样的。

当我们按下键时,为松开时,扫描一直都是按下的那个键的通码,这时cpu(如果IF=1),会响应中断,转去执行int9中断例程。

当未修改int9中断例程的时候,按下一个键不松开,键上的内容会一直连续不断的显示在屏幕上,直到你松开那个键。而这些在原来的int9 中断例程中已经实现了,我们不用管。可以直接调用

👇接着我们考虑另外一个问题   /松开,显示满屏的“A”/  当我们按下A键时,应该执行的时原来的int9中断例程。当松开时,显示满屏的A(这个就新的中断例程),那我们只需要,检测松开时的扫描码(断码)是否为A的断码即可。

具体代码如下

assume cs:code

stack segment
db 128 dup(0)
stack ends

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

        mov si,offset int9
        mov ax,0
        mov es,ax

        push cs
        pop  ds

        mov di,204h
        mov cx,offset int9end-offset int9
        cld
        rep movsb

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

        cli                           ; IF设置为0屏蔽中断
        mov word ptr es:[9*4],204h    ;偏移地址
        mov word ptr es:[9*4+2],0     ;段地址
        sti

        mov ax,4c00h
        int 21h

  int9: push ax
        push bx
        push cx
        push es

        in al,60h
        
        pushf
        call dword ptr cs:[200h]

        cmp al,9Eh     ;A的按下的扫描码为1E(通码),9E(断码)
        jne int9ret
        
        mov ax,0b800h
        mov es,ax
        mov cx,2000
        mov bx,0
     s: mov byte ptr es:[bx],'A'
        add bx,2
        loop s

int9ret:pop es
        pop cx
        pop bx
        pop ax
        iret        ;之前忘记加了,就会导致不能返回到源程序
int9end:nop
code ends
end start

下面展示演示过程

由于不能直接上传视频,所以只好链接一下下喽!麻烦各位了,当然嫌麻烦可以不用看,自己上机试试啊!

https://www.bilibili.com/video/bv1pi4y1u72N    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,汇编语言王爽第三版的复习资料汇总如下: 1. 第〇 课程资料:包括课件、源代码、电子书和课后习题答案。 2. 第一 基础知识:介绍了汇编语言的编程思想和硬件系统的结构,以及汇编语言的主体——汇编指令。 3. 第二 寄存器(CPU工作原理):详细介绍了CPU的工作原理和寄存器的作用。 4. 第三 寄存器(内存访问):介绍了如何使用寄存器进行内存访问。 5. 第四 第一个程序:演示了如何编写第一个汇编程序。 6. 第五 [BX]和loop指令:介绍了[BX]和loop指令的使用方法。 7. 第六 包含多个段的程序:介绍了如何编写包含多个段的程序。 8. 第七 更灵活定位内存地址:介绍了如何更灵活地定位内存地址。 9. 第八 数据处理的两个基本问题:介绍了数据处理中的两个基本问题——进位和溢出。 10. 第九 转移指令的原理:介绍了转移指令的原理和使用方法。 11. 第十 call和ret指令:介绍了call和ret指令的使用方法。 12. 第十一 标志寄存器:介绍了标志寄存器的作用和使用方法。 13. 第十二 内中断:介绍了内中断的概念和使用方法。 14. 第十三 int指令:介绍了int指令的使用方法。 15. 第十四 端口:介绍了如何使用端口进行输入输出操作。 16. 第十五章 外中断:介绍了外中断的概念和使用方法。 17. 第十六 直接定址表:介绍了直接定址表的概念和使用方法。 18. 第十七 使用BIOS进入键盘输入和磁盘读写:介绍了如何使用BIOS进行键盘输入和磁盘读写操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值