专门做继电器的网站,怎么自己做网站免费的,如何自己做游戏网站,网站建设学什么语言编辑好第十五章#xff1a;外中断02 让编程改变世界 Change the world by program 小甲鱼和大家谈谈心 一个帖子引发小甲鱼的反省#xff01; 猫姐曾经说过#xff0c;步子别迈太大#xff0c;容易扯着蛋#xff01; 结果还真蛋疼了…… 因此#xff0c;小甲鱼要学会淡定…第十五章外中断02 让编程改变世界 Change the world by program 小甲鱼和大家谈谈心 一个帖子引发小甲鱼的反省 猫姐曾经说过步子别迈太大容易扯着蛋 结果还真蛋疼了…… 因此小甲鱼要学会淡定面对不能忘记当初的宗旨做视频也好、做网站也好对得住大家才对得住自己的良心 最后希望大家继续支持鱼C、支持小甲鱼看到大家都能坦诚相待很开心很幸福 编写int 9 中断例程 复习一下前边的内容中我们可以总结出键盘输入的处理过程 1键盘产生扫描码 2扫描码送入60h 端口 3一旦侦测到60h端口有动静引发9 号中断 4CPU执行int 9 中断例程处理键盘输入。 以上的过程前三步都由硬件系统自动完成。我们能够改变的只有第四步修改int 9 终端程序。 但是在这门课程中我们不准备完整地编写一个键盘中断的处理程序因为要涉及到一些硬件细节而这些内容脱离了我们的内容主线。 插入语如果有兴趣想更为深入的学习汇编语言探究汇编语言的奥妙可以关注小甲鱼今后推出的《The Art of Assembly Language》。 但是我们却还要编写新的键盘中断处理程序来进行一些特殊的工作那么这些硬件细节如何处理呢 如果单纯要完成这点还是相对比较简单的因为BIOS 提供的int 9中断例程已经对这些硬件细节进行了处理。 我们只要在自己编写的中断例程中调用BIOS 的int 9中断例程就可以了。 任务演示在屏幕中间依次显示 “a”~“z” 并可以让人看清。在显示的过程中按下Esc键后改变显示的颜色。 我们先来看一下如何依次显示“a”~“z” [codesyntax langasm] assume cs:codecode segmentstart: mov ax,0b800hmov es,axmov ah,as: mov es:[160*1240*2],ahinc ahcmp ah,zjna smov ax,4c00hint 21hcode endsend start [/codesyntax] 我们发觉因为一个字母刚显示到屏幕上CPU执行几条指令后就又变成了另一个字母字母之间切换得太快因此我们无法看清。 理想状况是我们应该在每显示一个字母后延时一段时间让人看清后再显示下一个字母。 那么如何延时呢 不如……我们让CPU 执行一段时间的空循环。有时候让它做点无用功哈~ 请看源代码并试图分析作者的做法相关代码下载 现在显示“a”~“z”的任务我们基本完成了并做到可以让人看清虽然做法有些无耻…… 那么接下来将进一步来实现按下 Esc 键后改变显示的颜色怎么办呢 键盘输入到达60h 端口后就会引发 9号中断CPU 则转去执行int 9中断例程。 我们可以编写int 9中断例程功能如下 1从60h端口读出键盘的输入 2调用BIOS 的int 9 中断例程处理其他硬件细节 3判断是否为Esc的扫描码如果是改 变显示的颜色后返回如果不是则直接返回。 接下来我们对这些功能的实现一一进行分析 第一步从端口60h读出键盘的输入 in al,60h 第二步调用BIOS的int 9中断例程 注有一点要注意的是我们写的中断处理程序要成为新的int 9中断例程主程序必须要将中断向量表中的int 9中断例程的入口地址改为我们写的中断处理程序的入口地址。 那么在新的中断处理程序中调用原来的int 9中断例程时中断向量表中的int 9中断例程的入口地址却不是原来的int 9 中断例程的地址。所以我们不能使用int 指令直接调用。 这里有必要解释一下。。。。。。 对于我们现在的问题假设我们将原来int 9中断例程的偏移地址和段地址保存在ds:[0]和ds:[2]单元中。 那么我们在需要调用原来的int 9中断例程时候就可以在 ds:[0]、ds:[2] 单元中找到它的入口地址。 那么有了入口地址后我们如何进行调用呢 当然不能使用指令int 9来调用。我们可以用别的指令来对int指令进行一些模拟从而实现对中断例程的调用。 我们来看int 指令在执行的时候CPU 进行下面的工作 1取中断类型码n 2标志寄存器入栈 3 IF0TF0 4 CS 、IP 入栈 5(IP) (n*4)(CS) (n*42)。 取中断类型码是为了定位中断例程的入口地址在我们的问题中中断例程的入口地址已经知道。 所以我们用别的指令模拟int 指令时候不需要做第1步。 在假设要调用的中断例程的入口地址在ds:0和ds:2单元中的前提下我们将int 过程用下面几步模拟 1标志寄存器入栈 2IF0TF0 3CS、IP入栈 4(IP)((ds)*160),(CS)((ds)*162)。 可以注意到第3、4步和call dword ptr ds:[0]的功能一样。 call dword ptr ds:[0] 的功能也是 1CS 、IP 入栈 2(IP)((ds)*160)(CS)((ds)*162)。 如果这点上有疑问的童鞋不妨可以复习下10.6节的内容。 所以经过我们总结后int 过程的模拟最终变为 1标志寄存器入栈 2IF0TF0 3call dword ptr ds:[0] 对于1可用pushf实现。 对于2我们又得动点歪脑筋没办法资源条件极其卑劣的8086 要么使人放弃要么逼出天才我们可用以下程序间接实现 实现IF0TF0步骤 pushf pop ax and ah,11111100b ; IF和OF为标志寄存器的 ; 第9位和第8位 push ax popf 这样模拟int指令的调用功能调用入口地址在ds:0、ds:2中的中断例程的程序如下 pushf ;标志寄存器入栈 pushf pop ax and ah,11111100b ; IF和OF为标志寄存器的第9 ; 位和第8位 push ax popf ;IF0、TF0 call dword ptr ds:[0] 第三步如果是Esc键的扫描码改变显示的颜色后返回…… 那么下一个问题如何改变显示的颜色 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink hrefhttp://kuai.xunlei.com/d/LWPDSCJPSSUD]视频下载[/Downlink]转载于:https://www.cnblogs.com/LoveFishC/archive/2011/05/27/3846090.html