《微机原理与接口技术》实验指导书 - 图文

更新时间:2024-04-11 19:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微机原理与接口技术

实验指导书

方义秋 编著

计算机实验教学中心

目 录

实验要求 ?????????????????????????3 第一部分 微机原理及汇编程序设计 ?????????????4

实验一、认识Tddebug集成操作软件?????????????4 实验二、I/O程序设计 ???????????????????9 实验三、分支程序设计???????????????????11 实验四、循环程序设计???????????????????13 实验五、运算类程序设计??????????????????15 实验六、代码转换程序设计?????????????????19 实验七、宏指令应用????????????????????24 实验八、字符串处理????????????????????26 实验九、数据表格处理???????????????????28 实验十、子程序及软中断程序设计??????????????29

第二部分 接口部分实验???????????????????33

实验十一、 PC机内部8259中断应用????????????33 实验十二、 PCI总线中断应用???????????????39 实验十三、8254定时/计数器应用??????????????45 实验十四、8255并行接口应用????????????????53 实验十五、交通灯控制???????????????????58

附录一 TD-PIT-B实验系统的硬件环境 ????????????60

2

实验要求

预习实验内容

1. 2. 3. 实验过程 1. 2. 3. 4.

带上理论课教材、实验指导书及准备的实验程序。

若为接口电路,请关闭电源搭接线路,检查无误后,再开电源。 调试程序,记录结果。

实验结束后,请关闭电源,将各实验器材归位,清洁自己的桌面。

明确本次实验目的及任务,了解和掌握实验所需的理论知识及相关接口芯片的工作原理。 通过阅读示例程序,掌握编程方法及相关技巧。

对每次实验,选择其中一个项题目自己设计编写程序。

编写实验报告 1. 2. 3. 4. 5. 6.

实验题目。

分析设计思想,绘制实验原理图、流程图。 程序清单及相关注释。 分析实验结果。

说明在实验过程中遇到了哪些问题,是如何处理的。 收获体会,不足之处和今后应注意的问题等。

注意事项 1. 2. 3. 4.

实验以前,应确保PCI总线扩展卡与实验箱间扁平电缆连接的正确性。

实验前后应仔细检查实验箱,防止导线、元件等物品落入装置内,导致线路短路、元件损坏。 爱护实验设施,插接、拔取排线时,手握白色插头,不得从线中间拉取。

实验箱电源关闭后,不能立即重新开启。关闭与重新开启之间至少应有30秒间隔。

3

第一部分 微机原理及汇编程序设计

实验一、认识Tddebug集成操作软件

一.

1. 2. 3. 4.

实验目的

熟悉汇编程序的开发过程。 认识Tddebug集成操作软件。

掌握在Tddebug集成环境中编辑、编译、连接汇编语言程序方法。 掌握INT 21H软件中断来调用DOS内部子程序的方法

二. 实验设备

PC微机一台

三. 汇编语言程序的开发过程

汇编语言程序的开发过程如图1.1所示,这个过程主要有编辑、编译、链接几个步骤构成。 调用编辑程序 edit.exe 汇编 编辑 源程序 编辑

1、源程序的编辑

调用编译程序 调用链接程序 tasm.exe或masm.exe tlink.exe或link.exe .exe .asm 汇编 .obj 链接 .com 编译 图1.1 汇编语言程序开发过程

链接 E: > EDIT TEST.ASM

编辑过程就是将源程序输入内存,生成一个扩展名为ASM的文本文件并存入硬盘。 2、源程序的编译

E:>TASM TEST.ASM

编译也称为汇编,就是利用汇编器(如TASM或MASM)对源程序进行编译,生成扩展名为OBJ的目标文件。在编译过程中,检查语法错误,若有错,则不生成目标代码文件,并给出错误信息。根据错误信息应返回到编辑状态,修改源程序。 3、目标程序的链接

E:> TLINK TEST.OBJ

链接过程是利用链接程序(如TLINK或LINK)将用户目标程序和库文件链接、定位,生成扩展名为EXE的可执行文件。链接时,如果链接文件找不到所需要的链接信息,则发出错误信息,不生成可执行文件。 4、调试可执行程序

4

E:>TD TEST.EXE

如果生成的EXE文件运行后,并没有按照设计意图运行,就需要对程序进行调试,找出错误。再对源程序进行修改,即重复进行编辑、编译、链接、调试,直到生成完全正确的可执行文件为止。

四.

1.

Tddebug集成操作软件使用说明

该软件是集编辑(Edit.exe)、编译(Tasm.exe)、连接(Link.exe)和调试(TD.exe)等多

个功能于一体,可在DOS环境下运行,为用户提供了一个学习微机原理的实验平台。 2. 启动Tddebug D:\\wjyl> Tddebug

若启动成功,进入主界面。 3. Tddebug的菜单结构

主菜单 子菜单 菜单说明 Edit 编辑源文件(.asm) Compile —— Compile 编译源文件(.asm) —— Link 连接目标文件(.obj) —— Build All 编译和连接 Pmrun 进入保护模式调试状态 Rmrun —— Run 运行实模式程序(.exe) —— Debug 进入实模式调试状态(.exe) Help 版本信息 Quit 退出Tddebug 4. 菜单选择 (1)快捷键选择主菜单:ALT+热键(E,C,P,R,H,Q)

(2)按左右键或直接使用快捷键在主菜单之间切换。使用上下键可选择子菜单中的菜单项。 5. 执行菜单项

选中要执行的菜单项,键入Enter键,系统弹出对话框,输入需操作的文件名,以Enter键结尾,取消操作按Esc键。

6. 实模式调试窗口说明 (1)键入Alt+R选择Rmrun主菜单的Debug子菜单弹出实模式调试窗口。 此时可能会叠加一个报告无符号表的对话框,按Esc键关闭该对话框。

(2)该窗口实际是Turbo Debugger调试器窗口,简称TD。其窗口的划分如图1-1所示。

主菜单条 代码显示调试区 内存数据显示调试区 寄存器显示调试区 快捷键操作提示区 标志寄存器显示调试区 堆栈显示调试区 图1-1 Turbo Debugger调试窗口划分图 (3)主菜单中包含了File、Edit、View、Run、Breakpoints、Data、Options、Windows和Help共9个菜单项。可使用热键选择相应的菜单。在调试程序或操作调试器中会使用一些快捷键来实现一些功能,下面将列出常用功能的快捷键及实现功能。 ? 快捷键:

F1:显示帮助窗口 F2:设置/清除断点 F4:执行到光标处 F5:放大/缩小窗口 F7:单步执行 F8:单句执行

5

F9:运行程序 F10:激活主菜单

Ctrl+Break:终止程序执行 Alt+X:退出TD Tab:切换焦点区域

? 当焦点区域在寄存器显示区中时:

Ctrl+R:切换16位/32位通用寄存器并显示 Ctrl+I:使光条指示寄存器的内容加1 Ctrl+D:使光条指示寄存器的内容减1 Ctrl+Z:使光条指示寄存器的内容清零 Ctrl+C:手动修改光条指示寄存器的内容 ? 当焦点区域在数据显示区中时:

Ctrl+D:修改数据显示格式

Ctrl+G:指定需要显示的内存区域首地址 Ctrl+S:查找指定的字节值表

Ctrl+C:修改光标当前指示存储单元的内容 ? 当焦点区域在代码显示区中时:

Ctrl+G:指定需要显示的代码区域首地址 Ctrl+S:查找指定的指令

数字键/字符:修改光标当前指示指令

五.

1.

实验内容及说明

实验内容:数据传送实验

1) 编程将数据段中的一个字符串传送到附加段中,并输出附加段中的目标字符串到屏

幕上。参见示例出程序。

2) 修改此程序,采用字符串传送指令完成。 2. 实验中使用DOS功能调用(INT 21H):

参见教材《32位微型计算机原理与接口技术》89页 (1)显示字符串

入口:AH=09H

调用参数:DS:DX=串首地址,‘$’为结束字符。

(2)返回DOS系统

入口:AH=4CH

调用参数:AL=返回码

3.有关字符串的操作指令

参见教材《32位微型计算机原理与接口技术》62页 4. 实验目的:通过对该程序进行调试,查看程序段、数据段、附加段装入内存后的分配情况。单步执行数据传送指令后,观察各个寄存器及数据区的内容。

