汇编语言有多少种编写中断程序代码,使每隔3秒钟响一次铃并打印“bell ring”

这有一篇我在十年前写的,原發表在电脑报上楼主

  首先,我们介绍一下中断中断大致可以分为四种类型:

  中断类型 中断号 处理器 0--4h

  软件大部分为int形式,例外:

     1)1Dh1Eh,46h返回在ROM中驻留的硬件参数表格

上表仅是一个粗略的说明随着中断的发展,一些原先保留的中断也有了确定的定义现茬所讲的BIOS中断意指中断0--1Fh。

  中断程序的执行过程简单说来即中断程序在中断向量表中查到中断地址后,保存现场跳到中断地址执行程序,结束后再恢复现场继续执行中断前的程序我们调用中断就与调用一个c程序一样方便。

  BIOS固化于ROM中是其他软件与硬件传递信息嘚桥梁。以应用的角度看它的各个中断程序是我们最感兴趣的。早在DOS时代就有不少关于BIOS的介绍,那么到了Windows纵横天下的时候BIOS又有了什麼变化和发展呢?下面我们将BIOS中断程序按编程的复杂度由简单到复杂度选择进行分析。

  一)开机后BIOS中断程序驻留于内存F0000--FFFFF处,我们可先用DEBUG.EXE 將这内存的内容复制成一个文件例如:

  然后,我们再将内存0:0 --0:700处的内容复制下来此处主要有中断向量表,所用到的BIOS数据区和DOS数据區为了方便查看,以文本形式保存例如:先编写一个批处理文件C.bat,其内容为:

  二)熟悉DEBUG.EXE和PCTOOLS5.0 的用法。它们都是很老的软件了但对付BIOS 还是绰綽有余的(当然还有例外,下文将要讲到)

  三)准备一本汇编方面的书籍。上面一般附有BIOS 中断虽然不太全,但可以作为参考如清華大学计算机系教材《IBM-PC汇编语言有多少种程序设计》。

  四)那就是你必须具有相当熟练的汇编语言有多少种的知识以及对硬件要有一萣的了解,如对8259A8042 等计算机用到的硬件的端口要有比较清楚的认识,最少也得有一本这方面的参考书如我们就参考过《PC系列机系统开发與应用》,《微型计算机原理与汇编语言有多少种》等十几本书籍

  但其中有些地址已经被DOS 修改了。我们可打开bios.dat 查看原来的地址用PCTOOLS 咑开bios.dat,按F2 键入127 ,在相对扇区 127 处偏移E3-122 的地方查到原来的地址。我们以大众MVP3主板(VP3-586B-WB77)上的 AWARD BIOS(日期:98年7月20日)(注:以下都将以此BIOS为例)为例看一看如下图:

  可以看到,确实与0:700处的地址有差别在127 扇区的结尾处,可看到BIOS 的日期及机子型号如:

  如果你用PCTOOLS 查看各扇区,还可發现一些在CMOS SETUP设置时遇到的提示信息如:

  (三)最简单的中断程序

  为了提高自信心,我们先来看一看最简单的中断程序是怎样的

  INT 1B,1CH为提供给用户的软中断即用户如果不对它们进行修改,则它们是仅有一条IRET指令的程序

  INT 12H功能为检查基本内存容量。程序为

  查看地址0:413H的内容为280H,即十进制的640K这说明基本内存为640K。 

  程序仅仅在地址0:46B处填入FF字节我们知道,单步与断点两中断由DEBUG.EXE接管和修改的而其他则由DOS接管。故现在查看一下0:46B已经不是FF了。

  其中地址0:410H字为设备安装标志意义为

  低字节:7,6位:软驱数量(00:1囼;01:2台;10:3台;11:4台)

  54位:显示模式(01:40*25彩色;10:80*25彩色;11:80*25单色;00:上述以外)

  1位:安装协处理器为1

  0位:安装软驱为1

  高字节:15,14位:并行口打印机数

  13位:安装游戏适配器为1

  11-9位:串行口数

  显然这些中断并没有做很多工作。你是不是没想过BIOS程序也有如此简单呢:

  (四)比较简单的中断程序

  在这一节我们将介绍INT 5H以及INT 8H。

  INT 5H为打印屏幕中断其编程思路很简单。程序先做好一些初始化工作如检查屏幕打印状态 ,以及通过INT 17H 检查打印机是否忙碌或纸尽处理好以上过程后,就开始打印了打印调用了INT 17H,烸调用一次打印一个字符程序设计了一个二重循环,内循环判断是否换行外循环判断是否打印结束。就与一对FOR语句嵌套一样

  总嘚说来,这个程序并无多少可看之处不过,我们认为程序中开关中断指令设置的巧极了,它们的位置恰好保护了应该不被中断执行的程序段具有一些"互斥"意味。此外打印时还对一些特殊字符进行了过滤,以空格代之打印

  下面,介绍一下INT 8H--定时器中断程序这里,我们感兴趣的是程序中涉及到了时间那么,它又是如何解决"千年虫"的问题的?原来程序设置了一个子过程,它将年代的高两位取出判断是否为"19XX ",如果不是则可认为是"20XX"年了;如果是,又取出年代的高两位判断是否小于"80",如小于认为到了2000 年,则将年代的高两位标志改為"20"如大于或等于,则认为仍在20世纪

  此外,该程序中还对CMOS 的7071 端口进行了操作,操作中使用了两条相邻的跳转指令JCXZ进行延时以确保对端口的操作准确无误。程序的末尾对8259A主片的20 端口进行了操作。指令为

  当用8259A来实现中断服务程序结束时(返回指令IRET 前)必须给8259A 送一條EOI命令(即AL第五位为 1)。8259A收到这条命令后将中断服务寄存器ISR中的相应位清零,然后才可为其他同优先级的中断源服务

  这个中断程序,唍成了两个基本功能:计时和管理软磁盘驱动器的启动时间每调用一次此中断,时间就增加"一秒"(实际约为55毫秒)当小时标志为18H时,还要判斷"秒"标志是否到了B0H这是为了弥补其计时方法引起的误差所采取的措施。程序在修改“计时器”后还调用了INT 1CH ,紧接着又调用了两个仅包含一条IRET指令的子过程这有什么作用呢?似乎给我们提供了修改此中断的好方法。

  总之INT 8H是一个比较有意思的中断。由于程序不长仅70 餘行,有兴趣的读者不妨将之反编译完整的读一下。

  (五)INT 18H --一个暗伏圈套的中断

  当我们对BIOS进行反编译的时候常常会碰到诸如DB 0F,DB 66等的语句那么,程序中出现这些语句又是什么意思呢先前我们并没有很在意这些语句,仅仅简单的认为它们是在修改BIOS中留下的无用語句(这可是一个可怕的错误)然而,事实告诉我们这里隐藏着一个小秘密。让我们先来看一看这个程序

  程序首先设置了屏幕显示格式,然后调用了子过程(CALL EDA8)一次如果我们以U F000:EDA8翻译它们,则会显示如下语句

  INT 16 ;等待按下任一键

  如果你试读一下,会发现简矗莫名其妙子过程没法读懂。问题出在那呢我们曾经为此费劲脑筋,直到有一次我们尝试着运行这个程序,才发现运行的过程与表媔的显示有所不同最终的结论是,DEBUG给我们开了一个大玩笑----DEBUG不认得这是一条高级指令!!!子过程EDB0处的DB 0F开始之处为一条高级指令大家可鉯参阅INTEL奔腾机的用户参考手册,它其实是JZ指令。真实的子过程为:

  MOV BX3 ;背景为黑色

  INT 10 ;显示当前字符

  由于进行了JZ判断,所以程序進行了一个循环,从而显示了一个提示重新启动的字符串--PRESS A KEY TO REBOOT当然,如果你在WINDOWS下运行这个程序将会得到一个“程序异常结束”的警告,你可鉯将WINDOWS切换到MS_DOS模式下执行这个程序将会重启计算机。大家可以验证一下

  我们从这个程序得到什么启示呢?

  1.不要被表面的现象所洣惑不要想当然。

  2.要有扎实的基础知识只有这样才能发现错误,改正错误

  3.要多实践,不可死背书本

}

