实验一 显示程序实验
一、实验目的
1. 掌握在PC机上以十六进制形式显示数据的方法;
2. 掌握部分DOS功能调用使用方法;
3. 熟悉Tddebug调试环境和Turbo Debugger的使用。
二、实验所用设备
1. PC微机一台。
三、实验内容
一般来说,程序需要显示输出提示运行的状况和结果,有的还需要将数据区中的内容显示在屏幕上。本实验要求将指定数据区的数据以十六进制数形式显示在屏幕上,并通过DOS功能调用完成一些提示信息的显示。实验中可使用DOS功能调用(INT 21H)。
(1) 显示单个字符输出
入口:AH=02H
调用参数:DL=输出字符
(2) 显示字符串
入口:AH=09H
调用参数:DS:DX=串地址,’$’为结束字符
(3) 键盘输入并回显
入口:AH=01H
返回参数:AL=输出字符
(4) 返回DOS系统
入口:AH=4CH
调用参数:AL=返回码
四、实验步骤
1. 运行Tddebug软件,选择Edit菜单,根据实验内容的描述编写实验程序,本实验显示部分参考实验流程如图1-1示;
2. 使用Compile菜单中的Compile和Link对实验程序进行汇编、连接;
3. 使用Rmrun菜单中的Run,运行程序,观察运行结果;
4. 使用Rmrun菜单中的Debug,调试程序,观察调试过程中,数据传输指令执行后,各寄存器及数据区的内容;
5. 更改数据区中的数据,考察程序的正确性。
图1-1 显示程序实验流程图
五、参考程序清单
六、实验报告内容及要求
写出程序调试过程及运行情况。
1. 将参考程序写入轻松汇编编辑框。
2. 点击保存,然后编译,结果框显示编译成功。
3. 点击生成,显示链接成功。
4. 点击运行,显示如图:
实验二 数据传送实验
一、实验目的
1. 熟悉Tddebug调试环境和Turbo Debugger的使用;
2. 掌握与数据有关的不同寻址方式。
二、实验所用设备
1. PC微机一台。
三、实验内容
将数据段中的一个字符串传送到附加段中,并输出附加段中的目标字符串到屏幕上。
参考实验程序:
DDATA SEGMENT ;定义源数据段
MSR DB "HELLO,WORLD!$"
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 ;设置SI
MOV DI, OFFSET MSD ;设置DI
MOV CX, LEN
NEXT: MOV AL, [SI] ;开始传输数据
MOV ES:[DI], AL
INC SI
INC DI
DEC CX
JNZ NEXT
PUSH ES
POP DS ;将附加段寄存器的段值赋给数据段寄存器
MOV DX, OFFSET MSD
MOV AH, 9
INT 21H
MOV AX, 4C00H ;利用DOS功能调用返回DOS状态
INT 21H
CODE ENDS
END START
将程序主体部分的寄存器间接寻址方式改为相对寻址方式,则如下所示:
MOV BX, 0
MOV CX, LEN
NEXT: MOV AL, MSR[BX]
MOV ES:MSD[BX], AL
INC BX
LOOP NEXT
四、实验步骤
1. 运行Tddebug软件,选择Edit菜单编写实验程序;
2. 使用Compile菜单中的Compile和Link对实验程序进行汇编、连接;
3. 使用Rmrun菜单中的Run,运行程序,观察运行结果;
4. 使用Rmrun菜单中的Debug,调试程序,观察调试过程中,数据传输指令执行后,各寄存器及数据区的内容;
5. 更改数据区中的数据,考察程序的正确性。
五、实验报告内容及要求
写出程序调试过程及运行情况。
1将参考程序写入轻松汇编编辑框。
2点击保存,然后编译,结果框显示编译成功。
3点击生成,显示链接成功。
4点击运行,显示如图:
实验三 数码转换程序实验
一、实验目的
掌握不同进制数及编码相互转换的程序设计方法。
二、实验所用设备
PC微机一台。
三、实验内容
计算机输入设备输入的信息一般是由ASCII码或BCD码表示的数据或字符,CPU用二进制数进行计算或其它信息处理,处理结果的输出又必须依照外设的要求变为ASCII码、BCD码或七段显示码等。因此,在应用软件中,各类数制的转换和代码的转换是必不可少的。计算机与外设间的数码转换关系如图3-1所示,数码对应关系如表3-1所示。
图3-1 计算机与外设间的数码转换关系
1.将ASCII码表示的十进制数转换为二进制数
程序如下:
DATA SEGMENT ;定义源数据段
MSR DB "00012"
LEN EQU $-MSR
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS,AX
MOV SI, OFFSET MSR
MOV CX,LEN-1
MOV AL, DS:[SI] ;开始传输数据
MOV AH,0
SUB AX,30H
NEXT1: MOV BX, 0AH
MUL BX ; 将AX中的数乘以10,所得的结果高位保存到DX中,低位保存到AX中
INC SI
MOV DL,DS:[SI]
MOV DH,0
SUB DX,30H ;将数字对应的ASCII码转换成响应的二进制数
ADD AX,DX
DEC CX
JNZ NEXT1
MOV CL,16 ; CL用作循环NEXT2的计数器,因为5位十进制数转化成二进制只有十六位,所以循环次数为16次
MOV BX,AX
NEXT2: ROL BX,1
MOV DL,BL
AND DL,01H
ADD DL,30H ;把BX中的数以二进制形式输出
MOV AH,2H
INT 21H
DEC CL
JNZ NEXT2
MOV AX,4C00H
INT 21H
CODE ENDS
END START
写出程序调试过程及运行情况。
1将参考程序写入轻松汇编编辑框。
2点击保存,然后编译,结果框显示编译成功。
3点击生成,显示链接成功。
4点击运行,显示如图:
5改变程序中待转换的十进制数,调试运行后观察实验结果,可看到相应的二进制转换结果。
2.将十进制数的ASCII码转换为BCD码
本实验要求将键盘输入的一个五位十进制数54321的ASCII码存放入数据区中,转换为 BCD 码后,并将转换结果按位分别显示于屏幕上。若输入的不是十进制数的ASCII码,则输出“FF”。提示:一字节ASCII码取其低四位即变为BCD码。
程序如下:
DATA SEGMENT ;定义源数据段
STRING DB 'Input:','$'
MSR DB 6,?,6 DUP(?) ;数据段MSR用于接收从键盘输入的五位十进制数
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX ; 装载数据段寄存器
LEA DX, STRING
MOV AH, 09H
INT 21H
MOV DX, OFFSET MSR
MOV AH,0AH
INT 21H
MOV CL,[MSR+1] ;CL中保存实际输入的数据的位数,用于控制循环执行的次数
MOV SI,0002H
MOV BX, OFFSET MSR
NEXT1: MOV AL,[BX+SI] ;开始传输数据
CMP AL,40H
JNC LK1 ;大于等于40H则表明输入的不是数字符,跳到LK1输入F
CLC
CMP AL,30
JC LK1 ;小于30H则表明输入的不是数字字符,到LK1输出字符F
SUB AL,30H
MOV CH,0
PUSH CX
MOV CL,4
MOV DH,AL
SHL DH,CL
NEXT2: ROL DH,1
MOV DL,DH
AND DL,01H
ADD DL,30H
MOV AH,02H
INT 21H
DEC CL
JNZ NEXT2
POP CX
INC SI
DEC CL
JNZ NEXT1
LK1: JZ LK2
MOV DL,46H ;输出字符F
MOV AH,02H
INT 21H
INC SI
DEC CL
JNZ NEXT1
LK2: MOV AX,4C00H
INT 21H
CODE ENDS
END START
写出程序调试过程及运行情况。
1将参考程序写入轻松汇编编辑框。
2点击保存,然后编译,结果框显示编译成功。
3点击生成,显示链接成功。
4点击运行,显示如图:
3.将十六进制数的ASCII码转换为十进制数
十六位二进制数的值域为0-65535,最大可转换为五位十进制数。五位十进制数可表示为:
ND=D4×104+D3×103+D2×102+D1×10+D0
因此,将十六位二进制数转换为五位ASCII码表示的十进制数,就是求D1-D4,并将它们转化为ASCII码。本实验要求将缓冲区中存放的000CH的ASCII码转换成十进制数,并将转换结果显示在屏幕上。
程序如下:
DATA SEGMENT ;定义源数据段
STRING DB 'Input:','$'
MSR DW 000CH
MDR DB 5 DUP(?),'$'
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET MDR
MOV SI, 5
MOV AX,[MSR] ;将数据000CH保存到AX当中
NEXT1: DEC SI
MOV DX,0
MOV CX,0AH
DIV CX
ADD DL,30H
MOV [BX+SI],DL
CMP AX,0
JNE NEXT1
CMP SI,0 ;判断SI是否为零,为零则表明五位十进制数的每一位都不为零,否则应给前面为零的位上补上零
JE NEXT3
NEXT2: DEC SI
MOV AL,30H
MOV [BX+SI],AL
CMP SI,0
JNE NEXT2
NEXT3: MOV DX,OFFSET MDR
MOV AH,09H
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
写出程序调试过程及运行情况。
1将参考程序写入轻松汇编编辑框。
2点击保存,然后编译,结果框显示编译成功。
3点击生成,显示链接成功。
4点击运行,显示如图:
4.BCD码转换为二进制码
本实验要求将四个二位十进制数的BCD码存放在某一内存单元中,转换出的二进制数码存入其后的内存单元中,转换结束,送屏幕显示。
程序如下:
DATA SEGMENT ;
MSR DB 01H,02H,03H,04H,05H,06H,07H,08H,4 DUP(?) ;本程序使用非压缩型BCD码
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX, OFFSET MSR
MOV DI,8
MOV CX,4
MOV DH,0AH
NEXT1: MOV SI,1
MOV AL,[BX+SI]
MUL DH
DEC SI
ADD AL,[BX+SI]
MOV [BX+DI],AL
PUSH CX
MOV CH,AL
MOV CL,8
NEXT2: ROL CH,1
MOV DL,CH
AND DL,01H
ADD DL,30H
MOV AH,02H
INT 21H
DEC CL
JNZ NEXT2
POP CX
MOV DL,42H ;输出字母B,表示输出的是二进制数
MOV AH,02H
INT 21H
MOV AH,2 ;回车换行
MOV DL,13
INT 21H
MOV AH,2
MOV DL,10
INT 21H
ADD BX,2
INC DI
DEC CX
JNZ NEXT1
MOV AX,4C00H
INT 21H
CODE ENDS
END START
写出程序调试过程及运行情况。
1将参考程序写入轻松汇编编辑框。
2点击保存,然后编译,结果框显示编译成功。
3点击生成,显示链接成功。
4点击运行,显示如图:
实验四 运算类程序实验
一、实验目的
1. 掌握运算类指令编程及调试方法;
2. 掌握运算类指令对各状态标志位的影响及测试方法。
二、实验所用设备
1. PC微机一台。
三、实验内容
80x86指令系统提供了实现加、减、乘、除运算的基本指令,可对表4-1所示的数据类型进行算术运算。
程序如下:
DATA SEGMENT
X DD 001565A0H
Y DD 0021B79EH
Z DB 4 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET X
MOV SI,OFFSET Y
MOV DI,OFFSET Z
MOV AX,WORD PTR [BX] ;取X的低十六位传送到AX当中
CLC
ADD AX,WORD PTR [SI] ;将Y的低十六位数据与AX相加,结果保存到AX
MOV [DI],AX ;将相加的结果保存到Z
MOV AX,WORD PTR [BX+2] ;取X的高位数据
ADC AX,WORD PTR [SI+2] ;将Y的高位数据与X的高位数据相加,并加上状态标志CF的值(若有进位则CF为一)
MOV [DI+2],AX
MOV CL,4
MOV BX,3
NEXT1: MOV AL,[BX+DI] ;取转换好德数据的9位数据(从高位到低位每次取8位,总共取四次)
SHR AL,CL ;将高四位转移到低四位
AND AL,0FH ;将高四位清零,保留第四位数据
CMP AL,0AH ;与0AH比较,大于等于则表示应输出字母A~F,所以转换成相应的ASCII码时应多加7
JB LK1
ADD AL,07H
LK1: ADD AL,30H ;将二进制数转换成响应的ASCII码
MOV DL,AL ;将要输入的字符的ASCII码保存到DL中并调用2号功能输出
MOV AH,02H
INT 21H
MOV AL,[BX+DI] ;因为二进制数转换成十六进制数时,每四位二进制数转换成一位十六进制数,所以一个字节的数字需要转换两次,这次是转低四位
AND AL,0FH ;将高四位清零,保存低四位的数据
CMP AL,0AH ;与0AH比较,大于等于则表示输出字母A~F,转换成相应的ASCII码应多加7
JB LK2
ADD AL,07H
LK2: ADD AL,30H ; 将二进制数据转换成响应的ASCII码
MOV DL,AL ;将要输出的字符的ASCII码保存到DL中并调用2号功能输出
MOV AH,02H
INT 21H
DEC BX ;BX既保存数据地址的偏移量,又控制循环体的循环次数,BX减1,既指向了下一个数据,又使循环次数减1
CMP BX,0
JGE NEXT1 ;BX小于零时退出循环
MOV AX,4C00H ;退出程序
INT 21H
CODE ENDS
END START
实验五 分支程序设计实验
一、实验目的
1. 掌握分支程序的设计方法。
二、实验所用设备
1. PC微机一台。
三、实验内容
程序有顺序、循环、分支和子程序四种结构形式,分支结构的示意图如图5-1所示。本实验要求通过求无符号字节序列中的最大值和最小值来反映分支程序的结构形式。
图5-1 分支结构示意图
实验可以使用BH,BL作为暂存现行的最大值和最小值,且在程序的初始,将BH和BL初始化为首字节的内容,然后进入循环操作。在循环操作中,依次从字节序列中逐个取出一个字节的内容与BH,BL进行比较,若取出的字节内容比BH的内容大或比BL中的内容小,则修改之。当循环结束操作时,将BH,BL分别送屏幕显示。参考实验流程如图5-2所示。
四、实验步骤
1. 运行Tddebug软件,选择Edit菜单编写实验程序,提供8字节的数据:0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9H;
2. 使用Compile菜单中的Compile和Link对实验程序进行汇编、连接;
3. 使用Rmrun菜单中的Run,运行程序,观察运行结果;
4. 更改数据区中的数据,考察程序的正确性。
五、实验报告内容及要求
根据实验要求编写程序并调试,写出程序调试过程及运行情况。
程序如下:
DATA SEGMENT ;定义数据段
D1 DB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9H
C1 EQU $-D1 ;D1的数据长度
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,C1-1 ;设置循环次数
MOV SI,0 ;初始化SI
MOV BL,D1[SI] ;将D1中的数据逐个移到BL,BH
MOV BH,D1[SI]
L1: INC SI ;SI增加1转到下一个数据
MOV AL,D1[SI] ;将此数据移到AL
CMP AL,BL ;比较AL和BL
JNB L2 ;AL不小于BL,则跳转到L2
MOV BL,AL ;小于等于则把AL和BL互换
L2: CMP AL,BH ;比较AL和BH
JNA L3 ;不大于则跳转到L3
MOV BH,AL ;大于等于把AL,BH互换
L3: LOOP L1 ;循环L1直至CX为零
CALL DIS ;调用显示子程序
MOV DL,0AH ;换行
MOV AH,2 ;显示BL
INT 21H
MOV DL,0DH ;回车
MOV AH,2
INT 21H
MOV BL,BH
CALL DIS ;显示BH
MOV AH,4CH
INT 21H
DIS PROC ;显示子程序
MOV CH,2 ; 设置循环次数
MOV CL,4 ;设置移动位数
NEXT: ROL BL,CL ;将BL最高位移到最低位
MOV DL,BL
AND DL,0FH ;取DL最低位
ADD DL,30H ;转换为对应的ASCII码
CMP DL,39H ;与39H比较
JLE PRINT ;小于等于则跳转到PRINT
ADD DL,7 ;大于则加上07H
PRINT: MOV AH,2 ;显示ASCII码对应的字符
INT 21H
DEC CH
JNZ NEXT
RET
DIS ENDP
CODE ENDS
END START
实验六 循环程序设计实验
一、实验目的
1. 掌握循环程序的设计方法。
二、实验所用设备
1. PC微机一台。
三、实验内容
本实验要求通过求某数据区内负数的个数来表现循环程序的结构形式。要求实验程序在数据区中存放一组数据,为统计负数的个数,逐个判断区内的数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得到区内所包含负数的个数。循环程序的结构示意如图6-1所示。
图6-1循环结构示意图
四、实验步骤
1. 运行Tddebug软件,选择Edit菜单编写实验程序,提供10字节的数据:12H,88H,82H,89H,33H,90H,01H,10H,0BDH,01H;
2. 使用Compile菜单中的Compile和Link对实验程序进行汇编、连接;
3. 使用Rmrun菜单中的Run,运行程序,观察运行结果;
4. 更改数据区中的数据,考察程序的正确性。
五、实验报告内容及要求
根据实验要求编写程序并调试,写出程序调试过程及运行情况。
程序如下:
;实验六
DATA SEGMENT ;定义源数据段
M DB 20,59,61,21,89,103,2,124,125,245,204,214,198,157,120,209,15,137,206,113
N DB 8 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET M
MOV DI,OFFSET N
MOV CL,0
NEXT1: MOV AL,[BX]
CMP AL,80H
JB LK
MOV [DI],AL
INC DI
INC CL
LK: INC BX
CMP BX,20
JB NEXT1
MOV CH,CL
MOV CL,8
NEXT2: ROL CH,1
MOV DL,CH
AND DL,01H
ADD DL,30H
MOV AH,02H
INT 21H
DEC CL
JNZ NEXT2
MOV DL,42H
MOV AH,02H
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
实验七 8259中断控制器应用实验
一、实验目的
1. 学习可编程中断控制器8259的工作原理。
2. 掌握可编程中断控制器8259的应用编程方法。
二、实验内容
1.单中断实验。利用系统总线上中断请求信号INTR,设计一个单中断应用。使用单次脉冲模拟中断产生。编写中断处理程序,在显示器屏幕上显示一个字符。
2.扩展中断源查询方式应用实验。利用实验平台上8259控制器对系统总线上的中断线INTR进行扩展。编写程序对8259控制器的IR0和IRI中断请求进行处理。
三、实验所用仪表及设备
1. PC机一台。
2. TD-PIT++实验系统一套。
四、实验原理与步骤
1. 实验原理
(1)PC微机系统中的8259介绍
中断控制器8259 是Intel 公司专为控制优先级中断而设计开发的芯片。它将中断源优先级排队、辨别中断源以及提供中断矢量的电路集于一片中,因此无需附加任何电路,只需对8259 进行编程,就可以管理8 级中断,并选择优先模式和中断请求方式,即中断结构可以由用户编程来设定。同时,在不需增加其他电路的情况下,通过多片8259 的级连,能构成多达64 级的矢量中断系统。它的管理功能包括:1)记录各级中断源请求,2)判别优先级,确定是否响应和响应哪一级中断,3)响应中断时,向CPU 传送中断类型号。
8259A的命令字共有7个,可分为两类。一类是初始化命令字,另一类是操作命令字。8259 的编程就是根据应用需要将初始化命令字ICW1-ICW4 和操作命令字OCW1- OCW3 分别写入初始化命令寄存器组和操作命令寄存器组。ICW1-ICW4各命令字格式如表2-1所示,OCW1-OCW3各命令字格式如表2-2所示,其中OCW1用于设置中断屏蔽操作字,OCW2用于设置优先级循环方式和结束方式的操作命令字,OCW3用于设置和撤消特殊屏蔽方式,设置中断查询方式以及设置对8259A内部寄存器的读出命令。
2. 实验步骤
(1)单中断应用实验
实验说明:
实验平台上系统总线单元的INTR中断请求信号已经是对应到PC机内部的某一级中断。 INTR产生一个上升沿的中断请求, PC机内部相应的那级中断就会得到响应。所以,使用INTR中断请求信号,就相当在使用PC机内部相应的那一级中断。
本实验要求使用总线上INTR中断请求线完成一次单中断应用实验。用单次脉冲上升沿模拟中断源,中断处理程序完成在屏幕上的显示字符“9” 。
图2-1 8259单中断实验参考接线图
实验步骤如下:
①实验接线图如图2-1所示,按图接线。
②运行Tdpit集成操作软件,调用程序代码(T8259-1.ASM),填写程序代码中的空缺处,编译、链接。
③使用运行命令运行程序,重复按单次脉冲开关KK1+,显示屏会显示字符“9”,说明响应了中断。
实验代码如下:
INTR_IVADD EQU 01C8H ;INTR对应的中断矢量地址
INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址
INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址
INTR_IM EQU 0FBH ;INTR对应的中断屏蔽字
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
MES DB 'Press any key to exit!',0AH,0DH,0AH,0DH,'$'
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量
IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
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
CLI
MOV AX,0000H ;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址
MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR屏蔽位
IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字
AND AL,INTR_IM
OUT DX,AL
STI
WAIT1: MOV AH,1 ;判断是否有按键按下
INT 16H
JZ WAIT1 ;无按键则跳回继续等待,有则退出
QUIT: CLI
MOV AX,0000H ;恢复INTR原中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字
MOV AL,IM_BAK
OUT DX,AL
STI
MOV AX,4C00H ;返回到DOS
INT 21H
MYISR PROC NEAR ;中断处理程序MYISR
PUSH AX
MOV AL,39H
MOV AH,0EH
INT 10H
MOV AL,20H
INT 10H
OVER: MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令
MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
POP AX
IRET
MYISR ENDP
CODE ENDS
END START
(代码结束)
(3)扩展中断应用实验
实验说明:
利用实验单元中的8259控制器,可以对总线上的INTR进行中断源的扩充。将8259的INT连接到INTR,8259的8路中断请求线IR0~IR7就成了单一INTR中断请求线的扩充。这8路中断源共用INTR的中断矢量,共用INTR的中断服务程序。在INTR的中断服务程序中通过对8259的OCW3的查询,以确定是IR0~IR7中哪个产生中断,然后转到相应的服务线程进行处理。
本实验要求实现8259控制器IR0、IR1两路中断都可以通过INTR向PC发起中断请求。用KK1+和KK2+模拟两个中断源,在IR0对应的服务程序中显示字符“0”,在IR1对应的服务程序中显示字符“1”。
图2-3 8259扩充中断源实验参考接线图
实验步骤如下:
①实验接线图如图2-3所示,按图接线。
②运行Tdpit集成操作软件,调用程序代码(T8259-2.ASM),填写程序代码中的空缺处,编译、链接。
③使用运行命令运行程序,按动KK1+、KK2+按键,观察中断是否产生。
实验代码如下:
INTR_IVADD EQU 01C8H ;INTR对应的中断矢量地址
INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址
INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址
INTR_IM EQU 0FBH ;INTR对应的中断屏蔽字
IOY0 EQU 3000H ;片选IOY0对应的端口始地址
MY8259_ICW1 EQU IOY0+00H ;实验系统中8259的ICW1端口地址
MY8259_ICW2 EQU IOY0+04H ;实验系统中8259的ICW2端口地址
MY8259_ICW3 EQU IOY0+04H ;实验系统中8259的ICW3端口地址
MY8259_ICW4 EQU IOY0+04H ;实验系统中8259的ICW4端口地址
MY8259_OCW1 EQU IOY0+04H ;实验系统中8259的OCW1端口地址
MY8259_OCW2 EQU IOY0+00H ;实验系统中8259的OCW2端口地址
MY8259_OCW3 EQU IOY0+00H ;实验系统中8259的OCW3端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
MES DB 'Press any key to exit!',0AH,0DH,0AH,0DH,'$'
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量
IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
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
CLI
MOV AX,0000H ;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址
MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR屏蔽位
IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字
AND AL,INTR_IM
OUT DX,AL
MOV DX,MY8259_ICW1 ;初始化实验系统中8259的ICW1
MOV AL,13H ;边沿触发、单片8259、需要ICW4
OUT DX,AL
MOV DX,MY8259_ICW2 ;初始化实验系统中8259的ICW2
MOV AL, 08H
OUT DX,AL
MOV DX,MY8259_ICW4 ;初始化实验系统中8259的ICW4
MOV AL, 01H ;非自动结束EOI
OUT DX,AL
MOV DX,MY8259_OCW3 ;向8259的OCW3发送读取IRR命令
MOV AL,0AH
OUT DX,AL
MOV DX,MY8259_OCW1 ;初始化实验系统中8259的OCW1
MOV AL,0FCH ;打开IR0和IR1的屏蔽位
OUT DX,AL
STI
WAIT1: MOV AH,1 ;判断是否有按键按下
INT 16H
JZ WAIT1 ;无按键则跳回继续等待,有则退出
QUIT: CLI
MOV AX,0000H ;恢复INTR原中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字
MOV AL,IM_BAK
OUT DX,AL
STI
MOV AX,4C00H ;返回到DOS
INT 21H
MYISR PROC NEAR ;中断处理程序MYISR
PUSH AX
QUERY: MOV DX,MY8259_OCW3 ;向8259的OCW3发送读取IRR命令
IN AL,DX ;读出IRR寄存器值
AND AL,20H
CMP AL,01H
JE IR0ISR ;若为IR0请求,跳到IR0处理程序
JNE IR1ISR ;若为IR1请求,跳到IR1处理程序
JMP OVER
IR0ISR:MOV AL,30H ;IR0处理,显示字符串STR0
MOV AH,0EH
INT 10H
MOV AL,20H
INT 10H
JMP OVER
IR1ISR:MOV AL,31H ;IR1处理,显示字符串STR1
MOV AH,0EH
INT 10H
MOV AL,20H
INT 10H
JMP OVER
OVER: MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令
MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
POP AX
IRET
MYISR ENDP
CODE ENDS
END START
(代码结束)
五、思考题
1. 单中断与多中断有何不同?
答:单中断只需一片8259A芯片,多中断需要多个芯片级联。
2. 如何改变中断优先级的顺序?
答:通过优先级自动循环方式,优先级特殊循环方式可以自行设定。
3. 可编程中断控制器8259A在协助CPU处理中断事务中起哪些作用?
答:8259A,用于管理8086的外部中断请求,可实现中断优先级判定,提供中断类型号,屏蔽中断输入等功能。
4.可屏蔽中断与8259A是什么关系?
答:可屏蔽中断是由8259A实现的,芯片内部有中断屏蔽寄存器IMR,当中断请求寄存器IRR中记录的各级中断中有任何一级需要屏蔽时,只需将IMR相应位置1即可。
实验八 8255并口控制器应用实验
一、实验目的
1. 掌握 8255 的工作方式及应用编程。
2. 掌握 8255 典型应用电路的接法。
二、实验内容
1. 基本输入输出实验。编写程序,使 8255 的 A 口为输出, B 口为输入,完成拨动开关到数据灯的数据传输。要求只要开关拨动,数据灯的显示就改变。
2.流水灯显示实验。编写程序,使 8255 的 A 口和 B 口均为输出,数据灯D7~D0 由左向右,每次仅亮一个灯,循环显示,D15~D8 与D7~D0 正相反,由右向左,每次仅点亮一个灯,循环显示。
三、实验所用仪表及设备
1. PC机一台。
2. TD-PIT++实验系统一套。
四、实验原理与步骤
实验步骤
(1)基本输入输出实验
实验说明:
本实验使 8255的端口A作为输出口工作在方式0,端口 B 作为输入口工作在方式0。用一组开关信号接入端口B,端口A 输出线接至一组数据灯上,然后通过对8255 芯片编程来实现输入输出功能。
图3-2 8255基本输入输出实验参考接线图
实验步骤如下:
①实验接线图如图3-2所示,按图连接实验线路图。
②运行Tdpit 集成操作软件,根据实验内容,调用程序代码(T8255-1.ASM),填写程序代码中的空缺处,编译、链接。
③运行程序,改变拨动开关,同时观察LED 显示,验证程序功能。
实验代码如下:
IOY0 EQU 3000H ;片选IOY0对应的端口始地址
MY8255_A EQU IOY0+00H*4 ;8255的A口地址
MY8255_B EQU IOY0+01H*4 ;8255的B口地址
MY8255_C EQU IOY0+02H*4 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8255_MODE ;初始化8255工作方式
MOV AL, 82H ;工作方式0,A口输出,B口输入
OUT DX,AL
LOOP1: MOV DX,MY8255_B ;读B口
IN AL,DX
MOV DX,MY8255_A ;写A口
OUT DX,AL
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP1 ;无按键则跳回继续循环,有则退出
QUIT: MOV AX,4C00H ;结束程序退出
INT 21H
CODE ENDS
END START
(代码结束)
(2)流水灯显示实验
实验说明:
使8255 的A 口和B 口均为输出,数据灯D7~D0 由左向右,每次仅亮一个灯,循环显示,D15~D8 与D7~D0 正相反,由右向左,每次仅点亮一个灯,循环显示。参考实验程序流程如图3-3所示。
图3-3流水灯显示参考程序流程图
实验步骤如下:
①实验接线图如图3-4所示,按图连接实验线路图。
②运行Tdpit 集成操作软件,根据实验内容,调用程序代码(T8255-2.ASM),填写程序代码中的空缺处,编译、链接。
③运行程序,观察LED 灯的显示,验证程序功能。
④自己设计流水灯的流动模式,编写程序并实现。
图3-4 8255流水灯显示参考接线图
实验代码如下:
IOY0 EQU 3000H ;片选IOY0对应的端口始地址
MY8255_A EQU IOY0+00H*4 ;8255的A口地址
MY8255_B EQU IOY0+01H*4 ;8255的B口地址
MY8255_C EQU IOY0+02H*4 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
LA DB ? ;定义数据变量
LB DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE ;定义8255工作方式
MOV AL, 80H ;工作方式0,A口和B口为输出
OUT DX,AL
MOV DX,MY8255_A ;写A口发出的起始数据
MOV AL, 80H
OUT DX,AL
MOV LA,AL
MOV DX,MY8255_B ;写B口发出的起始数据
MOV AL, 01H
OUT DX,AL
MOV LB,AL
LOOP1: CALL DALLY
MOV AL,LA ;将A口起始数据右移再写入A口
ROR AL,1
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL
MOV AL,LB ;将B口起始数据左移再写入B口
ROL AL,1
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP1 ;无按键则跳回继续循环,有则退出
QUIT: MOV AX,4C00H ;结束程序退出
INT 21H
DALLY PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,0FFFH
D1: MOV AX,0FFFFH
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
CODE ENDS
END START
(代码结束)
五、思考题
1. 并口通信需要注意哪些问题?
答:注意其适合于短距离传输,长距离传输时要做好防干扰措施。
2. 比较并口通信与串口通信的异同。
答: 并行,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,容易出错。
串行,其不同于并行之处在于它的数据和控制信息是一位接以为串行传送下去,这样,虽然速度会慢一些,但传送距离较并行口更长,因此长距离的同学应使用串行口。
3. 8255A端口与外设之间的单向和双向传送是指什么?3个并口中哪个并口具有双向传送功能?
答:8255A的3个并行口与外设之间的单向传送是当初始化把8255A的并行端口设置为输入时,就不能作输出用,反之,亦然。而双向传送是通过初始化可以把8255A的并行端口设置为同时输入和输出。所以,此处的单向或双向是指1次初始化所设置的传送方式,并不意味着8255A的并行端口只能作单向或双向传送。
六、实验报告内容及要求
1. 按实验步骤列出实验中存在的问题,并给出解决问题的办法。
2.自己设计实验二中流水灯的流动模式,给出所修改的程序代码,分析设计的思路。
3. 自行设计能实现A口工作在方式一输入,B口工作在方式一输出的电路并完成程序的编制和在实验台上的验证,并在实验报告中给出所编程序。
实验九 8254定时/计数器应用实验
一、实验目的
1. 掌握 8254 的工作方式及应用编程。
2. 掌握 8254 典型应用电路的接法。
二、实验内容
1.计数应用实验。编写程序,应用8254的计数功能,用开关模拟计数,使每当按动KKI+五次后,产生一次计数中断,并在屏幕上显示一个字符‘5’。
2.定时应用实验。编写程序,应用8254的定时功能,产生一个1Hz 的方波,利用LED灯作为输出显示,观察LED灯闪烁的频率。
三、实验所用仪表及设备
1. PC机一台。
2. TD-PIT++实验系统一套。
2.实验步骤
(1)计数应用实验
实验说明:
编写程序,将8254的计数器0设置为方式0,计数值为5,用微动开关KKl+作为CLK0时钟,OUT0连接INTR,每当KKl+按动5次后产生中断请求,在屏幕上显示字符“5”。
图4-1 8254计数应用实验一参考接线图
实验步骤如下:
①实验接线如图4-1所示,按图接线。
②运行Tdpit 集成操作软件,根据实验内容,调用程序代码(T8254-1.ASM),填写程序代码中的空缺处,编译、链接。
③运行程序,按动KK1+产生单次脉冲,观察实验现象。
④改变计数值,验证8254的计数功能。
实验代码如下:
INTR_IVADD EQU 01C8H ;INTR对应的中断矢量地址
INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址
INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址
INTR_IM EQU 0FBH ;INTR对应的中断屏蔽字
IOY0 EQU 3000H ;片选IOY0对应的端口始地址
MY8254_COUNT0 EQU IOY0+00H*4 ;8254计数器0端口地址
MY8254_COUNT1 EQU IOY0+01H*4 ;8254计数器1端口地址
MY8254_COUNT2 EQU IOY0+02H*4 ;8254计数器2端口地址
MY8254_MODE EQU IOY0+03H*4 ;8254控制寄存器端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量
IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
STR1 DB 'COUNT: $' ;显示的字符串
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
CLI
MOV AX,0000H ;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址
MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR屏蔽位
IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字
AND AL,INTR_IM
OUT DX,AL
STI
MOV DX,OFFSET STR1 ;显示字符串
MOV AH,9
INT 21H
MOV DX,MY8254_MODE ;初始化8254工作方式
MOV AL,10H ;计数器0,方式0
OUT DX,AL
MOV DX,MY8254_COUNT0 ;装入计数初值
MOV AL,4
OUT DX,AL
WAIT1: MOV AH,1 ;判断是否有按键按下
INT 16H
JZ WAIT1 ;无按键则跳回继续等待,有则退出
QUIT: CLI
MOV AX,0000H ;恢复INTR原中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字
MOV AL,IM_BAK
OUT DX,AL
STI
MOV AX,4C00H ;返回到DOS
INT 21H
MYISR PROC NEAR ;中断处理程序MYISR
PUSH AX
MOV AL,35H
MOV AH,0EH
INT 10H
MOV AL,20H
INT 10H
MOV DX,MY8254_COUNT0 ;重装计数初值
MOV AL,4
OUT DX,AL
OVER: MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令
MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
POP AX
IRET
MYISR ENDP
CODE ENDS
END START
(代码结束)
(2)定时应用实验
实验说明:
编写程序,应用8254的定时功能,产生一个1Hz 的方波,利用LED灯作为输出显示,观察LED灯闪烁的频率。
图4-2 8254定时应用实验参考接线图
实验步骤如下:
①实验接线如图4-2所示。
②运行Tdpit 集成操作软件,根据实验内容,根据实验内容,调用程序代码(T8254-2.ASM),填写程序代码中的空缺处,编译、链接。
③运行程序,观察实验现象。
④修改定时计数初值,观察LED灯闪烁的频率。
实验代码如下:
IOY0 EQU 3000H ;片选IOY0 对应的端口始地址
MY8254_COUNT0 EQU IOY0+00H*4 ;8254 计数器0 端口地址
MY8254_COUNT1 EQU IOY0+01H*4 ;8254 计数器1 端口地址
MY8254_COUNT2 EQU IOY0+02H*4 ;8254 计数器2 端口地址
MY8254_MODE EQU IOY0+03H*4 ;8254 控制寄存器端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8254_MODE ;初始化8254 工作方式
MOV AL,0B6H ;计数器2,方式3
OUT DX,AL
MOV DX,MY8254_COUNT2 ;装入计数初值
MOV AL,64H ;100 分频
OUT DX,AL
MOV AL,00H
OUT DX,AL
MOV DX,MY8254_MODE ;初始化8254 工作方式
MOV AL,36H ;计数器0,方式3
OUT DX,AL
MOV DX,MY8254_COUNT0 ;装入计数初值
MOV AL,00H ;18432 分频
OUT DX,AL
MOV AL,48H
OUT DX,AL
QUIT: MOV AX,4C00H ;结束程序退出
INT 21H
CODE ENDS
END START
(代码结束)
五、思考题
1. 8254各种工作模式的具体含义是什么?
答:
方式0——计数结束产生中断,软件启动,不能自动重复计数的方式。
方式1——可编程单次脉冲,硬件启动,不能自动重复单通过GATE的正跳变可使计数过程重新开始的计数方式。
方式2——分频工作方式,既可以软件启动,也可以用硬件启动。
方式3——方波发生器,计数过程中其输出前一半时间为高电平,后一半时间为低电平。
方式4——软件触发选通,软件启动,不自动重复计数的方式。
2. 与8254的3个计数通道相对应的有3个引脚:CLK、GATE、OUT,这3个引脚分别起什么作用?
答:CLK引脚输入时钟脉冲信号。GATE门控脉冲信号输入端,由外部送入的门控脉冲,控制启动定时器或计数器工作。OUT引脚输出信号。
六、实验报告内容及要求
1. 按实验步骤列出实验中存在的问题,并给出解决问题的办法。
2.分析定时应用实验中关于计数初值的设定思路