六.

1. 2. 3. 4.

实验步骤

运行Tddebug软件,选择Edit菜单编写实验程序

使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。 使用Rmrun菜单中的Run运行程序,观察运行结果。

使用Rmrun菜单中的Debug调试程序,查看程序段、数据段、附加段装入内存后的分配情况。单步执行数据传送指令后,观察各寄存器及数据区的内容。过程如下:

6

1) 按F7单步执行,在代码区中有一个三角,表示正在执行的指令。每一条指令的执行

一定会使目标寄存器和状态寄存器发生变化,从相关窗口看结果。 2) 检查内存数据区的内容,关键是找出用户程序的数据段和附加段:

? 方法1:在CPU窗口按Tab键使内存数据显示区成为活动区,按Ctrl+G键,输入:

“DS或ES寄存器的值:偏移地址”,即可显示用户指定的数据区 ? 方法2:选择菜单View| Dump,弹出内存数据显示窗口。 3) 查看执行结果:按Alt+F5,切换到用户窗口。 5.

更改数据区中的数据,考察、调试程序的正确性。

七. 参考程序清单

;数据传送实验,采用相对寻址方式 DDATA SEGMENT ;定义源数据段 MSR DB \LEN EQU $- MSR DDATA ENDS EXDA SEGMENT ;定义附加数据段 MSD DB LEN DUP(?) EXDA ENDS

MYSTACK SEGMENT STACK ;定义堆栈段 DW 20 DUP(?) MYSTACK ENDS CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DDATA,ES:EXDA START: MOV AX,DDATA

MOV DS,AX ;装载数据段寄存器 MOV AX,EXDA MOV ES,AX ;装载附加数据段寄存器 MOV SI,OFFSET MSR MOV DI,OFFSET MSD MOV CX,LEN MOV BX,0

NEXT: MOV AL,MSR[BX] ;开始传输数据 MOV ES:MSD[BX],AL INC BX LOOP NEXT PUSH ES

POP DS ;将附加段寄存器指向的段值赋给数据段寄存器 MOV DX,OFFSET MSD MOV AH,9 INT 21H ;显示字符串 MOV AH,4CH INT 21H ;返回DOS状态

7

CODE ENDS END START

8

实验二、I/O程序设计

一.

1. 2. 3. 4.

实验目的

理解软中断的调用方法及中断过程。

掌握INT 21H软件中断来调用DOS系统I/O子程序的方法。 掌握将存储在内存单元中的数据在屏幕上显示的方法。 掌握从键盘输入信息到内存的方法。

二. 实验设备

PC微机一台

三. 实验预习要求

1.复习DOS功能调用(INT 21H)中用于字符输入(功能号为01H)、字符输出(功能号为02H)、字符串输入(功能号为0AH)以及字符串输出(功能号为09H)的调用方法。参见教材《32位微型计算机原理与接口技术》89页。

2.阅读示例程序,掌握输入/输出方法。

3.从实验内容中任选一道题目,仔细阅读相关的实验要求及说明,编写程序,以便上机调试。

四. 实验内容

1.【示例】:将指定数据区中一个字节的数据以十六进制数形式显示在屏幕上。

设计思路:首先将该数以十六进制数形式分解,然后将每一位分别转换为ASCII码送屏幕显示。其中0H~9H之间的数加30H,即可得0H~9H的ASCII码,而AH~FH的ASCII码,则需再加7H,参见表5-1。参考程序流程如图2-1所示。示例程序参见参考程序清单。 2.编程由键盘输入任意一个字符,将该字符的ASCII码值显示在屏幕上。 3.从键盘输入两个1位十进制数,计算二者之和,并将结果显示在屏幕上。

4.编程由键盘输入任意一位数,将该数以二进制数形式显示在屏幕上,例:5=00000101B

五. 实验说明

存储在内存单元中的数据要显示在屏幕上,必须首先将一个数据区中的数分解为各位不同进制的数(参见表5-1),然后转换为字符,通过DOS功能调用(INT 21H)完成显示。例:

1) 显示单个字符

MOV AH, 02H

MOV DL, 待显示字符的ASCII码 INT 21H 2) 键盘输入并回显

MOV AH, 01H INT 21H

得到按键的ASCII码,存放于AL中

六.

1. 2. 3.

实验步骤

画出实验流程图。

运行Tddebug软件,选择Edit菜单编写实验程序

使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。

9

4. 5. 6. 使用Rmrun菜单中的Run运行程序,观察运行结果。

使用Rmrun菜单中的Debug调试程序。单步执行指令,观察各寄存器及数据区的内容。 更改数据区中的数据,考察程序的正确性。

七. 参考程序清单及流程

;将指定数据区SD的数据以十六进制数形式显示在屏幕上 DATA SEGMENT

MES DB 'Show a as hex:',0AH,0DH,'$' SD DB 'a' DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV DX,OFFSET MES;显示提示信息 MOV AH,09H INT 21H

MOV SI,OFFSET SD MOV AL,DS:[SI]

AND AL,0F0H ;取高4位 MOV CL,4 SHR AL,CL

CMP AL,0AH ;是否是A以上的数 JB C2 ADD AL,07H C2: ADD AL,30H

MOV DL,AL ;显示字符 MOV AH,02H INT 21H

MOV AL,DS:[SI]

AND AL,0FH ;取低4位 CMP AL,0AH JB C3 ADD AL,07H C3: ADD AL,30H

MOV DL,AL ;显示字符 MOV AH,02H INT 21H

MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START

10

图2-1 一个字节数以十六进制数形式显示处理流程

实验三、分支程序设计

一.

1. 2. 3.

实验目的

掌握比较指令、条件转移指令的用法 掌握分支结构程序的组成

掌握分支程序的设计、调试方法

二. 实验设备

PC微机一台

三. 实验预习要求

1.复习比较指令、条件转移指令的用法。

2.阅读示例程序,掌握分支编程方法及相关技巧。

3.从实验内容中任选一道题目,仔细阅读相关的实验要求及说明,编写程序,以便上机调试。

四. 实验内容

1.【示例】判断X的大小,并根据判断结果以不同方式分别显示。

2.键入一个数,判断数是否在5< X<24范围内,是输出标志0,不是输出-1。

3. 编写程序,在屏幕上显示一组菜单,根据键盘输入的菜单编号,提示你选择的菜单名。 4.从键盘输入一个字符,判断该字符是小写字母、大写字母、数字或其他字符,并给出相应的提示。

五. 实验要求及说明

1.判断X的大小,并根据判断结果以不同方式分别显示

设NUMBER单元的数X以及数值N1,N2均为单字节无符号数,请判断X的大小,并根据判断结果分别显示:N1<=X<=N2,或XN2。参见程序清单 2.键入一个数,判断数是否在5< X<24范围内,是输出标志0,不是输出-1

3.编写程序,在屏幕上显示一组菜单,根据键盘输入的菜单编号,提示你选择的菜单名。

假设在屏幕上显示的菜单如下:

1????????????Open 2????????????Save 3????????????Copy 4????????????Exit (Please choose 1,2,3,OR 5)——

若输入1,则显示“I choose Open”后程序结束;若输入2,则显示“I choose Save”后程序结束;若输入3,则显示“I choose Copy”后程序结束;若输入4,则显示“I choose Exit”后程序结束;若输入其它字符,则显示“You press an error key ”后程序结束;

注意可使用宏指令简化程序。

4.从键盘输入一个字符,判断该字符是小写字母、大写字母、数字或其他字符,并给出相应的提示。 数字0~9的ASCII码为30H~39H;大写字母的ASCII码为41H~5AH;小写字母的ASCII码为61H~7AH;

11

六. 实验步骤

1. 画出实验流程图。

2. 运行Tddebug软件,选择Edit菜单编写实验程序

3. 使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。 4. 使用Rmrun菜单中的Run运行程序,观察运行结果。

5. 使用Rmrun菜单中的Debug调试程序。观察构成分支条件的各标志的变化情况及相关寄

存器内容。

6. 更改数据区中的数据,考察程序的正确性。

七. 参考程序清单