《计算机组成原理与汇编语言有哆少种程序设计》复习题

1.8位二进制补码所能表示的十进制整数范围是-128至+127前

者的二进制补码表示为,后者的二进制补码表示为

2.浮点数表礻中,数据的范围由阶码的位数决定数据的精度

4.每条指令由两部分组成,即操作码部分和地址码部分

5.微程序顺序控制常用的两种方式昰增量方式和断定方式。

6. 8086CPU从结构上可以分为执行单元和总线接口单元

7.在控制器中,程序计数器(PC)的作用是存放现行指令的地址并有計数功能。

8.半导体动态RAM靠电容暂存电荷原理存贮信息而半导体静态RAM

靠双稳电路(内部交叉反馈)原理存贮息。

9.操作数有三种类型分别為立即数操作数、寄存器操作数

10.控制器的控制方式有同步控制、异步控制和联合控制三种形式,其中异步控制方式最节省时间同步控制方式最浪费时间。

11.某机器定点整数格式字长8位(包括1位符号位)用二进制表示最小负数的反码为,最大正数的反码为

12.在数的表示范围方面,浮点比定点大在运算规则方面,浮点比定点复杂在运算精度方面,浮点比定点高

和1片SN74182 ,其目的是为了实现16位并行操作。

}

1.1 计算机中常用的计数制有哪些

解:二进制、八进制、十进制(BCD)、十六进制。

1.2 什么是机器码什么是真值?

解:把符号数值化的数码称为机器数或机器码原来的数值叫做机器数的真值。

1.3 完成下列数制的转换

微型计算机的基本工作原理

建立微型计算机系统的整体概念,形成微机系统软硬件开发的初步能力

1.4 8位和16位二进制数的原码、补码和反码可表示的数的范围分别是多少?解:

1.5 写出下列真值对应的原码和补码的形式

1.6 写出符号数B的反碼和补码。

1.7 已知X和Y的真值求[X+Y]的补码。

1.9 请写出下列字符的ASCII码

1.10 若给字符4和9的ASCII码加奇校验,应是多少

}

我要回帖

更多关于 汇编语言有多少种 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信