body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;} div, p, blockquote{line-height: 1em; margin-top: 0.5em; margin-bottom: 0.5em}

任务:安装一个新的 int 9 中断例程,功能:在 DOS 下,按 F1 键后改变当前屏幕的显示颜色,其他的键照常处理。
1、改变屏幕的显示颜色;
改变从 B8000 开始的 4000 个字节中的所有奇地址单元中的内容,当前屏幕的显示颜色即发生改变。
           mov ax , 0b800h
        mov es , ax
        mov bx , 1
        mov cx , 2000
s:        inc byte ptr es:[bx]
        add bx , 2
        loop s
2、其他键照常处理;
可以调用原 int 9 中断处理程序,来处理其他的键盘输入。
3、原 int 9 中断例程的入口地址保存;
因为在编写的新 int 9 中断例程中要调用原 int 9 中断例程处理键盘输入的其他细节,所以,要保存原 int 9 中断例程的入口地址。因为安装程序返回后地址将丢失,所以可以选择将地址保存在 0:200 单元处。这个地方是开辟给中断向量表的,其他程序不能访问,但是向量表用不了这么多。
4、新 int 9 中断例程的安装
可以从 0:204 处开始安装
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:[9*4]        ; 保存原int 9中断例程入口地址
        pop es:[200h]
        push es:[9*4+2]
        pop es:[202h]
        cli        ; 关可屏蔽中断
        mov word ptr es:[9*4] , 204h        ; 设置新的int 9中断例程入口地址
        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]        ; 当9号中断执行的时候(CS)=0
;这里调用原int 9中断例程,我们事先把原9号中断例程的入口地址存放在0:[200]~0:[204]
;之所以要调用原9号中断例程,是因为还要处理其它细节
;eg:扫描码加上ASCII放到键盘输入缓冲区,状态字节放到0040:17

        cmp al , 3bh        ;  F1 键的扫描码是 3bh
        jne int9ret
        mov ax , 0b800h
        mov es , ax
        mov bx , 1
        mov cx , 2000        ; 25*80=2000 一页可以存2000个字符,每个字符要存一个字符属性,25*160=4000
s:      inc byte ptr es:[bx]        ; 循环修改显示页面能存储的所有字符的显示属性
        add bx , 2
        loop s
int9ret:        pop es
        pop cx
        pop bx
        pop ax
        iret
int9end:        nop
code ends
end start

assume cs:code
stack segment
        db 128 dup (0)
stack ends
code segment
start:        mov ax , stack
        mov ss , ax
        mov sp , 128
        mov ax , 4c00h
        int 21h
code ends
end start

安装新的int 9中断例程的更多相关文章

  1. 汇编试验十五:安装新的int 9中断例程

    安装新的int 9中断例程(按'A'键后显示满屏幕的'A') int 9 是外中断,同样,程序编写还是和其他中断例程类似,安装(复制),调用: 不同点是在于,他要从端口读取数据60h, Source ...

  2. 汇编实验15:安装新的int 9中断例程

    汇编实验15:安装新的int 9中断例程 任务 安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,一旦松开后,就显示满屏幕的“A”,其他键照常处理. 预备知识概要 这次实 ...

  3. 实验十五_安装新的int 9中断例程

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

  4. 安装新的int 9中断例程2

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  5. 实验十三_编写、应用中断例程_2 & 总结

    编写并安装int 7ch中断例程,功能为完成loop指令的功能 参数:(cx)= 循环次数,(bx)= 位移 以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int.iret指令执行前后 ...

  6. x86汇编利用int 16h中断实现伪多线程输入

    x86汇编利用int 16h中断实现伪多线程输入 我们都知道,如果想让一个程序,同时又干这个,又干那个,最好的办法就是多线程.这个在高级语言里面已经用烂了. 但是,DOS是只有单线程的.我如果想让程序 ...

  7. 汇编程序52:实验15 安装新的int9中断例程

    assume cs:code ;重写int9中断例程,当按住a后松开,便会产生满屏A stack segment dw dup() stack ends code segment start: mov ...

  8. 王爽 <<汇编 语言>> 13.6 BIOS中断例程应用

    ;名称:ILOVEU程序 ;使用BIOS提供的中断例程 assume cs:code code segment main: ;显示背景22*80 ;dh中放行号 ;dl中放列号 bibi: push ...

  9. linux如何编译安装新内核支持NTFS文件系统?(以redhat7.2x64为例)

    内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修订了旧内核 ...

随机推荐

  1. Hadoop源码篇--Client源码

    一.前述 今天起剖析源码,先从Client看起,因为Client在MapReduce的过程中承担了很多重要的角色. 二.MapReduce框架主类 代码如下: public static void m ...

  2. js生成word中图片处理

    首先功能是要求前台导出word,但是前后台是分离的,图片存在后台,所以就存在跨域问题. 导出文字都是没有问题的(jquery.wordexport.js),但是导出图片就存在问题了: 图片是以链接形式 ...

  3. Java学习笔记14(面向对象七:final、static)

    final:意为最终,不可变,是一个修饰词 有时候一个类地功能被开发好了,不想让子类重写,修改,这里就会用到final关键字 final修饰类: 不可以被继承,但是可以继承其他类 示例: public ...

  4. 分享一个大神自己的blog

    std::sort() 详解 http://feihu.me/blog/ C++11 新特性 http://blog.guoyb.com/2016/09/19/cpp11-all/ unity3d 相 ...

  5. 登陆模块的进化史,带大家回顾java学习历程(一)

    一直在想着写点特别点的东西,让有兴趣学编程的人确实能学到点干货,今天就来随意写写. 大家在网上查找资料看到最多的demo估计就是登陆功能的演示了,为何大家偏爱拿登陆来做demo呢?因为行业应用类程序的 ...

  6. 利用.Net自带的票据完成BaseController的未登陆自动跳转到登陆页功能

    一:定义票据中要记录的字段类 /// <summary> /// 用户存在于浏览器端的身份票据(非持久) /// 非持久 FormsAuthenticationTicket 的isPers ...

  7. 博客已经迁移到 http://imbotao.top 也会同步到这儿

    完全是看到别人搭建的 hexo + github Pages 博客界面很好看,很简洁,自己也喜欢折腾,就鼓捣了一个. 也在阿里云买了自己的域名,个人感觉在博客的样式和功能上花费了太多的时间,不过现在终 ...

  8. 大话python面向对象

    前言 师门中每逢成人礼就要下山历练一番,小掌门今年成人礼,下山也有一段时日.可恰逢年底,今年百姓收成都不是很好,各大店铺也很少招人,再加上学艺不精,小掌门无事可做就只能饿肚子了.后来小掌门饿的实在不行 ...

  9. CountDownLatch源码解析

    一.CountDownLatch介绍 CountDownLatch是在jdk1.5被引入的,它主要是通过一个计数器来实现的,当在初始化该类的构造函数时,会事先传入一个状态值,之后在执行await方法后 ...

  10. python写一个网页翻译器

    import urllib.requesturl='https://fanyi.baidu.com/v2transapi'data={}data['i']=opdata['from']='AUTO'd ...