;设NUMBER单元的数X以及数值N1,N2均为单字节无符号数,请判断X的大小,并根据判断结果分别显示:N1<=X<=N2,或XN2。 DATA SEGMENT USE16

MESG1 DB ' N1<=X<=N2 $ ' MESG2 DB ' XN2 $ '

NUMBER DB 66 ;无符号数X N1 EQU 22 N2 EQU 88 DATA ENDS

CODE SEGMENT USE16

ASSUME CS:CODE, DS:DATA BEG: MOV AX , DATA MOV DS, AX

MOV DX, OFFSET MESG1 CMP NUMBER, N1

JAE NEXT ;X ≥ N1转 MOV DX, OFFSET MESG2 JMP DISP

NEXT: CMP NUMBER, N2

JBE DISP ;X ≤ N2转 MOV DX, OFFSET MESG3 DISP: MOV AH, 9

INT 21H ;显示结果信息 MOV AH, 4CH

INT 21H ;返回DOS CODE ENDS

END BEG

12

实验四、循环程序设计

一.

实验目的

1.掌握比较指令、转移指令和循环指令的使用方法 2.掌握循环结构程序的组成

3.掌握循环程序的设计、调试方法

二. 实验设备

PC微机一台

三. 实验预习要求

1.复习比较指令、条件转移指令和循环指令。

2.阅读示例程序,掌握循环程序的结构、循环控制方法及相关技巧。

3.从实验内容中任选一道题目,仔细阅读相关的实验要求及说明,编写程序,以便上机调试。

四. 实验内容

1.【示例】求某数据区内负数的个数

2.试编程统计数据区中正数、零和负数的个数。 3. 编程求无符号数字节序列中最大值和最小值。

4.从键盘输入一字符串,搜索该字符串中是否有字符“A”,若有请输出其在串中的位置。

五. 实验说明

1.求某数据区内负数的个数

为统计数据区内负数的个数,需逐个判别区内的每一个数据,然后将所有数据中凡是符号位为1的数据个数累加起来,即得到区内包含负数的个数。参见程序清单. 2.试编程统计数据区中正数、零和负数的个数。 3.编程求无符号数字节序列中最大值和最小值

实验中可使用BH和BL作为暂存现行最大值和最小值,且在初始时将BH和BL初始化为首字节的内容,循环依次比较每个字节的内容,求得最大值(存于BH中)和最小值(存于BL中),送屏幕显示。

4..从键盘输入一字符串,搜索该字符串中是否有字符“A”,若有请输出其在串中的位置。

六.

1.

2. 3. 4. 5. 6.

实验步骤

画出实验流程图。

运行Tddebug软件,选择Edit菜单编写实验程序

使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。 使用Rmrun菜单中的Run运行程序,观察运行结果。

使用Rmrun菜单中的Debug调试程序。观察构成分支、循环条件的各标志的变化情况及相关寄存器内容。

更改数据区中的数据,考察程序的正确性。

七. 参考程序清单

13

;确定数据区NUMB中负数的个数(存放于BL中) DDATA SEGMENT NUMB DB 12H,88H,82H,89H,33H,90H,01H,10H,0BDH,01H MES DB 'The number of negative is:$' DDATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DDATA START:MOV AX,DDATA MOV DS,AX

MOV DI,OFFSET NUMB XOR BL,BL MOV CX,10 A1: MOV AL,[DI] TEST AL,80H JE A2 INC BL A2: INC DI

LOOP A1 MOV DX,OFFSET MES MOV AH,09H INT 21H

MOV AL,BL MOV CX,2 A3: PUSH CX MOV CL,4 ROL AL,CL POP CX MOV BL,AL AND AL,0FH CMP AL,0AH JB A4 ADD AL,07H A4: ADD AL,30H MOV DL,AL MOV AH,02H INT 21H MOV AL,BL LOOP A3

MOV AH,4CH INT 21H CODE ENDS

END START

14

;显示负数个数,注意与实验二所使用的方法的区别

;统计负数个数 实验五、运算类程序设计

一. 实验目的

1.

2. 3.

掌握运算类指令对各状态标志位的影响及其测试方法 掌握运用运算类指令编程及调试的方法 掌握子程序设计及调用方法

二. 实验设备

PC机一台

三. 实验预习要求

1.复习运算类指令的用法。 2.复习子程序设计及调用方法。

3.阅读示例程序,掌握子程序的编程方法及相关技巧。 4.从实验内容中任选一道题目,仔细阅读相关的实验要求及说明,用子程序处理方式编写程序,以便上机调试。

四. 实验内容

1. 示例:二进制双精度加法运算 2. 十进制数的BCD码加减法运算 3. 乘法运算 4. 除法运算

5. 编程用减奇数法开平方

五. 实验要求及说明

80x86指令系统提供了实现加、减、乘、除运算的基本指令,可对表4-1所示的数据类型进行算术运算。

表4-1 数据类型算术运算表

数制 带符号 运算符 操作符 二进制 无符号 组合 +、— 字节(二位数字) +、—、×、÷ 字节、字、多精度 BCD码 非组合 +、—、×、÷ 字节(一位数字) 1. 二进制双精度加法运算

计算X+Y=Z,并将结果输出到屏幕上。其中X=001565A0H,Y=0021B79EH,运算的结果Z=00371D3EH。

(1)本实验是双精度(2个16位,即32位)运算,利用累加器AX,先求低16位和,并存储于低地址存储单元,后求高16位和,再存入高地址存储单元。由于低位和可能向高位有进位,此时CF=1,因而高位字相加语句需用ADC指令,即同时加上CF中的1。参见参考程序清单。

(2)画出X、Y、Z三个数在内存中的分布示意图。

(3)修改示例程序,直接使用32位寄存器和32位加法指令完成本实验功能。 2.

十进制数的BCD码加减法运算

15

