第十五章:外中断03

让编程改变世界

Change the world by program


继续编写int 9中断例程

第三步:如果是Esc键的扫描码,改变显示的颜色后返回。。。。。。

那么,下一个问题:如何改变显示的颜色?

显示的位置是屏幕的中间,即第12行40列,显存中的偏移地址为:160*12+40* 2。所以字符的ASCII码要送入b800:160*12+40*2处。 而b800:160*12+40*2+1 处是字符的属性,我们只要改变此处的数据就可以改变在b800:160*12+40*2 处显示的字符的颜色了。 该程序的最后一个问题是,要在程序返回前,将中断向量表中的ini 9中断例程的入口地址恢复为原来的地址。否则程序返回后,别的程序将无法使用键盘。   经过分析,整理得到完整的程序代码:相关代码下载(http://bbs.fishc.com) 注意,本章中所有关于键盘的程序,因要直接访问真实的硬件,则必须在DOS实模式下运行。 在Windows 2000 的DOS 方式下运行,会出现一些和硬件工作原理不符合的现象。

检测点15.1

安装新的 int 9中断例程

下面,我们将安装一个新的int 9中断例程,使得原int 9中断例程的功能得到扩展。 任务:安装一个新的int 9中断例程 功能:在DOS下,按F1键后改变当前屏幕的显示颜色,其他的键照常处理。

我们进行一下分析:

(1)改变屏幕的显示颜色 怎么改变屏幕的颜色呢? 学习win 32 的朋友立马百度:有相应的函数吗? 其实,我们认真考虑下原理应该不难:改变从B800 开始的4000 个字一节中的所有奇地址单元中的内容,当前屏幕的显示颜色即发生改变。 实现 - - - - > > >   改变屏幕的显示颜色程序[codesyntax lang="asm"]

   mov ax,0b800hmov es,axmov bx,1mov cx,2000
s:  inc byte ptr es:[bx]add bx,2loop s

[/codesyntax]     (2)对于其他键则照常处理,我们可以调用原int 9中断处理程序,来处理其他的键盘输入。   (3)原int 9 中断例程入口地址的保存 因为在编写的新int 9中断例程中要调用原int 9中断例程,所以,要保存原int 9中断例程的入口地址。保存在哪里?显然不能保存在安装程序中, 因为安装程序返回后地址将丢失。我们因此又将目标锁定在0:200单元处。   (4)新int 9中断例程的安装 这个问题在前面己经详细讨论过。 我们可将新的int 9中断例程安装在0:204 处。

这一章中,我们通过对键盘输入的处理,讲解了CPU 对外设输入的通常处理方法。即:

(1)外设的输入送入端口; (2)向CPU 发出外中断(可屏蔽中断)信息; (3)CPU检测到可屏蔽中断信息,如果IF=1,CPU在执行完当前指令后响应中断,执行相应的中断例程; (4)可在中断例程中实现对外设输入的处理。

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

注意:端口和中断机制,是CPU 进行I/O的基础。 安装一个新的 int 9 中断例程。 功能:在DOS 下,按下“A”键后,除非不再松开,如果松开,就显示满屏幕的“A”;其他的键照常处理。

指令系统总结

我们对8086CPU 的指令系统进行一下总结。 读者若要详细了解8086 指令系统中的各个指令的用法 ,可以查看有关的指令手册。

8086CPU提供以下几大类指令:

1、数据传送指令

比如:mov、push、pop、pushf、popf、xchg等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。

2、算术运算指令

比如:add、sub、adc、sbb、inc、dec、cmp、imul、idiv、aaa等都是算术运算指令,这些指令实现寄存器和内存中的数据的算数运算。 它们的执行结果影响标志寄存器的:sf、zf、of、cf、pf、af位。

3、逻辑指令

比如:and、or、not、xor、test、shl、shr、sal、sar、rol、ror、rcl、rcr 等都是逻辑指令。 除了not指令外,它们的执行结果都影响标志寄存器的相关标志位。

4、转移指令

可以修改IP ,或同时修改CS 和IP 的指令统称为转移指令。转移指令分为以下几类: (1)无条件转移指令,比如:jmp; (2)条件转移指令,比如:jcxz、je、jb、ja、jnb、jna等; (3)循环指令,比如:loop; (4)过程,比如:call、ret、retf; (5)中断,比如int、iret。

5、处理机控制指令

这些指令对标志寄存器或其他处理机状态进行设置,比如:cld、std、cli、sti、nop、clc、cmc、stc、hlt、wait、esc、lock等都是处理机控制指令。

6、串处理指令

这些指令对内存中的批量数据进行处理 比如:movsb、movsw、cmps、scas、lods、stos等。 若要使用这些指令方便地进行批量数据的处理,则需要和rep、repe、repne等前缀指令配合使用。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LILZVPKHEGKD']视频下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2011/05/30/3846091.html

外中断03 - 零基础入门学习汇编语言71相关推荐

  1. 外中断02 - 零基础入门学习汇编语言70

    第十五章:外中断02 让编程改变世界 Change the world by program 小甲鱼和大家谈谈心 一个帖子引发小甲鱼的反省! 猫姐曾经说过,步子别迈太大,容易扯着蛋! 结果还真蛋疼了- ...

  2. 转移指令的原理03 - 零基础入门学习汇编语言45

    第九章:转移指令的原理03 让编程改变世界 Change the world by program jcxz指令 jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移 ...

  3. 第一个程序03 - 零基础入门学习汇编语言22

    第四章:第一个程序03 让编程改变世界 Change the world by program 可执行文件中的程序装入内存并运行的原理 在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的 ...

  4. 直接定址表03 - 零基础入门学习汇编语言74

    第十六章:直接定址表03 让编程改变世界 Change the world by program 程序入口地址的直接定址表 我们看下面的问题: 实现一个子程序setscreen ,为显示输出提供如下功 ...

  5. [BX]和loop指令03 - 零基础入门学习汇编语言25

    第五章:[BX]和loop指令03 让编程改变世界 Change the world by program 从上边的课程中,我们可以总结出用cx和loop 指令相配合实现循环功能的三个要点: (1)在 ...

  6. 转移指令的原理01 - 零基础入门学习汇编语言43

    第九章:转移指令的原理01 让编程改变世界 Change the world by program 引言 8086CPU的转移指令分为以下几类: 无条件转移指令 (如:jmp) 条件转移指令 循环指令 ...

  7. 数据处理的两个基本问题05 - 零基础入门学习汇编语言42

    第八章:数据处理的两个基本问题05 让编程改变世界 Change the world by program 实验七:寻址方式在结构化数据访问中的应用 这个程序是到目前为止我们遇到的最复杂的程序,它几乎 ...

  8. 寄存器(CPU工作原理)04 - 零基础入门学习汇编语言09

    第二章:寄存器(CPU工作原理)04 让编程改变世界 Change the world by program 段的概念 错误认识: 内存被划分成了一个一个的段,每一个段有一个段地址. 其实是: 内存并 ...

  9. int指令02 - 零基础入门学习汇编语言65

    第十三章:int指令02 让编程改变世界 Change the world by program 对int.iret和栈的深入理解 问题:用7ch中断例程完成 loop指令的功能. loop  s的执 ...

最新文章

  1. python pytorch fft_PyTorch 中的傅里叶卷积实现示例
  2. java实现高斯赛德尔算法解线性方程组
  3. CentOS 5.4下的Memcache安装步骤(Linux+Nginx+PHP+Memcached)
  4. 第五周实践项目8 8皇后问题的回溯求解_栈结构
  5. 关于魔法方法的一点总结
  6. 2019ICPC(南昌) - The Nth Item(矩阵快速幂)
  7. Kubernetes架构为什么是这样的?
  8. Qt文档阅读笔记-QtConcurrent Progress Dialog Example解析
  9. 佳能G系列领军相机G1X
  10. 如何做好BI项目的规划与实施方案?
  11. HTML基础知识笔记
  12. 关于闰年和平年的每个月有多少天
  13. 给读医大的老铁选购电脑
  14. 牛客网python版本多行输入输出
  15. 湖南大学头歌期中模拟试卷
  16. 2022数据库系统工程师 下午 真题答案
  17. 基于HTML5的年货购物网站前端网页设计
  18. pytorch 训练时候不动了
  19. python 股票数据挖掘_python数据分析之股票实战
  20. linux教程超详细,linux搭建node超详细教程

热门文章

  1. BZOJ 3132 上帝造题的七分钟(二维树状数组)
  2. 浅谈Java的输入输出流
  3. Android项目实战(二十七):数据交互(信息编辑)填写总结
  4. RESTful协议【软件架构】
  5. PHP验证邮箱地址代码
  6. 系统发生 1219 错误。 提供的凭据与已存在的凭据集冲突。
  7. 开题:在移动开发中使用JavaScript进行混合编程提高代码复用率
  8. Python回顾与整理12:执行环境
  9. 安装证书服务:为Web站点启用HTTPS
  10. IOS-Swift开发基础——通知