计算X-Y=Z,其中,X、Y、Z为非组合的BCD码,X=0400H,Y=0102H,运算结果Z=0208H。 (1)编写两个数值长度不等的BCD码相加程序。 思路:对应位用ADC带进位加法求和(考虑CF标志),再进行DAA调整(只对AL处理。 3.

乘法运算

本实验要求实现十进制数乘法,被乘数和乘数均以BCD码形式存放在内存中,被乘数为02345,乘数为3,运算结果7035,显示在屏幕上为:00 00 07 00 03 05。

(1)调试程序观察加、减、乘、除及相关调整指令,对标志位的影响。 4.

除法运算

本实验要求在内存中存储5个无符号数,将其用101H除,在进行BCD码转换后,若奇偶位为偶(PF=1),则显示“P”;为负(SF=1),则显示“S”;为零(ZF=1),则显示“Z”;若PF、SF、ZF标志皆为0,则显示“;”。

除法指令DIV、IDIV执行后,不影响任何标志位,而BCD码调整指令AAD会影响PF、SF、ZF标志。通过本实验考察这些指令对标志的影响情况。 5.

编程用减奇数法开平方

80x86指令系统中没有开平方指令,因此,开平方运算是通过程序来实现的。用减奇数法可求得近似平方根,获得平方根的整数部分。因为,N个自然数中奇数之和等于N,即:

2?(2K?1)?NK?1n2,展开:

1+3+5=9=3 1+3+5+7=16=4

1+3+5+7+9+11+13+15=64=8

所以,若要做S的运算,就可以从S中逐次减去自然数中的奇数1,3,5,7,??,一直到被减数为0或不够减下一个自然数的奇数为止,然后统计减去自然数的奇数的个数,它就是S的近似平方根。

(1)本实验要求编程实现计算0040H的开平方值,并将运算结果显示在屏幕上。

(2)试编程,由键盘输入一个十六进制数,将其转换为十进制数,并进行开平方运算。

222六.

1. 2. 3. 4. 5. 6. 7.

实验步骤

画出实验流程图。

画出内存数据分布示意图

运行Tddebug软件,选择Edit菜单编写实验程序

使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。 使用Rmrun菜单中的Run运行程序,观察运行结果。

使用Rmrun菜单中的Debug调试程序。单步执行加、减、乘、除及相关调整指令时,观察各标志的变化情况及寄存器、数据区的内容。 更改数据区中的数据,考察程序的正确性。

七.

16

参考程序清单

双精度加法运算 ;计算X+Y=Z

;X=001565A0H,Y=0021B79EH,运算的结果Z=00371D3EH。 DATA SEGMENT

MES DB 'The result is:$' XL DW 65A0H XH DW 0015H YL DW 0B79EH YH DW 0021H DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV DX,OFFSET MES ;显示信息 MOV AH,09H INT 21H

MOV AX,XL ;计算结果 ADD AX,YL MOV BX,AX MOV AX,XH

ADC AX,YH PUSH BX

MOV CX,4 ;显示高位字 MOV DX,AX AGA1: PUSH CX MOV CL,4 ROL DX,CL POP CX MOV AL,DL AND AL,0FH CMP AL,10 JC NEXT1 ADD AL,7 NEXT1: ADD AL,30H MOV AH,0EH INT 10H LOOP AGA1 POP BX MOV AX,BX

MOV CX,4 ;显示低位字 MOV DX,AX AGA2: PUSH CX MOV CL,4

17

ROL DX,CL

POP CX MOV AL,DL AND AL,0FH CMP AL,10 JC NEXT2 ADD AL,7 NEXT2: ADD AL,30H MOV AH,0EH INT 10H LOOP AGA2 MOV INT CODE ENDS END START

18

AH,4CH 21H 实验六、代码转换程序设计

一.

1. 2. 3.

实验目的

了解微机中所使用的各类数制及编码方法。

掌握不同进制数及编码相互转换的程序设计方法,加深对数码转换的理解。 掌握将存储在内存单元中的数据以十六进制数形式、十进制数形式和二进制数形式显示在屏幕上的方法。

二. 实验设备

PC微机一台

三. 实验预习要求

1.复习运算类指令的用法。 2.复习子程序设计及调用方法。

3.阅读示例程序,掌握子程序的编程方法及相关技巧。 4.从实验内容中任选一道题目,仔细阅读相关的实验要求及说明,用子程序处理方式编写程序,以便上机调试。

四. 实验内容

1.【示例】将5位十进制数的数字串转换为一个字的二进制数 2.编写程序将内存中一个字的数转换为十进制数的数字串显示。 3.编程将十进制的数字串转换为BCD码 4.编程将BCD码转换为二进制数

5.编程将二进制数转换为十进制数显示 五. 实验原理及说明

6-1

计算机输入设备输入的信息一般是由ASCII码或BCD码表示的数据或字符,CPU一般均用二进制数进行计算或用其他信息进行处理,处理的结果又必须依照外设的要求变为ASCII码、或BCD码或七段显示码等。因此,在应用软件中,各类数制的转换和代码的转换是必不可少的。计算机与外设间的数码转换关系如图6-1所示,数码对应关系如表6-1所示。

19

6-1

1.

将十进制数的数字串转换为二进制数 十进制数可以表示为:

Dn?10n?Dn?1?10n?1????D0?100?Di?10i

其中Di代表十进制数1、2、3、?、9、0。

上式可以转换为:

ii?D?10

?(((Dn?10?Dn?1)?10?Dn?2)?10???D1)?10?D0

由上式可归纳出十进制数转换为二进制数的方法:从十进制数的最高位Dn开始做乘10加次位

的操作,依次类推,则可求出二进制数结果。 本实验要求将缓冲区中的一个5位十进制数00012的ASCII码转换成二进制数,并将转换结果以十六进制数形式000C按位显示在屏幕上。转换过程的参考程序清单见后参考程序清单1,参考流程如图3-2所示。 修改该示例程序,从键盘任意输入5个数,实现转换并显示。 2.

将内存中一个字的数转换为十进制数的数字串。

十六位二进制数(一个字)的值域为0~65535,最大可转换为5位十进制数。五位十进制数可表示为:

ND?D4?104?D3?103?D2?102?D1?101?D0

因此,将十六位二进制数转换为5位ASCII码表示的十进制数数字串,即采用除10取余方法,分别求D0~D4,并将它们转换为ASCII码。以字符串方式显示在屏幕上。转换部分的参考流程参见图6-4。 假设缓冲区中存放的数是000CH转换成十进制数的数字串后,在屏幕显示“00012”。 3.

将十进制数的数字串转换为BCD码

(1)本实验要求将一个5位十进制数的数字串“54321”的ASCII码存放在数据区中,转换为BCD码后,将转换结果分别显示在屏幕上,即显示:01,02,03,04,05。若输入的不是十进制数的ASCII码,则输出“FF”。提示:一个字节取其低4位即变为BCD码。转换部分的实验参考流程

20

见图6-3。

(2)修改程序,实现从键盘输入5位十进制数54321,转换BCD码后以输入顺序一致显示,即显示:05 04 03 02 01

图6-2 将5位十进制数的数字串转换

为二进制数参考流程

图6-3 将十进制数的数字串转换

为BCD码参考流程

4.

编程将BCD码转换为二进制数

本实验要求将4个二位十进制的BCD码存放在某一段内存单元中,转换出的二进制码存入其后的存储单元中,转换结果以十六进制方式送屏幕显示。转换部分的实验流程参见图6-5。

假设4个十进制数是:17,34,51,68

用BCD码表示为:01H,07H,03H,04H,05H,01H,06H,08H 显示为:0011,0022,0033,0044 六. 实验步骤

1.

2. 3. 4. 5. 6.

画出实验流程图。

运行Tddebug软件,选择Edit菜单编写实验程序

使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。 使用Rmrun菜单中的Run运行程序,观察运行结果。

使用Rmrun菜单中的Debug调试程序。单步执行指令,观察各寄存器及数据区的内容。 更改数据区中的数据,考察程序的正确性。

21

图 6-4 将内存中一个字的数转换为

十进制数的数字串参考流程

图 6-5 将BCD码转换为二进制

数参考流程

七. 参考程序清单

将十进制数的数字串转换为数 DDATA SEGMENT

MES DB 'The ascii code of decimal code are:$'

BUF DB 30H,30H,30H,31H,32H ;十进制00012的ASCII码 DB 10H DUP(0) DDATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DDATA START:MOV AX,DDATA MOV DS,AX

MOV SI,OFFSET BUF MOV BL,0AH ;送被乘数 MOV CX,0004H ;送转换位数 MOV AH,00H

MOV AL,[SI] ;取第一位ASCII码 SUB AL,30H A1: INC SI

IMUL BL ;乘10 ADD AL,[SI] SUB AL,30H

22

LOOP A1 MOV BX,AX MOV DX,OFFSET MES ;显示提示信息 MOV AH,09H INT 21H

MOV AX,BX ;显示结果 MOV CX,4 A3: PUSH CX MOV CL,4 ROL AX,CL POP CX MOV BX,AX AND AL,0FH CMP AL,0AH JB A2 ADD AL,07H A2: ADD AL,30H MOV DL,AL MOV AH,02H

INT 21H MOV AX,BX LOOP A3

MOV AH,4CH INT 21H CODE ENDS

END START

23

实验七、宏指令应用

一.

实验目的

1.熟悉宏指令、宏定义、宏调用以及宏展开的概念,掌握宏指令的定义与调用方法。 2.掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法。 3.了解宏指令与子程序的异同以及各自的使用场合。

二. 实验设备

PC微机一台

三. 实验预习要求

1.复习宏指令的定义与调用方法。 2.复习子程序的定义与调用方法。

2.阅读示例程序,掌握编程方法及相关技巧。

3.从实验内容中任选一道题目,仔细阅读相关的实验要求及说明,编写程序,以便上机调试。

四. 实验内容

1.【示例】利用宏指令分组显示变量中多位二进制数。

2.从键盘输入一个5位的十进制数,定义一个带参数的宏,实现以二进制、十进制、十六进制、八进制数的形式输出。

五. 实验要求及说明

1.【示例】利用宏指令分组显示变量中多位二进制数。

定义CRLF宏指令实现回车换行功能;定义DISP宏指令实现分组(4位一组)显示变量VAR中NN位二进制数。参见程序清单。

2.从键盘输入一个5位的十进制数,定义一个带参数的宏,实现以二进制、十进制、16进制、8进制数的形式输出。

六.

1. 2. 3. 4. 5.

实验步骤

画出实验流程图。

运行Tddebug软件,选择Edit菜单编写实验程序

使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。 使用Rmrun菜单中的Run运行程序,观察运行结果。

使用Rmrun菜单中的Debug调试程序。观察宏调用以及宏展开情况。

七. 参考程序清单

;定义CRLF宏指令实现回车换行功能;

;定义DISP宏指令实现分组(4位一组)显示变量VAR中NN位二进制数。

CRLF MACRO

MOV AH, 0EH MOV AL, 0DH

24

INT 10H

MOV AL, 0AH INT 10H ENDM

DISP MACRO VAR, NN

LOCAL LAST1, LAST2 MOV CH, NN/4 LAST1: MOV CL, 4 LAST2: MOV AL, '0' ROL VAR, 1 ADC AL, 0 MOV AH, 0EH INT 10H DEC CL JNZ LAST2 MOV AL, ' ' INT 10H DEC CH JNZ LAST1 CRLF

ENDM CODE SEGMENT ASSUME CS:CODE NUM DB 88H

BEG: MOV BX, 1234H

DISP BH, 8 ;显示BH中的8位数 DISP BX, 16 ;显示BX中的16位数 DISP NUM, 8 ;显示NUM单元中的8位数 MOV AH, 4CH INT 21H CODE ENDS

END BEG

;定义CRLF宏指令实现回车换行功能;

;定义DISP宏指令实现分组(4位一组)显示变量VAR中NN位二进制数。CRLF MACRO

MOV AH, 0EH MOV AL, 0DH INT 10H

MOV AL, 0AH INT 10H ENDM

DISP MACRO VAR, NN

LOCAL LAST1, LAST2 MOV CH, NN/4 LAST1: MOV CL, 4

25

10-1

(1)中断:

中断就是当系统运行或者程序运行期间在遇到某些特殊情况时,需CPU暂停执行现行程序,自动去处理随机事件,处理完毕后再返回被中断的程序,这一全过程称为中断。处理随机事件的程序,就称为中断服务子程序。中断分为CPU中断(像除法错等)、软件中断(INT n指令而引发的中断)和硬件中断(由CPU以外的器件发出的中断请求信号而引发的中断)。

(2)中断向量

中断向量就是中断子程序的入口地址(由段基址CS和有效地址IP组成,占4个字节)存储在中断向量表中。微机系统中可以使用0—255共256个中断。当80x86系统工作在实模式时,内存的000H~3FFH被用作于中断向量表,向量表中包含了256个中断入口,参见表10-1,且在系统启动时由BIOS或DOS负责初始化。

(3)软中断程序设计

用户可自己开发中断服务程序,用它取代系统原有的服务程序,过程如下: ? 编写中断服务子程序,用IRET指令返回

? 确定使用的中断号n,修改中断向量表中4×n~4×n+3单元的对应中断服务程序入口 ? INT n指令调用中断,此时CPU保护现场:将F、CS、IP寄存器入栈,然后从中断向量

表中4×n~4×n+3单元取出n型中断向量写入IP,CS中,CPU根据CS:IP的值转向服务子程序。

? 当执行IRET时,恢复现场:从堆栈中弹出6个字节传送给IP、CS、F寄存器,回到断点

继续执行。

31

? 程序结束返回DOS之前,要恢复系统的中断向量设置。

六.

1. 2.

实验步骤

运行程序,纪录运行结果。

使用Rmrun菜单中的Debug调试程序。观察在执行CALL指令及INT N指令时堆栈段中数据的变化及程序的流向。

七. 参考程序清单

; 数码转换及显示:实验利用47H号中断将一组字符转换成16进制数码,并在屏幕上显示出来 DDATA SEGMENT CSBAK DW ? IPBAK DW ? MKBAK DB ? SW DW ?

MES DB 'The data in buf1 are:',0AH,0DH,'$' BUF1 DB 11H,22H,33H,44H,55H,66H,77H,88H,99H DB 0AAH,0BBH,0CCH,0DDH,0EEH,0FFH,00H DDATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DDATA START:

MOV AX,DDATA MOV DS,AX MOV AX,0 ;修改47H号中断的中断矢量 MOV ES,AX

MOV DI,4*47H MOV AX,ES:[DI]

MOV IPBAK,AX ;保存原有IP

MOV AX,OFFSET MYINT ;修改为用户自定义中断入口 CLD STOSW

MOV AX,ES:[DI] ;保存原有CS MOV CSBAK,AX MOV AX,SEG MYINT STOSW

MOV DX,OFFSET MES ;显示提示信息 MOV AH,09H

INT 21H;显示BUF1中的内容 MOV SI,OFFSET BUF1 MOV CX,10H

INT 47H ;调用中断服务程序 MOV AX,0 ;恢复系统中断矢量 MOV ES,AX

MOV DI,4*47H MOV AX,IPBAK

32

CLD STOSW

MOV AX,CSBAK STOSW

MOV AH,4CH INT 21H

MYINT PROC FAR PUSH AX PUSH DX

; 返回dos

;自定义显示中断,入口参数为SI,CX

C1: MOV AND PUSH CX MOV CL,4 SHR POP CX

CMP JB C2 ADD C2: ADD MOV MOV INT MOV AND CMP JB C3 ADD C3: ADD MOV MOV INT INC LOOP C1 POP POP IRET MYINT ENDP CODE ENDS END START

AL,[SI] AL,0F0H AL,CL AL,0AH AL,07H AL,30H DL,AL AH,02H 21H AL,[SI] AL,0FH AL,0AH AL,07H AL,30H DL,AL AH,02H 21H SI DX AX

;取高4位

;是否是A以上的数

;显示字符

;取低4位

;显示字符

;中断返回

33

第二部分 接口部分实验

实验十一、 PC机内部8259中断应用

一. 实验目的 1. 2. 3. 4.

进一步认识和理解中断特性。

掌握8259中断控制器的工作原理、编程方法以及PC机如何通过8259A实现对外部可屏蔽硬件中断源的管理。

熟悉实验中涉及到的中断屏蔽寄存器IMR和中断服务寄存器ISR等的使用方法。 进一步掌握中断服务程序的设计方法。

二. 实验设备

PC微机一台

三. 实验预习要求

1.复习中断的概念,了解PC机系统中断向量表的占用情况(见表10-1)。

2.复习8259中断控制器的工作原理,了解PC机中外部可屏蔽硬件中断的处理过程。 3.复习PC机如何通过8259A实现对外部可屏蔽硬件中断源的管理。

4.仔细阅读实验原理、示例程序,掌握中断服务程序的编写方法及相关技巧。

5.从实验内容中任选一道题目,仔细阅读相关的实验要求及说明,编写程序,以便上机调试。

四. 实验内容

1.【示例】编写一键盘中断处理程序:

计算键盘中断次数,并用该程序替换系统键盘中断处理程序,使当按键8次(键盘中断产生16次)后,显示中断次数并结束应用。参见参考程序清单。 键盘中断处理的说明

当从键盘上键入一个键时,键盘上的处理器首先向微机产生硬件中断请求(IRQ1),然后将该键的扫描码传送给主机。而PC主机在IRQ1中断的作用下,调用09H型中断服务程序从键盘接口电路(口地址60H)读入扫描码,并转换成ASCII码,存入键盘缓冲区。

本实验置换系统的09H型中断服务程序,完成对键盘中断次数的统计。在该中断服务程序中,必须对键盘控制器(口地址61H)复位。复位键盘控制器只需读出端口61H的内容,并将最高位置1,再写入该端口。此外,按键按下和抬起均会引起中断,所以实际中断次数等于按键次数乘2。

修改上述程序,将按键的扫描码输出到屏幕上,并统计中断次数。 2.利用系统的1CH型中断(又称外扩的日时钟中断),编写程序,实现每隔2S在屏幕上显示一串字符“TIME TO!”,按任意键停止。

参见《32位微型计算机原理与接口技术》教程8.9章节。

五. 实验原理

硬件中断是由CPU以外的器件发出的中断请求信号而引发的中断。80x86CPU只有两个引脚(INTR和NMI)可以接受外部的中断脉冲,为了管理众多的外部中断源,INTER公司设计了专用

34

的配套芯片——8259A中断控制器 1. 8259A中断控制器简介

8259A中断控制器将中断源优先级排队、辨别中断源以及提供中断向量的电路于一片中,因此无需附加任何电路,只需对8259A进行编程,就可以管理8级中断,并选择优先模式和中断请求方式,即中断结构可以由用户编程来设置。同时,在不需增加其他电路的情况下,通过多片8259A的级连,能构成多达64级的矢量中断系统。8259A的内部结构和管脚如图11-1所示。

11-1

2. 8259A的中断过程,即微机系统响应可屏蔽中断的过程

(1)将加到引脚IR0~IR7上的中断请求寄存到中断请求寄存器中。

(2)在中断屏蔽寄存器的管理下,没有被屏蔽的中断请求被送到优先权电路判优。 (3)选中当前级别最高的中断源,然后从引脚INT向CPU发出中断请求信号。 (4)CPU满足一定的条件后,向8259A发出两个中断响应信号(负脉冲):

1)8259A从引脚INTA收到第1个中断响应信号之后,立即使中断服务寄存器中与被选中的中断源对应的那一位置1,同时把中断请求寄存器中的相应位清0。

2)从引脚INTA收到第2个中断响应信号之后,8259A把选中的中断源类型码n通过数据线送往CPU。

(5)在实模式下,CPU从4×n~4×n+3单元取出该中断源的中断向量→IP,CS,从而引导CPU执行该中断源的中断服务程序。 3. 8259A编程 (1)初始化编程

提供了4个(ICW1~ICW4)初始化命令字,写入命令寄存器组后,就建立了8259A的基本工作方式。系统8259A的初始化编程在微机启动时,由BIOS自动完成。用户不需再对其初始化,更改它的初始化设置。

BIOS对系统8259A初始化为: ? 中断触发方式采用边沿触发。 ? 中断屏蔽方式采用常规屏蔽方式。

? 中断优先级的管理采用完全嵌套即固定优先级方式。IR0的请求级别最高,IR7的请求级别最

低。

? 中断结束,采用常规结束方式。 (2)操作方式编程

将操作命令字OCW1~OCW3写入操作命令寄存器组,对中断处理过程实现动态控制。OCW1~ OCW3各命令格式如图11-2所示。

? OCW1——写中断屏蔽字(对奇地址操作)

35

? ?

? 某位Mi为1,表示对应的中断源IRQi被屏蔽;Mi为0,IRQi被开放。 OCW2——写中断方式命令字(对偶地址操作)

? 设置优先级是否进行循环,循环的方式及中断结束的方式。 OCW3——(对偶地址操作)

? 用来设置特殊屏蔽方式、查询方式

? 用来读8259A的中断请求寄存器IRR,中断服务寄存器ISR、中断屏蔽寄存器IMR的当

前状态。

11-2

4.

PC机系统中8259A的应用

现代PC机系统中包含了两片8259A中断控制器,经级连可以管理15级硬件中断,但其中部分中断源已经被系统硬件占用,具体使用情况如表11-1所示。中断向量表的占用情况见表10-1。

两片8259A的端口地址为:主片在020H~03FH,实际使用020H和021H两个端口;从片在0A0H~0BFH范围,实际使用0A0H和0A1H两个端口。

11-1

5.

8259A的应用编程流程,如图11-3所示。 开发用户中断时,做到以下几点: (1)硬件方面:将外扩中断源的中断请求(由低电平到高电平的跃变)接入选定的中断源IRQi上。

(2)软件方面:

? 置换相应的中断向量,即把用户中断子程序的入口地址写入4×n~4×n+3单元。

? 分别向主从8259A写入屏蔽字,使主片IMR的D2位置0;使从片IMR的Di位置0,开

36

? ?

放用户中断。(即填写OCW1)

每一次中断服务结束,即执行IRET之前,向从片、主片8259A送中断结束命令。(即填写OCW2)

返回DOS之前,写中断屏蔽字OCW1,使主片IMR的D2位置1;使从片IMR的Di位置1,屏蔽用户中断。恢复系统中断屏蔽字、恢复系统中断向量。

11-3 8259A

六. 实验步骤

1.

运行示例程序,按键8次,观察运行结果。

七. 参考程序清单

;按键8次,计算键盘中断次数 DATA SEGMENT CSBAK DW ? IPBAK DW ? MKBAK DB ? DATA ENDS

37

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START PROC FAR

MOV AX,DATA MOV DS,AX

IN AL,21H ;保留8259初始屏蔽字的状态 MOV MKBAK,AL

CLI AND OUT MOV MOV MOV MOV MOV MOV CLD STOSW

MOV MOV MOV STOSW

XOR A1: STI CMP JZ JMP A2: PUSH CLI MOV MOV MOV MOV CLD STOSW

MOV STOSW

MOV OUT STI POP CALL MOV INT RET

38

AL,11111101B 21h,AL AX,0 ES,AX

DI,24H AX,ES:[DI]

IPBAK,AX AX,OFFSET MYINT AX,ES:[DI] CSBAK,AX AX,SEG MYINT DX,DX DX,10H A2 A1 DX AX,0 ES,AX

DI,24H ;IRQ1,09H AX,IPBAK AX,CSBAK AL,MKBAK 21h,AL DX SHWORD AX,4C00H 21H ;关中断

;打开键盘屏蔽 ;修改键盘中断的中断矢量 ;IRQ1,09H,24H=09H*4 ;写入IP ;写入CS ;清计数器 ;开中断

;是否按了8次键 ;是,结束程序运行 ;否则继续等待键盘中断 ;保存计数值 ;关中断 ;恢复系统中断矢量 ;恢复系统8259屏蔽字 ;开中断 ;显示计数值 START ENDP MYINT PROC FAR STI INC DX IN AL,60H IN AL,61H MOV AH,AL OR AL,80H OUT 61H,AL CLI MOV AL,61H OUT 20H,AL

IRET MYINT ENDP

SHWORD PROC NEAR MOV CX,4 AGA: ROL DX,4 MOV AL,DL AND AL,0FH CMP AL,10 JC NEXT2 ADD AL,7 NEXT2: ADD AL,30H MOV AH,0EH INT 10H LOOP AGA RET

SHWORD ENDP CODE ENDS

END START

;自定义键盘中断处理程序 ;开中断 ;计数加一

;读入扫描码(用户可对此键值进行处理)

;读入控制字节

;复位键盘 ;关中断

;中断结束命令送中断控制器 ;中断返回

;2→16进制显示

39

实验十二、 PCI总线中断应用

一. 实验目的 1. 2. 3. 4.

掌握使用PCI中断的方法。

了解操作PCI设备I/O端口的方法。

进一步掌握8259中断控制器的工作原理、编程方法以及PC机如何通过8259A实现对外部可屏蔽硬件中断源的管理。

进一步掌握中断服务程序的设计方法。

二. 实验设备

PC机一台,TD-PIT-B实验装置一套。

三. 实验预习要求

1.复习中断的概念,了解PC机系统中断向量表的占用情况(见表10-1)。

2.复习8259中断控制器的工作原理,了解PC机中外部可屏蔽硬件中断的处理过程。 3.复习PC机如何通过8259A实现对外部可屏蔽硬件中断源的管理。

4.仔细阅读实验说明、示例程序,掌握PCI总线中断服务程序的编写方法。 5.根据实验内容,仔细阅读相关的实验要求及说明,编写程序,以便上机调试。

四. 实验内容

1.【示例】编写一实验程序,利用实验装置提供的中断源,完成每按动一次脉冲开关,产生一次中断,向显示器输出字符“7”。 2.修改示例程序,控制中断响应次数为10次,即当第11次以后按动脉冲开关,屏幕上不再显示“7”。 五. 实验说明

1.TD-PIT-B实验系统编程信息简要说明

(1).本实验的接口电路是在PD-PIT-B实验装置上搭接完成,而PC机作为主机控制该实验装置。二者之间通过PCI总线扩展卡及转接逻辑在PD-PIT-B实验装置上提供了一个仿真ISA的总线接口,用户可以基于该接口对常用接口芯片进行应用编程。TD-PIT-B实验系统的硬件环境,参见附录。

(2).要利用仿真ISA的总线接口资源,扩展接口电路,首先必须掌握实验装置获取的系统配置资源,即PCI总线资源配置的有关内容。

执行PCI_BIOS.EXE,获取实验用PCI总线扩展卡分配的地址空间及中断请求线。假设执行PCI_BIOS.EXE后屏幕显示:

从以上获取的信息可知道,本实验用的PCI总线扩展卡申请了:

40

4个I/O空间(最后一位为1来表示),其首地址分别是:0B800H,0BC00H,0C000H,0C400H。

? 一个存储器空间(最后一位为0来表示),其首地址是:5000000H。 ? 一个中断请求IRQ9 (3).确定TD-PIT-B实验装置中各接口电路所使用的端口地址

本系统中PCI配置空间的首地址是PCI总线扩展卡申请的第一个I/O空间(即BASE 0)。所以PCI各控制寄存器的地址定义为:

BASE 0的首地址0B800H + 各控制寄存器的偏移地址

而I/O部分实验使用的是PCI总线扩展卡申请的第三个I/O空间(即BASE 2)。各I/O接口芯片的端口地址定义为:

BASE 2的首地址0C000H + 各端口的偏移地址

2.实验说明及处理流程

本实验使用实验装置提供的中断请求信号IRQ,利用KK1的负脉冲作为中断源,每按一次KK1,在中断处理中完成字符“7”的显示。

使用实验装置提供的IRQ信号,除了要操作PC机的8259寄存器,还需要操作TD-PIT-PCI总线扩展卡上的控制寄存器“INTCSR”和“IMB4”,才可以实现中断的初始化、清除等。

? PCI_BIOS.EXE实验装置获取的系统配置资源,确定控制寄存器INTCSR(偏移38H~ 3BH)

和IMB4寄存器(偏移1FH)的端口地址:

BASE 0的首地址0B800H + 各控制寄存器的偏移地址

及中断号IRQ9。

? 初始化PCI中断

(1) 初始化INTCSR:向INTCSR的端口写入003F1F00H,即0B838H写00H,0B839H

写1FH,0B83AH写3FH,0B83BH写00H。

(2) 初始化中断向量:在修改中断入口地址时,建议先保存原来的入口地址。查表7-1获

得IRQ9对应的中断向量号为71H,中断入口地址即为01C4H,并将该地址保存,替换为用户自己的中断服务程序入口地址。

(3) 设置PC机8259中断屏蔽寄存器,对应位为0,允许中断。21H中设置0~7号屏蔽位,

A1H中设置8~15号屏蔽位。同样保存原先的屏蔽位。IRQ9号中断须将A1H中的位1置0。

? 清除实验用中断的中断源

(1) 清PCI板卡的中断标志:对IMB4寄存器的第3字节(IMB_BYTE3)做一读操作,

端口地址为0B81FH,然后向INTCSR第2字节(0B83AH)写入3FH。

(2) 清PC机8259中断标志:设置8259的OCW2,复位中断标志。(IRQ9中断向A0H写

入61H,向20H写入62H。)

(3) 退出程序返回DOS时恢复系统的初始化的设置:首先将保存的屏蔽命令字恢复到屏

蔽寄存器中,中断服务程序入口的段地址和偏移地址恢复到中断向量表中,然后返回DOS。

? 参考实验流程如图12-1所示。 六. 实验步骤 1. 2. 3. 4.

分析程序,画出实验流程图。

用排线将KK UNIT中的KK1脉冲开关与仿真ISA总线中的IRQ信号连接。打开实验箱电源。 运行程序,按动KK1,观察运行结果。 注意保留该程序,以便后续程序使用。

?

41

12-1

七. 参考程序清单

;先执行PCI_BIOS.EXE,获得PCI板卡申请的第一个I/O空间的首地址及 ;中断号,修改下面CPU访问PCI操作寄存器的端口地址。 ;由中断号确定相应中断向量及OCW1、OCW2命令字。

INTCSR_BYTE0 EQU 9438H ;修改PCI操作寄存器的端口地址 INTCSR_BYTE1 EQU 9439H INTCSR_BYTE2 EQU 943AH INTCSR_BYTE3 EQU 943BH IMB4_BYTE3 EQU 941FH

DATA SEGMENT CSBAK DW ? IPBAK DW ? MKBAK DB ? DATA ENDS CODE SEGMENT

42

ASSUME CS:CODE,DS:DATA

START: CLI

MOV AX,DATA MOV DS,AX

;初始化PCI寄存器 MOV DX,INTCSR_BYTE0 MOV AL,00H OUT DX,AL

MOV DX,INTCSR_BYTE1 MOV AL,1FH OUT DX,AL

MOV DX,INTCSR_BYTE2 MOV AL,3FH OUT DX,AL

MOV DX,INTCSR_BYTE3 MOV AL,00H OUT DX,AL

;保存和替换中断入口地址 MOV AX,0000H MOV ES,AX

MOV DI,01CCH ;INT 73H,01CCH=73H*4,根据中断号修改 MOV AX,ES:[DI]

MOV IPBAK,AX ;IP MOV AX,OFFSET MYINT CLD STOSW

MOV AX,ES:[DI] ;CS MOV CSBAK,AX MOV AX,SEG MYINT STOSW

;保存中断屏蔽字寄存器内容 IN AL,0A1H MOV MKBAK,AL

AND AL,0F7H ;打开中断屏蔽位,根据中断号修改 OUT 0A1H,AL

STI ;等待 A1: NOP

CALL BREAK JMP A1

;========中断服务程序=========== MYINT: PUSH DS PUSH AX

43

PUSH DX

;清PCI板中断标志 MOV DX,IMB4_BYTE3 IN AL,DX

MOV DX,INTCSR_BYTE2 MOV AL,3FH OUT DX,AL

;清8259中断标志

MOV AL,63H ;根据中断号修改 OUT 0A0H,AL MOV AL,62H OUT 20H,AL ;显示字符‘7’ MOV AH,0EH MOV AL,37H INT 10H POP DX POP AX POP DS IRET

;检测是否有键按下程序 BREAK PROC NEAR PUSH DS MOV AH,06H MOV DL,0FFH INT 21H JE RETURN

POP DS

CLI

;恢复中断屏蔽命令字

MOV AL,MKBAK OUT 0A1H,AL

;恢复中断入口地址 MOV AX,0000H MOV ES,AX

MOV DI,01CCH ;INT 73H,01CCH=73H*4 MOV AX,IPBAK CLD STOSW

MOV AX,CSBAK STOSW

MOV DX,INTCSR_BYTE1 MOV AL,00H OUT DX,AL

44

,根据中断号修改 STI

MOV AX,4C00H INT 21H RETURN:POP DS RET BREAK ENDP

CODE ENDS

END START

45

实验十三、8254定时/计数器应用

一. 实验目的

1.

2. 3.

掌握8254的工作方式及应用编程。 掌握8254的典型应用电路的接法。

学习8254在PC系统中的典型应用方法。

二. 实验设备

PC机一台,TD-PIT-B实验装置一套。

三. 实验预习要求

1.复习8254的工作原理、六种工作方式各自的特点。

2.复习8254的控制字格式、读/写操作方式以及如何进行初始化编程等。

3.仔细阅读实验原理、说明、示例程序,掌握8254多个方向的应用设计方法及电路连接方式。 4.根据自选实验内容,仔细阅读相关的实验要求及说明,编写程序,以便上机调试。 四. 实验内容 1. 2. 3.

【示例】计数应用实验:编写程序,应用8254的计数功能,用开关模拟计数。使每当按动开关KK1五次后,产生中断,并在屏幕上显示一个字符“M”。

定时应用:自己编写程序,应用8254的定时功能,将屏幕设计为一个秒表。 电子发声:自己编写程序让实验装置上的扬声器和PC机上的扬声器唱歌。

五. 实验原理

8254是Intel公司生产的可编程间隔定时器。是8253的改进型,比8253具有更优良的性能。8254具有以下基本功能:

(1)有3个独立的16位计数通道;

(2)每个计数器可按二进制或十进制(BCD)计数; (3)每个计数器可编程工作在6种不同工作方式;

(4)每个计数器允许的最高计数频率为10MNZ(8253为2MHZ); (5)有读回命令(8253没有),可以读出当前计数单元的内容和状态寄存器内容;

13-1

图13-1是8254的内部结构框图和管脚图。它是由与CPU的接口、内部控制电路和三个计数器组成。 三个独立的计数器,每个计数器的结构完全相同,如图13-2。

46

数据总线 3个引角:GATEi——门控信号输入端 CLKi——计数脉冲输入端 计数初值寄存器 OUTi——信号输出端

GATEi 16 位减 1 计数器 OUTi CLKi 输出锁存器

图13-2 计数器结构示意图

1、工作过程:

(1) 初始化时,程序员将计数初值写入计数初值寄存器,自动送入16位减1计数器。计数初值

N=fCLKi÷fOUTi

(2) 当GATEi=1时,每一个CLKi信号的下降沿使减1计数器减1,锁存器随之变化。 (3) 当计数值减到规定值时,OUTi端产生输出信号。 2、8254的工作方式:

方式0——计数结束输出正跃变信号(可作为中断请求信号)

方式1——单脉冲发生器(形成负脉冲,宽度=N×CLK脉冲周期) 方式2——分频器(输出固定频率的脉冲)

图 13-3 方式2波形图 图 13-4 方式3计数值为奇数时的波形

方式3——方波发生器

方式4——软件触发的单脉冲发生器(输出负脉冲,宽度为一个CLK周期) 方式5——硬件触发的单脉冲发生器(输出负脉冲,宽度为一个CLK周期) 3、8254端口地址:

当CS=0时,地址总线的A1 A0组合(00~11),确定选择0#、1#、2#计数器及控制寄存器 A1A0=00,选中0# 计数器 对应端口的偏移地址是: 40H A1A0=01,选中1# 计数器 41H A1A0=10,选中2# 计数器 42H A1A0=11,选中控制寄存器 43H 4、8254的控制字:

控制字有两个: 方式控制字 共用一个地址,由标识位来区分。 读回控制字 方式控制字用来设置计数器的工作方式,其命令格式如表13-1所示。

读回控制字格式如表13-2所示。当读回控制字的D4位为0时,由该读回控制字D1~D2位指定的计数器的状态寄存器内容将被锁存到状态寄存器中。状态字格式如表13-3所示。 5、8254初始化编程步骤

一步:向控制寄存器写入控制字,确定使用的计数器及工作方式。

47

二步:向使用的计数器写入计数初值。

13-1

13-2

001 = 选中计数器0

13-3

010 = 选中计数器1 100 = 选中计数器2

六. 实验说明及步骤

1、确定8254端口地址

执行PCI_BIOS.EXE,获取实验用PCI总线扩展卡分配的地址空间及中断请求线。确定8254芯片所使用的端口地址:

本系统中I/O部分实验使用的是PCI总线扩展卡申请的第三个I/O空间(即BASE 2,假设为0C000H)。各I/O接口芯片的端口地址定义为:

BASE 2的首地址+ 各端口的偏移地址

8254端口的偏移地址定义为:

计数器0:40H 计数器1:41H 计数器2:42H 控制端口:43H CPU访问8254端口地址为:

计数器0:0C040H 计数器1:0C041H 计数器2:0C042H 控制端口:0C043H

2、计数应用实验

编写程序,将8254的计数器0设置为方式3,计数值为十进制5,用微动开关KK1作为CLK0时钟,OUT0连接IRQ,每当KK1按动5次后产生中断请求,在中断服务程序中完成屏幕上显示字符“M”。参考接线图如图13-5所示。

实验步骤如下:

(1) 执行PCI_BIOS.EXE文件,确定实验装置中8254的各端口地址。按实验内容编写程序(参

考程序见后),编译、连接,生成执行文件。

(2) 设计实验线路图,完成线路连接。 (3) 打开实验箱电源,运行程序,按动KK1微动开关,观察是否按动5次后屏幕显示字符“M”。

48

(4) 分析该程序结构,理解如何对8254初始化,如何实现中断服务。 (5) 修改计数初值,从而实现不同要求的计数。

13 - 5

3、定时应用实验——秒表的设计

设计思想:每计时1秒,描述时间的变量就应加1,并且每计时60秒自动归零。因此,可利用8254的计数器0设置为方式2,用实验箱提供的信号源10KHZ作为CLK0时钟,计数值为十进制0(即最大计数值10000),这样每隔1秒就会在OUT0端产生0到1的跃变,该信号接IRQ作为中断请求。在中断服务程序中完成对时钟的修改及显示。

实验步骤如下:

(1) 根据设计思想,设计实验线路图,完成线路连接。 (2) 画出程序流程图。

(3) 执行PCI_BIOS.EXE文件,确定实验装置中8254的各端口地址。自己编写程序,编译、连

接,生成执行文件。

(4) 打开实验箱电源,运行程序,观察屏幕的秒表显示是否正常。 4、电子发声实验

设计思想:向扬声器传送不同频率的方波,就能驱动小喇叭发出不同音符的音响。因此,设置8254的工作方式为方式3——方波频率发生器,改变8254计数通道i的计数初值,就可改变OUTi输出信号的频率,从而改变扬声器发出的音调。但每个音调发声的时间长短可以通过延时程序来控制。

1)用PC机内部的扬声器唱歌

在PC机内部集成了三个计数器,它们的功能、操作完全与8254兼容。三个计数器的端口地址分别为40H、41H、42H,控制寄存器地址为43H。但有各自专用功能: ? 通道0是系统的时钟节拍计时器。当计算机冷启动时,ROM BIOS对计数器编程以产生约每秒

18.2个节拍的中断信号,即55ms向8259A(IR0)提出一次中断请求。 ? 通道1专用于产生动态RAM的定时刷新信号。 ? 通道2用来控制PC机扬声器的声音频率。 图13-6是PC机中定时器结构框图。

从图中可见扬声器是否发声受计数器2的输出端OUT2和端口61H的D0、D1位的共同控制,当三者都为1时,扬声器才可发声。因此,程序的设计思路是:(1)先将61H端口的D1、D0两位置1,打开扬声器;(2)设置计数器2为工作方式3;(3)由表8-4给出的每个音符对应的时间常数(即计数初值)分别送计数器2,以确定音调,使OUT0产生不同频率的方波,从而改变扬声器发声的音调。(4)程序退出时恢复端口61H原来的值。

49

13-6

实验步骤如下:

(1) 分析参考程序,画出程序流程图。

(2) 编写程序,编译、连接,生成执行文件。 (3) 打开实验箱电源,运行程序,聆听音乐。

(4) 若音乐节拍发生时间较长或较短,可以修改延时子程序的计数值,调整发声时间到最佳。

2)用实验系统扬声器唱歌

用信号源1MHZ作为扬声器发声基准时钟接8254的CLK0,计数器0设置为工作方式3,由表8-4给出的每个音符对应的时间常数(即计数初值)分别送计数器0,以确定音调,OUT0产生不同频率的方波连接扬声器SPK端子驱动扬声器产生音乐。

实验步骤如下:

(1) 根据设计思想,设计实验线路图,完成线路连接。 (2) 画出程序流程图,自己编写程序。

(3) 执行PCI_BIOS.EXE文件,确定实验装置中8254的各端口地址。编辑程序,编译、连接,

生成执行文件。

(4) 打开实验箱电源,运行程序,聆听音乐。

(5) 若音乐节拍发生时间较长或较短,可以修改延时子程序的计数值,调整发声时间到最佳。 七. 参考程序

计数应用实验

;先执行PCI_BIOS.EXE,获得PCI板卡申请的第一个I/O空间的首地址及 ;中断号,修改下面CPU访问PCI控制寄存器的端口地址。 ;由中断号确定相应中断向量及OCW1、OCW2命令字。 MY8254_COUNT0 EQU 9C40H ;修改端口地址 MY8254_COUNT1 EQU 9C41H MY8254_COUNT2 EQU 9C42H MY8254_MODE EQU 9C43H INTCSR_BYTE0 EQU 9438H INTCSR_BYTE1 EQU 9439H INTCSR_BYTE2 EQU 943AH INTCSR_BYTE3 EQU 943BH IMB4_BYTE3 EQU 941FH

DATA SEGMENT

50

本文来源:https://www.bwwdw.com/article/28cp.html

Top