《微机原理与接口技术》(第四版)周何琴课后习题答案 下载本文

第1章 绪论作业

1. 将下列二进制数转换成十进制数。

(1)11001010B=202 (2)00111101B=61 (3)01001101B=77 (4)10100100B=164

3. 将下列十进制数分别转换为二进制数和十六进制数。 (2)76= 100 1100B =4CH (4)134= 1000 0110B =86H

4. 求下列十进制数的BCD码 (1)327=11 0010 0111(BCD码) (2)1256=1 0010 0101 0110(BCD码)

6. 求出下列10进制数的原码、反码和补码 (2)+85 (4)-85 解:85=0101 0101B

原码:+85= 0101 0101B -85= 1101 0101B 反码:+85= 0101 0101B -85= 1010 1010B 补码:+85= 0101 0101B -85= 1010 1011B

10. 画出微型计算机的基本结构框图,说明各部分的主要功能是什么? 解:

微型计算机的基本结构框图如下:

微处理器 CPU 存储器 I/O接口 地址总线 I/O设备 I/O总线 数据总线 控制总线 微处理器CPU:控制微处理器与存储器或I/O设备间的数据交换;进行算术和逻辑运算等操作;判定和控制程序流向。 微处理器主要完成:

(1)指令控制:从存储器中取指令,指令译码; (2)数据加工:简单的算术逻辑运算;

(3)操作控制:在微处理器和存储器或者I/O之间传送数据; (4)时间控制:程序流向控制。 存储器:用来存放数据和指令。

I/O接口:主机和外设间的桥梁,提供数据缓冲驱动、信号电平转换、信息转换、地址译码、定时控制等

1

各种功能。

I/O设备:输入原始数据和程序,转换成计算机能识别的信息,送入存储器去等待处理。输出运算结果。 总线:连接计算机系统中各功能部件的信息通道。

第2章 8086CPU作业

2. 8086CPU内部由哪两部分组成?它们的大致是如何工作的?

答:

(1)8086CPU由指令执行部件EU和总线接口部件BIU两部分组成。 (2)

① BIU先执行读存储器操作,从给定地址单元中取出指令,送到先进先出的指令队列中等待执行。 存储器的物理地址=CS?16+IP,在地址加法器?中形成。

② EU从指令队列中取走指令,经EU控制器译码分析后,向各部件发控制命令,以完成执行指令的操作。BIU与EU是并行工作方式。

③ 当指令队列已满,EU在执行指令,未向总线接口单元BIU申请读/写内存或I/O操作时,BIU处于空闲状态。

④ 指令执行过程中,若需对存储器或I/O端口存取数据,EU就要求BIU去完成相应的总线周期。

5. 两个带符号数1011 0100B和1100 0111B相加,运算后各标志位的值等于多少?哪些标志位是有意义的?如果把这两个数当成无符号数,相加后哪些标志位是有意义的?

解:

(1)两个带符号数:不考虑CF标志 1011 0100 + 1100 0111 1 0111 1011 运算后各标志位状态如下:

CF=1,有进位,对于带符号数,无意义。

PF=1,结果有偶数个1

AF=0,无半进位,非BCD码运算,无意义。

ZF=0,结果非0

SF =0,结果为正数

OF=1,溢出(两个负数相加,结果变成了正数) (2)两个无符号数:不考虑SF和OF标志 1011 0100 + 1100 0111 1 0111 1011 运算后各标志位状态如下: CF=1,有进位

PF=1,结果有偶数个1 ZF=0,结果非0

AF、SF、 OF无意义。

20. 简要解释下列名词的意义。

CPU:中央处理单元CPU (Control Processing Unit)也称微处理器,是微型计算机的核心部件,由运算器ALU、控制器、寄存器组以及总线接口等部件组成。主要完成各种运算,负责对整机的控制。

存储器:用于存储程序和数据的硬件设备。

堆栈:堆栈是一种数据结构,是内部RAM的一段区域。设置堆栈的目的是用于数据的暂存,中断、子程序调用时断点和现场的保护与恢复。

IP:指令指针寄存器,用于控制CPU的指令执行顺序(只存放偏移量),只能和代码段寄存器CS配合使用,可以确定当前所要取的指令的内存地址,且始终指向代码段中下一条将要读取到CPU指令队列的那条指令。顺序执行程序时,CPU每取一个指令字节,IP自动加1,指向下一个要读取的字节。

SP:堆栈指针寄存器,用于指示堆栈的栈顶地址偏移量的寄存器,它决定了堆栈在内部RAM中的物理位置。只能和SS段寄存器配合使用,且始终指向堆栈的栈顶,在堆栈指令中隐含的使用它来定位栈顶数据。

BP:基址指针寄存器。用于存放偏移量,通常和SS段寄存器配合使用,在间接寻址中用于定位堆栈段中的内存单元。

段寄存器:由于CPU内部的寄存器都是16位的,为了能够提供20位的物理地址,8086系统中采用了存储器分段的方法。规定存储器的一个段为64KB,由段寄存器来确定存储单元的段基址,由指令提供该单元相对于相应段起始地址的16位偏移量。

状态标志:表示前一步操作(如加、减等)执行以后,ALU所处的状态,后续操作可以根据这些状态

2

标志进行判断,实现转移。

控制标志:可以通过指令人为设置,用以对某一种特定的功能起控制作用(如中断屏蔽等),反映了人们对微机系统工作方式的可控制性。

物理地址:存储器的实际地址,它是指CPU和存储器进行数据交换时所使用的地址。物理地址是由段地址与偏移地址共同决定的,计算物理地址的表达式为:

物理地址 = 段地址 × 16 + 偏移地址

逻辑地址:是在程序中使用的地址,它由段地址和偏移地 址两部分组成。

逻辑地址的表示形式为“段地址:偏移地址”。

机器语言:直接用二进制编码表述的指令系统语言,通常称为机器语言,机器语言指令是计算机惟一能直接识别和执行的指令。

汇编语言:便于记忆和使用,通常使用汇编语言(符号指令或指令助记符)来描述计算机的指令系统。 指令:让计算机完成某种操作的命令称为指令。

指令系统:一台计算机所能识别、执行的指令的集合就是它的指令系统。

总线:连接计算机系统中其他主要功能部件的桥梁,是计算机系统中信息输送的枢纽,只有通过总线,计算机系统的各部件才能实现相互通信。

内部总线:微处理器内部各个器件之间传送信息的通路。

系统总线:微处理机机箱内的底板总线。可分为:ISA、EISA、VESA局部总线、PCI局部总线等。 时钟周期:CPU时钟频率的倒数称为时钟周期,也称T状态。

总线周期:BIU完成一次访问存储器或I/O端口操作所需要的时间称为总线周期。一个基本的总线周期是由4个(或4个以上)时钟周期组成的。

指令周期:执行一条指令所需要的时间称为指令周期,不同指令的指令周期的长短是不同的。一个指令周期是由几个总线周期组成的。

21. 要完成下列运算和控制,用什么标志判别?其值是什么?

(1)比较两数是否相等?

(2)两数运算后结果是正数还是负数? (3)两数相加后是否溢出? (4)奇偶校验判断。

(5)两数相减后比较大小。 (6)中断信号能否允许? 答:

(1)比较两数是否相等:两数相减后用零标志ZF判断,ZF=1,则相等。

(2)两数运算后结果是正数还是负数:用符号标志SF判断, SF=1,则结果为负数。 (3)两数相加后是否溢出:用溢出标志OF判断,OF=1,则有溢出。

(4)奇偶校验判断:采用偶校验方式,判定是否要补“1”?用奇偶标志PF判断,若数据结果低8位中含有偶数个“1”,则PF=1;不用补“1”。

(5)两数相减后比较大小:ZF=1,两数相等。对于无符号数,CF=1,则被减数小于减数;CF=0,则被减数大于减数;ZF=1,则两数相等。对于带符号数,SF⊕OF=1,则被减数小于减数;SF⊕OF=0,则被减数大于减数。

(6)中断信号能否允许:用中断允许标志IF判断,IF=1,则能允许可屏蔽中断。 22. 说明8086系统中“最小模式”和“最大模式”两种工作方式的主要区别。

最小模式(最小工作方式 ):单微处理器系统(系统中只有一个8086微处理器),所有的总线控制信号,都是直接由8086CPU产生的,适用于规模较小的微机应用系统。

当把8086的33脚MN/MX接+5V时,8086 CPU就处于最小工作方式。 最大模式(最大工作方式 ):多微处理器系统(包含有两个或多个微处理器,一个主处理器8086CPU,其他的处理器称为协处理器它们是协助主处理器工作的。 ),主要用在中等或大规模的8086系统中。

当把8086的33脚MN/MX接地时, 8086 CPU就处于最大模式。

第3章 作业

1.分别说明下列指令的源操作数和目的操作数各采用什么寻址方式。 源 目的 (1)MOV AX, 2048H 立即寻址 寄存器寻址 (2) MOV CL, 0FFH 立即寻址 寄存器寻址 (3) MOV BX, [SI] 寄存器间接寻址 寄存器寻址 (4) MOV 5[BX], BL 寄存器寻址 寄存器相对寻址

3

(5) MOV [BP+100H], AX 寄存器寻址 (6) MOV [BX+DI], ‘$’

立即寻址

寄存器相对寻址

基址变址寻址

(7) MOV DX, ES:[BX+SI] 基址变址寻址 寄存器寻址 (8) MOV VAL[BP+DI], DX 寄存器寻址 相对基址加变址寻址 (9) IN AL, 05H I/O端口寻址(或直接寻址) 寄存器寻址 (10) MOV DS, AX 寄存器寻址 寄存器寻址

2. 已知:DS=1000H, BX=0200H, SI=02H, 内存10200H~10205H单元的内容分别为10H, 2AH, 3CH, 46H, 59H, 6BH。下列每条指令执行完后AX寄存器的内容各是什么? AX 内容 (1)MOV AX, 0200H; (AX)=0200H (2) MOV AX, [200H]; (AX)=2A10H (3) MOV AX, BX ; (AX)=0200H (4) MOV AX, 3[BX] ; (AX)=5946H (5) MOV AX, [BX+SI]; (AX)=463CH (6) MOV AX, 2[BX+SI] ; (AX)=6B59H 6.指出下列指令中哪些是错误的,错在什么地方

(1)MOV DL, AX 错误,源和目的操作数类型不匹配,DL是8位寄存器,AX是16位

寄存器。

(2)MOV 8650H, AX 错误,立即数不能作为目的操作数。 (3)MOV DS, 0200H

错误,不能用立即数直接给段寄存器赋值。

(4)MOV [BX], [1200H] 错误,不能在两个存储单元之间直接传送数据

(5)MOV IP, 0FFH 错误,IP不能作目的操作数或不能用立即数直接给IP寄存器赋值。 (6)MOV [BX+SI+3], IP 错误,IP不能作源操作数。

(7) MOV AX, [BX][BP] 错误,基址变址寻址方式必须是一个基址寄存器与一个变址寄存器,

不能两个同时为基址寄存器(BX、BP均为基址寄存器)。

(8)MOV AL, ES:[BP] 正确。

(9)MOV DL, [SI][DI] 错误,基址变址寻址方式必须是一个基址寄存器与一个变址寄存器,

不能两个同时为变址寄存器(SI、DI均为变址寄存器)。

(10)MOV AX, OFFSET 0A20H 错误,OFFSET后必须是存储单元标号地址,不能是立即数。 (11) MOV AL, OFFSET TABLE 错误,操作数类型不匹配,AL为8位, TABLE为16位。 (12)XCHG AL, 50H 错误,交换指令XCHG的操作数不能是立即数。 (13)IN BL, 05H 错误,IN指令的目的操作数必须是累加器

(14)OUT AL, 0FFEH 错误,OUT指令的源操作数必须是累加器,目的操作数为8位I/O端

口地址或用DX做桥梁的16位I/O端口地址。

10. 已知AX=2508H,BX=0F36H,CX=0004H,DX=1864H,求下列每条指令执行后的结果是什么?标志位CF等于什么?

(1)AND AH,CL (AH)=04H CF=0 (2)OR BL,30H (BL)=36H CF=0

(3)NOT AX (AX)=0DAF7H CF不变(不影响CF) (4)XOR CX,0FFF0H (CX)=0FFF4H CF=0 (5)TEST DH,0FH (DH)=18H CF=0 (6)CMP CX,00H (CX)=0004H CF=0 (7)SHR DX,CL (DX)=0186H CF=0 (8)SAR AL,1 (AL)=04H CF=0

4

(9)SHL BH,CL (BH)=0F0H CF=0 (10)SAL AX,1 (AX)=4A10H CF=0

(11)RCL BX,1 CF=1,(BX)=1E6DH, CF=0,(BX)=1E6CH CF=0 (12)ROR DX,CL (DX)=4186H CF=0 11. 假设数据定义如下: DATA SEGMENT

STRING DB ‘The Personal Computer & TV’ DATA ENDS

试用字符串操作指令编程完成以下功能:

(1)把该字符串传送到附加段中偏移地址为GET_CHAR开始的内存单元中。 解:程序段如下:

LEA SI,STRING ;置源串偏移地址 LEA DI,GET_CHAR ;置目的串偏移地址 MOV CX,26 ;置串长度 CLD ;方向标志复位 REP MOVSB ;字符串传送

12.编程将AX寄存器中的内容以相反的次序传送到DX寄存器中,并要求AX中的内容不被破坏,然后统计DX寄存器中1的个数是多少。

解:将AX的内容用ROR循环右移,16次之后AX的内容不变(如果用算术/逻辑右移SHL/SAL,则AX的内容破坏,需要用堆栈PUSHU AX/POP AX保护),其最低位移入CF中,再使用RCL循环左移将CF中的值移入DX中。并且,如果CF的值为1,则将BL加1。

MOV CX, 16 XOR BL, BL

LP1: ROR AX, 1

JNC LP2 INC BL

LP2: RCL DX,1

LOOP LP1 HLT

调试程序:

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT BUF DW 12

BUF1 DW 100 DUP (?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS

MOV AX,DATA

MOV DS,AX MOV AX,1234H

5

MOV CX, 16 XOR BL, BL LP1: ROR AX, 1 JNC LP2 INC BL LP2: RCL DX,1 LOOP LP1 HLT CODE ENDS

15. 某班有七个同学的英语成绩低于80分,分数存在ARRAY数组中,试编程完成以下工作:给每人加5分,结果存到NEW数组中. 解:

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT

ARRAY DB 7 DUP(?)

NEW DB 7 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV CX, 7 MOV BX, 0

LP1: MOV AL, ARRAY[BX] ADD AL, 05H DAA

MOV NEW[BXI], AL INC BX LOOP LP1 HLT CODE ENDS

END START 调试程序:

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT

ARRAY DB 65H,76H,78H,54H,90H,85H,68H NEW DB 7 DUP(?) BUF1 DW 100 DUP (?) DATA ENDS CODE SEGMENT

END START

6

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS

MOV AX,DATA

MOV DS,AX MOV CX, 7 MOV BX, 0

LP1: MOV AL, ARRAY[BX] ADD AL, 05H DAA

MOV NEW[BXI], AL INC BX LOOP LP1 HLT CODE ENDS

某班有七个同学的英语成绩低于80分,分数存在ARRAY数组中,试编程完成以下工作: (1)给每人加5分,结果存到NEW数组中 (2)把总分存到SUM单元中 (3)把平均分存到AVERAGE单元中 解:

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT

ARRAY DB 7 DUP(?)

NEW DB 7 DUP(?) SUM DW 0 AVG DB 0 DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV CX, 7 MOV SI, 0 MOV SUM, 0 MOV AH, 0 LP1: MOV AL, ARRAY[SI] ADD AL, 05H DAA

MOV NEW[SI], AL ADD AL ,SUM DAA

MOV SUM,AL

END START

7

ADC AH, 0 DAA

MOV SUM+1, AH INC SI LOOP LP1 MOV AX, SUM MOV BL,07H DIV BL MOV AVG, AL HLT CODE ENDS

END START 调试程序:

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT

ARRAY DB 65H,76H,78H,54H,90H,85H,68H NEW DB 7 DUP(?) SUM DB 00H,00H AVG DB 0

BUF1 DW 100 DUP (?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS

MOV AX,DATA

MOV DS,AX MOV CX, 7 MOV SI, 0 MOV SUM, 0 MOV AH, 0 LP1: MOV AL, ARRAY[SI] ADD AL, 05H DAA

MOV NEW[SI], AL ADD AL , SUM DAA

MOV SUM,AL ADC AH, 0 MOV SUM+1, AH INC SI LOOP LP1 MOV AL, SUM

8

MOV AH,SUM+1 MOV BL,07H DIV BL MOV AVG, AL HLT CODE ENDS

13. 设CS=1200H, IP=0100H, SS=5000H, SP=0400H, DS=2000H, SI=3000H, BX=0300H, (20300H)=4800H, (20302H)=00FFH, TABLE=0500H, PROG_N标号的地址为1200:0278 H,PROG_F标号的地址为3400:0ABCH。说明下列每条指令执行完后,程序分别转移到何处执行? JMP指令 (1)JMP PROG_N

段内直接近转移,目的地址为1200H:0278H(或12278H) (2)JMP BX

段内寄存器间接转移,目的地址为1200H:0300H(或12300H) (3)JMP [BX]

物理地址=DS×10H+BX=2000H×10H+0300H=20300H (20300H)=4800H→IP

段内存储器间接转移,目的地址为1200H:4800H(或16800H) (4)JMP FAR PROG_F

段间直接转移,目的地址为3400H:0ABCH(或34ABCH) (5)JMP DWORD PTR[BX]

物理地址=DS×10H+BX=2000H×10H+0300H=20300H (20300H)=4800H→IP, (20302H)=00FFH→CS

段间存储器间接转移,目的地址为00FFH:4800H(或057F0H)

JMP改为CALL后,目的地址与JMP相同。 (1)CALL PROG_N

段内直接调用,3字节指令,目的地址为1200H:0278H(或12278H),0103H入栈,SP=03FEH (2)CALL BX

段内寄存器间接调用,2字节指令,目的地址为1200H:0300H(或12300H) ,0102H入栈,SP=03FEH (3)CALL [BX]

段内存储器间接调用,2字节指令,目的地址为1200H:4800H(或16800H),0102H入栈,SP=03FEH (4)CALL FAR PROG_F

段间直接调用,5字节指令,目的地址为3400H:0ABCH(或34ABCH),1200H和0105H分别入栈,SP=03FCH

(5)CALL DWORD PTR[BX]

段间间接调用,2字节指令,目的地址为00FFH:4800H(或057F0H),1200H和0102H分别入栈,SP=03FCH

部分调试程序:

END START

9

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT BUF DW 12

BUF1 DW 100 DUP (?) ORG 300H

DB 00H,48H,0FFH,00H DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS

MOV AX,DATA

MOV DS,AX MOV BX,0300H CALL PROG_N CALL BX CALL [BX] ORG 0278

PROG_N:RET ORG 0300H RET ORG 4800H RET HLT CODE ENDS

END START

14. 如在下列程序段的括号中分别填入以下指令: (1)LOOP NEXT (2) LOOPE NEXT (3) LOOPNE NEXT

试说明在这三种情况下,程序段执行完后,AX, BX, CX, DX寄存器的内容分别是什么 START: MOV AX, 01H

MOV BX, 02H

MOV DX, 03H MOV CX, 04H NEXT: INC AX ADD BX, AX~ SHR DX, 1 ( ) 解:

LOOP过程: AX BX CX

初始值

01H

DX

03 H

02H 04H

10

循环1次 02H 循环3次 04H 循环4次 05H

04H 0BH 10H

03H 01H 01H 00H

DX 00H 01H 00H

00H 00H

循环2次 03H 07H 02H 00H

结果:

AX BX CX (1) (2) (3)

20. 设8086CPU的时钟频率为5MHz,请编写延时5ms的子程序。 解:微机的主频率为5MHz

则:时钟周期=主频率的倒数=1/(5×10-6)=0.2μs

延时5ms需要的时钟周期数= 5ms/ 0.2μs=25000 延时子程序如下:

DELAY5:MOV CX,N 4 DLY1:NOP 3 ×N

LOOP DLY1 17 ×(N-1)+ 5 RET 16

应该有25000=4+ 3 ×N+ 17 ×(N-1)+ 5+16,才能实现要求的延时。则: N=1250=04E2H 延时子程为:

DELAY5:MOV CX,04E2H DLY1:NOP

LOOP DLY1 RET

第4章作业

P153

5. 阅读下列程序,说明每条指令执行后的结果是什么?

X1 DB 65H, 78H X2 DW 06FFH, 5200H X3 DD ?

GO: MOV AL, TYPE X1 MOV BL, TYPE X2 MOV CL, TYPE X3

MOV AH, TYPE GO MOV BH, SIZE X2

MOV CH, LENGTH X3 解:

(1)前三条语句的功能是设置数据于数据段中,从数据段偏移地址0000H开始存放。

05H 02H 03H

10H 04H 07H

00H 03H 02H

执行一次,ZF=0,退出循环。 执行两次,ZF=1,退出循环。

11

变量 X1 X2 X3

程序汇编后结果如下:

偏移地址 0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H 0008H 0009H

数据 65H 78H FFH 06H 78H 00H 随机数 随机数 随机数 随机数

六条程序执行结果如下:

(AL)=01H;设置变量类型属性,字节数 (BL)=02H;设置变量类型属性,字节数 (CL)=04H;设置变量类型属性,字节数

(AH)=0FFH;设置GO显示类型,近标号,为-1,补码表示 (BH)=02H;设置数据类型,无DUP时,返回数据类型的字节数 (CH)=01H;无DUP时,返回1。 程序执行后结果如下:

调试程序如下:

12

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT X1 DB 65H, 78H X2 DW 06FFH, 5200H X3 DD ? DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS MOV AX,DATA MOV DS,AX GO: MOV AL, TYPE X1 MOV BL, TYPE X2 MOV CL, TYPE X3 MOV AH, TYPE GO MOV BH, SIZE X2 MOV CH, LENGTH X3 POP DS HLT CODE ENDS END START

6. 画出示意图,说明下列变量在内存中如何让存放?

A1 DB 12H, 34H A2 DB ‘Right.’ A3 DW 5678H A4 DB 3 DUP(?)

(1)设置数据于数据段中,从数据段偏移地址0000H开始存放。

变量 A1 A2 A3 A4

偏移地址 0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H 0008H 0009H 000AH 000BH

13

数据 12H 34H 52H 69H 67H 68H 74H 2EH 78H 56H 随机数 随机数

调试程序如下:

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT A1 DB 12H, 34H A2 DB 'Right.' A3 DW 5678H A4 DB 3 DUP(?) DATA ENDS CODE SEGMENT

000CH 随机数 ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS MOV AX,DATA MOV DS,AX POP DS HLT CODE ENDS END START 程序汇编后结果如下:

12. 编程实现,从键盘输入一个十进制数0~9,查表求键入数字的七段代码(共阳极LED显示器的段码),存入DL中,并在键入数字之前,显示提示信息“Please input a number(0~9):”。 解:

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT

TABLE DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H BUF DB 'Please input one number(0~9):',0DH,0AH,'$'

14

DATA ENDS CODE

SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: PUSH DS MOV AX,DATA MOV DS,AX

MOV DX,OFFSET BUF

MOV AH,09H INT 21H MOV AH,1 INT 21H AND AL,0FH

MOV BX,OFFSET TABLE XLAT MOV DL,AL POP DS HLT CODE

ENDS END START

调试结果:

数字5的共阳极LED七段码为92H。

15. 已知:在内存BUF开始的单元中,存在一串数据:58,75,36,42,89。编程找出其中的最小值存入MIN单元中,并将这个数显示在屏幕上。 解:

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT

15

BUF DB 58H, 75H, 36H, 42H, 89H MIN DB 0 DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:STACK START: PUSH DS MOV AX, DATA MOV DS, AX MOV CX, 4

MOV BX, OFFSET BUF MOV AL, [BX] ST1: INC BX CMP AL, [BX] JBE NEXT MOV AL, [BX] NEXT:LOOP ST1 MOV MIN, AL AND AL, 0F0H MOV CL,4 ROR AL, CL ADD AL, 30H MOV DL, AL MOV AH, 02H INT 21H MOV AL, MIN AND AL, 0FH ADD AL, 30H MOV DL, AL MOV AH, 02H INT 21H POP DS MOV AH, 4CH INT 21H HLT CODE

18. 某班有20个同学的微机原理成绩存放在LIST开始的单元中,要求编程先从高到低的次序排列好,再求出总分和平均值,分别存放在SUM和AVER开始的单元中。 解:

STACK ENDS DATA SEGMENT

LIST DB 65H,76H,78H,54H,90H,85H,68H,66H,77H,88H

ENDS

END START

16

DB 99H, 89H, 79H, 69H,75H,85H,63H,73H,83H,93H SUM DW 0 AVER DB 0

BUF DB 100 DUP (?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS MOV AX,DATA MOV DS,AX

MOV DI, OFFSET LIST MOV BX, 19 LP0: MOV SI, DI MOV CX, BX LP1: MOV AL, [SI] INC SI

CMP AL, [SI] JNC LP2 MOV DL, [SI] MOV [SI-1], DL MOV [SI], AL LP2: LOOP LP1 DEC BX JNZ LP0 LP3: MOV CX, 20

MOV BX, OFFSET LIST MOV SUM, 0 XOR AX, AX LP4: ADD AL, [BX] DAA ADC AH, 0 INC BX LOOP LP4 MOV SUM, AX MOV BL, 20H DIV BL ADD AL,0 DAA

MOV AVER AL POP DS HLT CODE ENDS END START

17

20. 编程将存放在AL中的无符号二进制数,转化成十六进制数,再转换成ASII码并显示在屏幕上。 解: 程序如下:

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT DB 100 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:STACK START: PUSH DS MOV AX, DATA MOV DS, AX MOV DH, AL MOV CH, 02H ST1: MOV CL, 4 ROR DH, CL MOV AL, DH AND AL, 0FH ADD AL, 30H CMP AL, 39H JBE DISP ADD AL, 07H DISP: MOV DL, AL MOV AH, 02H INT 21H DEC CH JNZ ST1 POP DS MOV AH, 4CH INT 21H HLT CODE ENDS END START

调试程序如下:

STACK SEGMENT STACK BUF DB 01111000B

DB 100 DUP(?) STACK ENDS DATA SEGMENT DB 100 DUP(?)

18

DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:STACK START: PUSH DS MOV AX, DATA MOV DS, AX MOV AL, BUF MOV DH, AL MOV CH, 02H ST1: MOV CL, 4 ROR DH, CL MOV AL, DH AND AL, 0FH ADD AL, 30H CMP AL, 39H JBE DISP ADD AL, 07H DISP: MOV DL, AL MOV AH, 02H INT 21H DEC CH JNZ ST1 POP DS MOV AH, 4CH INT 21H HLT CODE ENDS END START

21. 编写程序,使用三种以上的方法,将存储器中2000H开始的地址单元中的100字节数据复制到3000H开始的存储器地址单元中。

解:

(1)利用通用传送指令MOV

MOV SI,2000H 注意这里如果是标号地址 ,则必须用OFFSET MOV DI,3000H MOV CX,100 LP1: MOV AL,[SI]

MOV [DI],AL INC SI INC DI

LOOP LP1 HLT

MOV CX,100 MOV BX,0

LP0:MOV AL,2000[BX]

MOV 3000[BX],AL INC BX

19

LOOP LP0 HLT

(2)利用交换指令XCHG MOV SI,2000H MOV DI,3000H MOV CX,100 LP2: MOV AL,[SI]

XCHG [DI],AL INC SI INC DI

LOOP LP2 HLT

(3)利用换码指令XLAT MOV BX,2000H MOV DI,3000H MOV CX,100

LP3: XOR AL,AL

XLAT

MOV [DI], AL INC BX INC DI LOOP LP3 HLT

(4)利用堆栈实现数据传送 MOV SI,2000H MOV DI,3000H MOV CX,50 LP4: PUSH [SI]

POP [DI] INC SI INC SI INC DI INC DI

LOOP LP4 HLT

(5)利用串操作指令REP MOVSB

MOV SI,2000H MOV DI,3000H MOV CX,100

CLD ;DF=0,SI、DI自动+1 REP MOVSB HLT 调试程序:

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT ORG 2000H

DB 11H,22H,33H,44H,55H.66H,77H,88H,99H DB 100 DUP(?) ORG 3000H

DB 100 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

20

START:PUSH DS MOV AX,DATA MOV DS,AX MOV SI,2000H MOV DI,3000H MOV CX,100 LP1: MOV AL,[SI] MOV [DI],AL INC SI INC DI

LOOP LP1 POP DS HLT CODE ENDS END START

22. 在DATA开始的4个单元中存放着一个32位数,求出其中的“1”的个数,并存入COUNT单元中。 解:

DATA SEGMENT

DATA1 DB 0FEH,86H,7CH,35H COUNT DB 00H DATA ENDS

STACK SEGMENT

DB 100 DUP(?)

STACK ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START:PUSH DS

MOV AX,DATA

MOV DS,AX MOV AX,STACK MOV SS,AX MOV SI,OFFSET DATA1 MOV BX,[SI] MOV DX,[SI+2] MOV CX,32 XOR AL,AL LP1:RCR DX,1

RCR BX,1 JNC LP2 INC AL LP2:LOOP LP1

MOV COUNT,AL POP DS MOV AH,4CH INT 21H HLT CODE ENDS

END START

1. 下列变量各占多少字节?

A1 DW 23H,5876H 4字节

21

A2 DB 3 DUP(?),0AH,0DH,‘$’ 6字节

A3 DD 5 DUP(1234H,567890H) 4×2×5=40字节 A4 DB 4 DUP(3 DUP(1,2,‘ABC’)) 5×3×4=60字节

调试程序:

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT

DA1 DW 23H,5876H

DA2 DB 3 DUP(?) ,0AH,0DH,'$' DA3 DD 5 DUP(1234H,567890H) DA4 DB 4 DUP(3 DUP(1,2,'ABC')) DA5 DB 10 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START:PUSH DS

MOV AX,DATA

MOV DS,AX

MOV AX,OFFSET DA1 MOV BX,OFFSET DA2 MOV CX,OFFSET DA3 MOV DX,OFFSET DA4 MOV DI,OFFSET DA5 POP DS HLT CODE ENDS END START

5. 对于下面的数据定义,各条MOV指令执行后,有关寄存器的内容是什么?

DA1 DB ?

DA2 DW 10 DUP(?) DA3 DB ‘ABCD’ MOV

AX,TYPE DA1

MOV BX,SIZE DA2 MOV CX,LENGTH DA3

解:各条MOV指令执行后,有关寄存器的内容如下:

MOV AX,TYPE DA1 ;(AX)= 1

MOV BX,SIZE DA2 ;(BX)= 20

MOV CX,LENGTH DA3 ;(CX)=1 调试程序

STACK SEGMENT STACK

DB 100 DUP(?) STACK ENDS DATA SEGMENT DA1 DB ?

DA2 DW 10 DUP(?) DA3 DB 'ABCD' DATA ENDS

22

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS

MOV AX,DATA

MOV DS,AX

MOV AX,TYPE DA1 MOV BX,SIZE DA2 MOV CX,LENGTH DA3 POP DS HLT CODE ENDS END START

6. 下段程序完成后,AH等于什么?

IN

JZ

L1

AH,0 AL,5FH

TEST AL,80H MOV

JMP STOP

L1:MOV AH,0FFH STOP:HLT 解:

如果地址为5FH的外设输入到AL中的数据的最高位=1,则(AH)= 0,否则,(AH)= 0FFH。

10. 编制两个通用过程,完成两位十六进制数转换成ASCII码,并将ASCII码字符显示。

(1)两位十六进制数转换成ASCII码

设两位十六进制数存放在DL中,输出的ASCII码存放在BX中。 CON PROC PUSH AX PUSH CX MOV CL, 4 MOV AL, DL AND AL, 0FH CMP AL, 0AH JNC LP1 ADD AL, 30H JMP LP2 LP1: ADD AL, 37H LP2: MOV BL, AL MOV AL, DL SHR AL, CL AND AL, 0FH CMP AL, 0AH

23

JNC LP3 ADD AL, 30H JMP LP4 LP3: ADD AL, 37H LP4: MOV BH, AL POP CX POP AX RET CON ENDP

四位十六进制数转换成ASCII码,

设四位十六进制数存放在存储器BUF1单元中,输出的ASCII码存放在存储器BUF2开始的单元中。 CON PROC PUSH AX PUSH CX PUSH DX

MOV DI, OFFSET BUF2 MOV SI, OFFSET BUF1 MOV CL, 4 MOV DH, 4 MOV DX, [SI] LP1: ROL DX, CL MOV AL, DL AND AL, 0F ADD AL, 30H CMP AL, 3AH JC LP2 ADD AL, 07H LP2: MOV [DI], AL INC DI DEC CH JNZ LP1 POP DX POP CX POP AX RET CON ENDP

(2)ASCII码字符显示 设2个ASCII码字符在BX中。 DISP PROC PUSH AX

24

MOV DL, BL MOV AH, 2 INT 21H

MOV DL, BH INT 21H POP AX RET DISP ENDP

调试程序

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT

DA1 DB 5FH, 0A4H, 0C7H DA2 DB 100 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS

MOV AX,DATA MOV DS,AX MOV DL,DA1 CALL CON CALL DISP POP DS HLT CON:

PUSH AX PUSH CX MOV CL,4 MOV AL,DL AND AL,0FH CMP AL,0AH JNC LP1 ADD AL,30H JMP LP2 LP1: ADD AL,37H LP2: MOV BL,AL MOV AL,DL SHR AL,CL AND AL,0FH CMP AL,0AH JNC LP3 ADD AL,30H JMP LP4 LP3: ADD AL,37H LP4: MOV BH,AL POP CX POP AX RET

25

DISP:

PUSH AX MOV DL,BL MOV AH,2 INT 21H MOV DL,BH INT 21H POP AX RET CODE ENDS END START

13. 将键盘上输入的一位为十六进制数转换成十进制数,在屏幕上显示。 DATA SEGMENT

DATA1 DB 10 DUP(?) DATA2 DB 10 DUP(?) DATA ENDS

STACK SEGMENT STACK

DB 100 DUP(?)

STACK ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START:PUSH DS

MOV AX,DATA

MOV DS,AX KEY: MOV AH,1 INT 21H ZH: CMP AL,3AH JAE ZH1

SUB AL,30H JMP ZH2

ZH1: SUB AL,37H ADD AL,0 DAA

ZH2: MOV BL,AL AND AL,0F0H MOV CL,4 SHR AL,CL ADD AL,30H MOV BH,AL MOV AL,BL AND AL,0FH ADD AL,30H

MOV BL,AL DISP: MOV DL,BH

MOV AH,2 INT 21H MOV DL,BL MOV AH,2 INT 21H POP DS MOV AH,4CH INT 21H HLT

CODE ENDS

END START

26

调试程序:

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT

BUF1 DB 'Please input one hexadecimal(0-9,A-F):',0DH,0AH,'$' BUF2 DB 20H,20H,'Decimal(0-15):',0DH,0AH,'$' BUF3 DB 10 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS

MOV AX,DATA MOV DS,AX

MOV DX,OFFSET BUF1 MOV AH,9 INT 21H KEY: MOV AH,1 INT 21H PUSH AX

MOV DX,OFFSET BUF2 MOV AH,9 INT 21H POP AX

ZH: CMP AL,3AH JAE ZH1 SUB AL,30H JMP ZH2 ZH1: SUB AL,37H ADD AL,0 DAA

ZH2: MOV BL,AL AND AL,0F0H MOV CL,4 SHR AL,CL ADD AL,30H MOV BH,AL MOV AL,BL AND AL,0FH ADD AL,30H

MOV BL,AL DISP: MOV DL,BH MOV AH,2 INT 21H MOV DL,BL MOV AH,2 INT 21H POP DS MOV AH,4CH INT 21H HLT CODE ENDS

END START

22. 编程序统计学生的数学成绩,分别归类90~99分,80~89分,70~79分,60~69分及60分以下,并将各段的人数送入内存单元中。 解:

STACK SEGMENT

DB 100 DUP(?)

STACK ENDS DATA SEGMENT

27

DATA1 DB 200 DUP(?) DATA2 DB 100 DUP(?) DATA3 DB 10 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START:PUSH DS

MOV AX,DATA MOV DS,AX XOR CX,CX

KEY:MOV SI,OFFSET DATA1 KEY1:MOV AH,1 INT 21H CMP AL,‘$’ JZ ZH INC CX

MOV [SI],AL

INC SI

JMP KEY1

ZH: MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA2 SHR CX,1 PUSH CX

ZH1:MOV AL,[SI]

AND AL,0FH SHL AL,1 SHL AL,1 SHL AL,1 SHL AL,1 MOV BL,AL INC SI

MOV AL,[SI] AND AL,0FH OR AL,BL MOV [DI],AL INC SI INC DI

LOOP ZH1

TJ: POP CX

MOV DI,OFFSET DATA2 TJ0: MOV AL,[DI]

CMP AL,90H

JNB TJ1

CMP AL,80H

JNB TJ2

CMP AL,70H

JNB TJ3

CMP AL,60H

JNB TJ4

INC 4[DATA3] JMP TJ5

TJ1: INC [DATA3] JMP TJ5

TJ2: INC 1[DATA3] JMP TJ5

TJ3: INC 2[DATA3] JMP TJ5

TJ4: INC 3[DATA3] 28

TJ5: INC DI LOOP TJ0 POP DS

MOV AH,4CH INT 21H HLT

CODE ENDS

END START

调试程序:

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT DATA1 DB 80 DUP(?) DATA2 DB 80 DUP(?) DATA3 DB 10 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: PUSH DS

MOV AX,DATA

MOV DS,AX XOR CX,CX

KEY: MOV SI,OFFSET DATA1 KEY1: MOV AH,1 INT 21H CMP AL,'$' JZ ZH INC CX

MOV [SI],AL INC SI

JMP KEY1

ZH: MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA2 SHR CX,1 PUSH CX ZH1: MOV AL,[SI]

AND AL,0FH SHL AL,1 SHL AL,1 SHL AL,1 SHL AL,1 MOV BL,AL INC SI

MOV AL,[SI] AND AL,0FH OR AL,BL MOV [DI],AL INC SI INC DI

LOOP ZH1

TJ: POP CX

MOV DI,OFFSET DATA2 TJ0: MOV AL,[DI] CMP AL,90H JNB TJ1

29

CMP AL,80H JNB TJ2

CMP AL,70H JNB TJ3

CMP AL,60H JNB TJ4

INC 4[DATA3] JMP TJ5

TJ1: INC [DATA3] JMP TJ5

TJ2: INC 1[DATA3] JMP TJ5

TJ3: INC 2[DATA3] JMP TJ5

TJ4: INC 3[DATA3] TJ5: INC DI

LOOP TJ0 POP DS

MOV AH,4CH INT21H HLT CODE ENDS

END START

第5章作业 P194

5. PROM、EPROM、E2PROM的共同特点是什么?它们在功能上主要不同之处在哪里?试举例说明它们的用途。 答:

(1)共同特点:只读存储器,只能读出,在系统运行过程中不能写入。具有非易失性,写入或擦除一般需用特殊方法。 (2)功能上的不同:

一次可编程的PROM:用户可根据需要修改存储器中的某些存储单元,只能一次性修改,不能二次编程,成本高,可靠性差,使用具有一定的局限性。用户可部分写入。

紫外线可擦除EPROM:显著优点是可多次编程,但不能在线编程,不容易修改局部内容。需要紫外线擦出。一般用于产品开发,或用于小批量生产。

电擦可编程E2PROM:可改写任一部分内容,擦写10000次,甚至百万次,数据保存10年。可在电路板上在线编程。一般用于产品开发,或用于小批量生产。性能和次数比EPROM好。EEPROM擦写速度较慢,不能做大容量内存。 (3)用途

一次可编程的PROM:用于大批量生产的各种需要存储器的电子设备。

紫外线可擦除EPROM:一般用于产品开发,或用于小批量生产。广泛用于微机化仪器设计,可用编程器写入调试好的程序和数据,并能长期保存。一般用于产品开发,或用于小批量生产。主要用于程序存储器,容量不大。

电擦可编程E2PROM:用来存放仪器或接口卡的硬件设置数据或构成防止软件非法拷贝的“硬件锁”。擦写速度较慢,容量不大,不能做大容量内存。如计算机主板上的BIOS ROM。

8. 试说出闪存的3项技术特点,并举出至少5个采用闪存的计算机设备或电子产品名称。 答:

(1)具有非易失性,能不加电而长期保存信息,抗干扰能力强;

能在线进行快速电擦除,类似于EEPROM;编程速度可达10ns/byte,比EPROM和EEP ROM快; 价格已低于DRAM,容量则接近于DRAM。

30

性能好、功耗低、体积小、重量轻。

(2)取代EPROM和EEPROM,固化BIOS,并用在打印机、条码阅读器、各种仪器和外设中。

制作U盘、固态硬盘。

各类小型存储介质:CF卡(紧凑式闪存)、SM卡(固态软盘卡)、SD卡(安全数码卡)、MMC卡(多媒体卡)、 MS卡(记忆棒)、XD卡(尖端数字图像卡) 等。

12. 什么是Cache?它处在计算机的什么位置上?起作用是什么? 答:

(1)Cache:高速缓冲存储器

(2)Cache在计算机中位于CPU和DRAM之间。

(3)在慢速DRAM和快速CPU之间设置1个容量较小的高速缓冲存储器(Cache)。能不明显增加成本而提高CPU存取数据速度。以解决计算机存储器系统的容量、存取速度及单位成本之间的矛盾。

为了解决存储器系统的容量、存取速度及单位成本之间的矛盾,可以采用Cache----主存存储结构,即在主存和CPU之间设置高速缓冲存储器Cache,把正在执行的指令代码单元附近的一部分指令代码或数据从主存装入Cache中,供CPU在一段时间内使用,在一定容量Cache的条件下,可以做到使CPU大部分取指令代码及进行数据读写的操作都只要通过访问Cache,而不是访问主存而实现。

18. 用8K×8位的RAM6264构成一个32K×8位存储器,存储器的起始地址为18000H,要求存储芯片的地址连续,用74LS138做译码器,系统中只用到了地址线A18-A0,采用部分译码法设计译码电路,试画出硬件电路图,并用列表说明每块芯片的地址范围。(选用8088CPU)

解:RAM6264为8KB×8位SRAM,有13根地址线:A12 A11A10A9A8 A7A6A5 A4 A3A2A1A0,8KB的地址范围,13根地址线从全0变成全1。

8KB×8位RAM6264构成一个32K×8位存储器,需要字扩展,32KB/8KB=4,需要四片RAM6264。

题目要求存储器的起始地址为18000H,即:0001 1000 0000 0000 0000B。 题目要求存储芯片的地址连续,则4片RAM6264的地址范围为:

A19A18A17A16 A15A14A13A12 A11A10A9A8 A7A6A5 A4 A3A2A1A0 十六进制地址 1#:0001 1000 0000 0000 0000B 18000H 0001 1001 1111 1111 1111B 19FFFH

2#:0001 1010 0000 0000 0000B 1A0000H 0001 1011 1111 1111 1111B 1BFFFH

3#:0001 1100 0000 0000 0000B 1C000H 0001 1101 1111 1111 1111B 1DFFFH

4#:0001 1110 0000 0000 0000B 1E000H 0001 1111 1111 1111 1111B 1FFFFH

根据CPU外扩存储器的原理,从4片RAM6264的地址范围可以看出:A12~A0为每片存储器自己的范围,需要接CPU的低位地址线A12~A0;变化的地址为A14A13,译码器输入必须包括A14A13,题目要求用74LS138做译码器,因此,74LS138译码器的输入必须为A15A14A13, 1#~4#存储器的片选接到74LS138译码器的输出Y4~Y7上。

结论:要求存储芯片的地址连续,译码器的输入必须是除每片存储器的地址外的连续地址。 除每片存储器的地址外,所有芯片的相同电平地址通过逻辑门接到译码器的控制端,所有芯片的不同电平的地址位必须参与译码。

选择A15A14A13作为74LS138译码器的输入。A16=1(接74LS138译码器的G),A18A17=00。(经或门后接74LS138译码器的接G2A),M/IO接74LS138译码器的G2B。

31

A19A18A17A16 A15A14A13A12 A11A10A9A8 A7A6A5 A4 A3A2A1A0 十六进制地址

1#:0001 1000 0000 0000 0000B 18000H 0001 1001 1111 1111 1111B 19FFFH

2#:0001 1010 0000 0000 0000B 1A000H 0001 1011 1111 1111 1111B 1BFFFH

3#:0001 1100 0000 0000 0000B 1C000H 0001 1101 1111 1111 1111B 1DFFFH

4#:0001 1110 0000 0000 0000B 1E000H 0001 1111 1111 1111 1111B 1FFFFH

1#、2#、3#、4# RAM6264的片选接74LS138译码器的输出Y4、Y5、Y6、Y7。 系统硬件电路如下:

每块芯片的地址范围为:

芯片号 1# 2# 3# 4#

1. 静态RAM与动态RAM有何区别?

随机存取存储器RAM用来存放数据或指令。其特点是:在微机系统的工作过程中,可以随机地对其中的各个存储单元进行读/写操作,读写方便,使用灵活;缺点是易失性存储器。

(1)静态RAM(SRAM)是以双稳态元件作为基本的存储单元来保存信息的,因此,其保存的信息在不断电的情况下,是不会被破坏的。其特点是速度快、片容量小、功耗大。用于RAM容量较小或要求存取速度较高的系统中。在计算机中常用于超高速缓存。

(2)动态RAM(DRAM)是靠电容的充、放电原理来存放信息的,必须定时进行刷新。其特点是存

起始地址 18000H 1A000H 1C000H 1E000H 结束地址 19FFFH 1BFFFH 1DFFFH 1FFFFH 32

储元中管子的数目较少(1个),有利于集成,速度比SRAM慢,片容量大,功耗低,成本比SRAM低 。缺点是每隔一定时间需要刷新一次。适合于构成RAM容量较大或要求低功耗的存储器系统。在计算机中常用于内存。

8. 现有一存储体芯片容量为512×4位,若要用它组成4KB的存储器,需要多少这样的芯片?每块芯片需要多少寻址线?整个存储系统需要多少寻址线? 解:

(1)组成4KB的存储器需要存储体芯片的数量为: (8/4)×(4×1024/512)=16片 (2)因为512=29

所以每块芯片需要寻址线数目为:9根

(3)因为每块芯片需要寻址线数目为9根,整个存储系统需要8组存储体芯片(每组两片),用138译码器,则至少需要3根地址线。因此整个存储系统需要9+3=12根地址线。

13. 用8K×8位的EPROM2764,8K×8位的RAM6264和译码器74LS138构成一个16K字ROM,16K字RAM的存储器系统。8086工作在最小模式,系统带有地址锁存器8282,数据收发器8286。画出存储器系统与CPU的连接图,写出各芯片的地址分配。 解:

(1)用8086CPU组成16K字 ROM,16K字 RAM的存储器系统。

需要4片EPROM2764,4片RAM6264。电路原理图如下图所示。

1#、2#2764的地址范围为:00000~03FFFH (1#为偶数地址, 2#为奇数地址), 3#、4#2764的地址范围为:04000~07FFFH (3#为偶数地址, 4#为奇数地址), 1#、2#6264的地址范围为:08000~0BFFFH (5#为偶数地址,6#为奇数地址),

3#、4#6264的地址范围为:0C000~0FFFFH (7#为偶数地址,8#为奇数地址)。

(2)用8088CPU组成16KB ROM,16KB RAM的存储器系统。

需要2片EPROM2764,2片RAM6264。电路原理图如下图所示。

1#2764的地址范围为:00000~01FFFH 2#2764的地址范围为:02000~03FFFH 1#6264的地址范围为:04000~05FFFH

2#6264的地址范围为:06000~07FFFH

33

第6章作业 P230

2. 什么叫I/O端口?一般的接口电路中可以设置哪些端口?计算机对I/O端口寻址时可采用哪两种方法?在8086/8088CPU中一般采用那种编制方法? 答:

(1)端口:在接口电路中,存放数据、状态和控制信息的寄存器及其控制逻辑统称为I/O端口。 (2)一般的接口电路中可以设置数据端口、状态端口和命令端口(控制端口)等。

(3)计算机对I/O端口寻址时可采用I/O 统一编址(存储器映像寻址)和I/O 端口独立编址两种方法。 (4)在8086/8088CPU中对I/O端口寻址采用独立编址方法。

3. CPU与外设间传送数据主要有哪几种方式?

CPU与外设之间传输数据的控制方式通常有三种:程序控制方式、中断方式和DMA方式。 (1)程序控制方式:指用输入/输出指令来控制信息传输的方式,是一种软件控制方式,根据程序控制的方法不同,又可以分为无条件传送方式和条件传送方式。

无条件传送方式:CPU认为接口始终是处于“准备好”状态,能随时接收或发送数据,适用于那些能随时读写的设备。特点是接口简单,要求输入有缓冲,输出有锁存。应用的局限性较大,一般只适用于诸如开关控制、七段数码管的显示控制等场合。

条件传送方式:通过程序查询相应设备的状态,若状态不符合,则CPU不能进行输入/输出操作,需要等待;只有当状态信号符合要求时,CPU才能进行相应的输入/输出操作。特点是接口电路简单,CPU利用率低(程序循环等待),接口需向CPU提供查询状态。适用于CPU不太忙,传送速度要求不高的场合。要求各种外设不能同时工作,外设处于被动状态。

(2)中断传送方式:当外设准备好时,由外设通过接口电路向CPU发出中断请求信号,CPU在允许的情况下,暂停执行当前正在执行的程序,响应外设中断,转入执行相应的中断服务子程序,与外设进行一次数据传送,数据传送结束后,CPU返回继续执行原来被中断的程序。特点是CPU的利用率高,外设具有申请CPU中断的主动权,CPU和外设之间处于并行工作状态。但中断服务需要保护断点和恢复断点(占用存储空间,降低速度),CPU和外设之间需要中断控制器。适用于CPU的任务较忙、传送速度要求不高的场合,尤其适合实时控制中的紧急事件处理。

34

(3)DMA方式:外设利用专用的接口( DMA 控制器)直接与存储器、外设进行高速数据传送,并不经过CPU( CPU 不参与数据传送工作),总线控制权不在CPU处,而由DMA 控制器控制。特点是接口电路复杂,硬件开销大。大批量数据传送速度极快。适用于存储器与存储器之间、存储器与外设之间的大批量、高速数据传送的场合。

DMA传送的基本过程:

① 外设准备就绪时,向DMA控制器(DMAC)发DMA请求,DMAC接到此信号后,向CPU发DMA请求,CPU的HOLD有效 。

② CPU接到HOLD请求后,如果条件允许(一个总线操作结束),则发出HLDA信号作为响应,同时,释放对总线的控制权

③ DMAC取得总线控制权后, DMAC成为主设备, DMAC控制存储器与外设端口之间的数据传送(往地址总线发送地址信号,每传送1个字节,就会自动修改地址寄存器的内容,以指向下一个要传送的字节;每传送一个字节,字节计数器的值减1,当减到0时,DMA过程结束)

④ 传送结束,DMAC向CPU发结束信号,将总线控制权交回CPU。 ⑤ DMAC又回到从设备的状态。

6. 某一个微机系统中,有8块I/O接口芯片,每个接口芯片占8个端口地址,若起始地址为300H,8块接口芯片的地址连续分布,用74LS138作译码器,试画出端口译码电路,并说明每块芯片的端口地址范围。(CPU采用8088)

解:8088CPU,地址连续分布,则8片I/O接口芯片的地址应为:

300----307 H、308----30FH、310----317 H、318----31FH、320----327 H、328----32FH、330----337 H、

338----33FH。

A11A10A9A8 A7A6A5 A4 A3A2A1A0 十六进制地址

1#: 0011 0000 0000B 300H 0011 0000 0111B 307H

2#: 0011 0000 1000B 308H 0011 0000 1111B 30FH

3#: 0011 0001 0000B 310H 0001 0001 0111B 317H

4#: 0011 0001 1000B 318H 0011 0001 1111B 31FH

5#: 0011 0010 0000B 320H 0011 0010 0111B 327H

6#: 0011 0010 1000B 328H 0011 0010 1111B 32FH

7#: 0011 0011 0000B 330H 0011 0011 0111B 337H

8#: 0011 0011 1000B 338H 0011 0011 1111B 33FH

根据CPU外扩I/O接口的原理,从8片I/O接口的地址范围可以看出:A2~A0为每片I/O接口自己的范围,需要接CPU的低位地址线A2~A0;变化的地址为,用74LS138做译码器,则译码器输入为A5A4A3,A7A6=00(经或门后接74LS138译码器的G2A,本题中把未用的高位地址线或门后接74LS138译码器的

G2A),A9A8=11(经与门后接74LS138译码器的G),M/IO接74LS138译码器的G2B。1#~7#I/O接

口的片选接到74LS138译码器的输出Y0~Y7上。 电路原理图如下图所示。

35

各芯片地址范围如下: 1#芯片:300----307 H 2#芯片:308----30FH 3#芯片:310----317 H 4#芯片:318----31FH 5#芯片:320----327 H 6#芯片:328----32FH 7#芯片:330----337 H

8#芯片:338----33FH

注:8086系统要指出奇偶口地址(16个地址中)

1. CPU与外设交换数据时,为什么要通过I/O接口进行?I/O接口电路具有哪些主要功能? 答:

(1)由于输入/输出设备 (外设)比较复杂,性能的离散性比较大,不同的外设,其结构方式、输入/输出的信号类型、输入/输出信息的速率相差很大。而同一个外设与CPU之间所要传送的信息类型不同,方向不同,作用也不一样 。因此,CPU与外部设备之间的信息交换技术比较复杂。所以需要一个中间处理电路——接口电路来分别协调、处理、传送这些不同的信息。

(2)I/O接口电路具有寻址、输入/输出、数据缓冲、联络、数据转换、中断管理、时序控制、可编程、电器特征匹配、错误检测等主要功能。

8.什么叫总线?总线分哪几类?在微型计算机中采用总线结构有什么好处? 答:

(1)总线:总线是一组信号线的集合,是一种在各模块间传送信息的公共通路。 (2)总线的分类方法:

按相对于CPU与其他芯片的位置总线可分为:片内总线和片外总线; 按总线传送信息的类别,可把总线分为:地址总线、数据总线和控制总线; 按照总线传送信息的方向,可把总线分为:单向总线和双向总线;

按总线的层次结构总线可分为:片内总线、片级总线、系统总线和外部总线。

36

(3)在微机系统中,利用总线实现芯片内部、印刷电路板各部件之间、机箱内各插件板之间、主机与外部设备之间或系统与系统之间的连接与通信。总线是构成微型计算机应用系统的重要技术,总线设计好坏会直接影响整个微机系统的性能、可靠性、可扩展性和可升级性。

第7章作业 P281

6. 如果中断类型号n=4,它的中断服务子程序的入口地址为CS:IP=0485:0016H,它在中断向量表中如何存放? 解:

中断类型号n=4,中断向量指针=中断类型号×4=n×4=10H

从内存中断向量指针00010H开始的单元开始存放中断向量, CS占高2个字节, IP占低2个字节。具体如下:

00010H 00011H 00012H 00013H

11. 8086中断响应和处理有哪些主要步骤? 答:

(1)CPU响应中断的条件为:外设提出中断申请,CPU允许中断(本中断位未被屏蔽,本中断位优先级别最高),当前指令执行完。

(2)CPU在INTR引脚上接到一个中断请求信号,如果此时IF=1,本中断位未被屏蔽,CPU就会在当前指令执行完以后开始响应外部的中断请求,这时,CPU在INTA引脚连续发两个负脉冲,第一个负脉冲用来通知外设,CPU准备响应中断,外设在接到第二个负脉冲以后,在数据线上发送中断类型码,接到这个中断类型码后,CPU做如下动作:

① 将中断类型码放入暂存器保存; ② 将标志寄存器内容压入堆栈; ③ 将IF和TF标志清0; ④ 保护断点;

⑤ 根据取到的中断类型码,计算中断向量指针,在中断向量表中找出相应的中断向量,将其装入IP和CS,即自动转向中断服务子程序;

⑥ 中断返回。 第8章 作业 P253

1. 8253芯片有几个计数通道?每个计数通道可工作于哪几种工作方式?这些操作方式的主要特点是什么? 答:

(1)8253芯片有3个计数通道。

(2)每个计数通道均可工作于6种工作方式。方式1—可重复触发的单稳态触发器,方式2—自动重装初值的N分频器,方式 3 —方波发生器,方式4—软件触发的选通信号发生器,方式5—硬件触发的选通信号发生器。

输出波形:0、1 单稳输出,2、4、5 为单次负脉冲,3 为方波。2、3 为连续波形,其余为不连续波形;1、5 可硬件重复触发。

初始电平:写入控制字,只有0为低电平,其余均为高电平;写入初值,在GATE有效的情况下(计数期间),0、1为低电平,2、3、4、5均为高电平。

16H 00H 85H 04H 37

触发方式:

0、4为电平触发,上升沿继续。0是GATE=0停止计数, GATE再次为1,从中止处继续。4是GATE=0停止, GATE再次为1,从原装初值开始计数。

1、5为边沿触发,计数过程中再次出现GATE上升沿,计数器按原装初值开始计数。

2、3为电平触发,上升沿有效,GATE=0停止计数,计数过程中再次出现GATE上升沿,计数器按原装初值开始计数。

计数过程重新写入初值:

0、4----在GATE=1时,立即按新初值开始计数。

1、5----不影响目前的计数,只有在GATE再次出现上升沿时,按新初值开始计数。

2、3----不影响本次输出,本次计数结束后,若GATE=1,(重装新初值)按新初值开始计数。 自动重装能力:2、3 具有自动重装能力(其余没有),可输出连续的波形。 可重复触发能力:1、5具有可重复触发能力(其余没有)。

2. 8253的最高工作频率是多少?8254与8253的主要区别是什么?

解:8253的最高工作频率是2MHz。8254是8253的增强型产品,引脚兼容,功能几乎完全相同,其主要区别在于:

(1)8253的最高工作频率是2MHz,而8254的最高工作频率是10MHz;

(2)8254具有读回功能,可以同时锁存1----3个计数器的计数值及状态值,供CPU读取,而8253每次只能锁存和读取一个通道的计数器,且不能读取状态值。

4. 设8253的通道0----2和控制口的地址分别为300H、302H、304H、306H,设系统的时钟脉冲频率为2MHz。要求:

(1)通道0输出1KHz的方波;

(2)通道1输出频率为500Hz的序列负脉冲; (3)通道3输出单脉冲,宽度为400μs。 试画出硬件电路图,编写各通道的初始化程序。

解:8253的口的地址分别为300H、302H、304H、306H,连续的偶地址,说明CPU为8086.

(1)通道0输出1KHz的方波,应工作在方式3。2MHz/1KHz=2000,则可得通道0的定时初值为2000。 (2)通道1输出频率为500Hz的序列负脉冲,应工作在方式2。2MHz/500Hz=4000, 通道1的定时初值=4000

(3)通道2输出单脉冲,宽度为400μs,应工作在方式0 , 通道2的定时初值=400μs/(1/ 2MHz)-1=799。 硬件连结图如下图所示。

38

8253的初始化程序: ;通道0初始化程序

MOV DX,306H

MOV AL,00110111B ;通道0控制字,读写两字节,方式3,BCD码计数 OUT DX, AL MOV DX,300H

MOV AL, 00H OUT DX, AL ;写人低字节 MOV AL, 20H

OUT DX, AL ;写人高字节 ;通道1初始化程序

MOV DX,306H

MOV AL,01110101B ;通道1控制字,读写两字节,方式2,BCD码计数 OUT DX, AL ;写人方式字 MOV DX,302H

MOV AL, 00H ;低字节 OUT DX,AL ;写人低字节 MOV AL, 40H

OUT DX, AL ;写人高字节 ;通道2初始化程序

MOV DX,306H

MOV AL, 10110001B ;通道2方式字,读写两字节,方式0,BCD码计数 OUT DX,AL MOV DX,304H

MOV AL,99H ;计数初值字节 OUT DX,AL ;写人低字节

MOV AL, 07H

OUT DX, AL ;写人高字节 HLT

5. 设8254的端口地址为40----43H,时钟频率f=5MHz,通道2接1个LED指示灯。要求LED指示灯点亮4秒钟后,再熄灭4秒钟后。并不断重复该过程。试编写8254初始化程序。 解:

LED指示灯点亮4秒钟后,再熄灭4秒钟后。并不断重复该过程。利用通道2输出接LED指示灯,需要产生周期为8秒的方波。

将5MHz时钟加到CLK2端,OUT2输出的方波脉冲周期最大为0.2μs×65536=13107.2μs=13.1072ms,达不到8秒。此时可以使用2个8254通道级连方式来实现。若级连1、2通道,设其初值分别为N1和N2,8s/(1/5MHz) =40000000,则级连后作为一个整体的计数值为N=20000000=N1×N2=5000×8000。

通道1,可选方式2或3,

通道2,选方式3,连续波形,实现不断重复。 N1=5000 N2=8000 ;通道1初始化程序

MOV AL, 01110101B ;通道1方式字,读写两字节,方式2,BCD码计数 OUT 43H,AL

MOV AX, 5000H

OUT 41H,AL ;写人低字节

MOV AL, AH

OUT 41H, AL ;写人高字节 HLT

;通道2初始化程序

MOV AL,10110111B ;通道2控制字,读写两字节,方式3,BCD码计数 OUT 43H, AL

MOV AX, 8000H OUT 42H, AL ;写人低字节

39

MOV AL, AH

OUT 42H, AL ;写人高字节

14. 设8253的通道0----2和控制口的地址分别为300H、302H、304H、306H,定义通道0工作在方式3,CLK0=2MHz,使编写初始化程序,并画出硬件连接图。要求通道0输出1.5KHz的方波,通道1用通道0的输出作计数脉冲,输出频率为300Hz的序列负脉冲。通道2每秒钟向CPU发50次中断请求。 解:

8253的口的地址分别为300H、302H、304H、306H,连续的偶地址,说明CPU为8086.

(1)通道0输出1.5KHz的方波,应工作在方式3,2MHz/1.5K Hz=1334,则可得通道0的定时初值为1334=536H。

(2)通道1用通道0的输出作计数脉冲,输出频率为300Hz的序列负脉冲,应工作在方式2, 1.5K Hz /300Hz =5。通道1的定时初值为5。

(3)通道2每秒钟向CPU发50次中断请求,可工作在方式2(或方式3),以2MHz信号作计数脉冲, 2MHz /50Hz=40000=9C40H。通道2的定时初值9C40H(也可用通道1的输出作计数脉冲) 硬件连结图如下图所示。

8253的初始化程序: ;通道0初始化程序

MOV DX,306H

MOV AL,00110110B ;通道0控制字,读写两字节,方式3,二进制计数 OUT DX, AL MOV DX,300H

MOV AX, 536H OUT DX, AL ;写人低字节 MOV AL, AH

OUT DX, AL ;写人高字节 ;通道1初始化程序

MOV DX,306H

MOV AL,01010100B ;通道1控制字,只读写低宇节,方式2,二进制计数 OUT DX, AL ;写人方式字 MOV DX,302H

40

MOV AL,05H ;低字节

OUT DX,AL ;写人低字节

;通道2初始化程序

MOV DX,306H

MOV AL, 10110100B ;通道2方式字,读写两字节,方式2,二进制码计数 OUT DX,AL MOV DX,304H

MOV AX,9C40H ;计数初值字节 OUT DX,AL ;写人低字节

MOV AL, AH

OUT DX, AL ;写人高字节 HLT

15. 某微机系统中,8253的端口地址为40----43H,时钟频率为5MHz,要求通道0输出方波,使计算机每秒钟产生18.2次中断;通道1每隔15μs向8237提出一次DMA1请求;通道2输出频率为2000Hz的方波。试编写8253的初始化程序,并画出有关的硬件连线图。 解:

8253的口地址为40H、41H、42H、43H。

(1)通道0输出方波,应工作在方式3,5MHz/18.2Hz=274725.3>16位定时器的最大定时初值65536。因此,需要两个计数器的级连。若以通道2的输出作为通道0的时钟输入,则可得通道0的定时初值=2000Hz/18.2Hz-1=110=6EH

(2)通道1每隔15μs向8237提出一次DMA1请求,可工作在方式2(或方式3),通道1的定时初值=15μs /(1/5MHz)=75=4BH。

(3)通道2输出频率为2000Hz的方波,应工作在方式3,通道2的定时初值=5MHz /2000Hz-1=2500-1=9C4H 硬件连结图如下图所示。

8253的初始化程序: ;通道2初始化程序

MOV AL,10110110B ;通道2控制字,读写两字节,方式3,二进制计数 OUT 43H, AL

MOV AX, 9C4H OUT 42H, AL ;写人低字节 MOV AL, AH

OUT 42H, AL ;写人高字节 ;通道0初始化程序

MOV AL,00010110B ;通道0控制字,只读写低宇节,方式3,二进制计数 OUT 43H,AL ;写人方式字 MOV AL, 6EH ;低字节

OUT 40H,AL ;写人低字节

;通道1初始化程序

41

MOV AL, 01010100B ;通道1方式字,只读写低字节,方式2,二进制码计数 OUT 43H,AL

MOV AL, 4BH ;低字节

OUT 41H,AL ;写人低字节 HLT

第9章 作业

P231

9. 8255A的方式选择字和置位复位字都写入什么端口?用什么方式区分它们? 答:

8255A的方式选择字和C口置位复位字都写入控制端口(写入控制字寄存器中)。用特征位D7区分, D7=1,为方式选择控制字, D7=0,为C口的按位置位/复位

12. 8255A的端口地址同第11题(80H, 82H, 84H, 86H),要求PC4输出高电平,PC5输出低电平,PC6输出一个正脉冲,试写出完成这些功能的指令序列。 解:

MOV AL,10000010B

OUT 86H,AL ;设置8255的工作方式 MOV AL,00001001B OUT 86H,AL MOV AL,00001010B OUT 86H,AL MOV AL,00001100B OUT 86H,AL MOV AL,00001101B OUT 86H,AL MOV AL,00001100B OUT 86H,AL HLT

15. 8255A的口地址为80H~83H。PA口接8个开关K7~K0,PB口接8个指示灯LED7~LED0,用来显示开关的状态。当开关合上时相应的指示灯点亮,断开时灯灭。试画出硬件连结电路图(含具体的译码电路),编写实现这种功能的程序段。

要求每隔20s检测一次开关状态,并随时在发光二极管LED7 ~LED0上显示出来。设CPU主频为5MHz,20秒子程序名为DELAY_20S) 解:

硬件电路如下图所示。

42

8255A 的4个端的地址分别为80H、81 H、82H和83 H,对应于8255A的PA口、PB口、PC口和控制字寄存器。

主频率为5MHz

时钟周期=主频率的倒数=1/(5×10-6)=0.2μs

延时20s需要的时钟周期数= 20s/ 0.2μs=100000000=N1×N2 假设N1=10000=2710H

[((10000-1)×17+5)+4+3+3+16] ×N2+2 ×10+2 ×8+20=100000000 N2=588=24CH 程序如下:

MOV AL, 10010000B ;控制字 OUT 83H, AL ;写人控制字

TEST- IT:IN AL, 80H ;从A口读人开关状态 NOT AL ;A口开关状态取反

OUT 81H ,AL ;B口控制LED,指示开关状态 CALL DELAY_20S

JMP TEST_ IT ;循环检测 DELAY_20S: PUSH BX

PUSH CX

MOV BX,24CH;延时20s,改变BX和CX中的值,即可改变延时时间。 DEL1: MOV CX,2710H; DEL2:LOOP DEL2 NOP DEC BX JNZ DEL1 POP CX POP BX RET

延时子程序的时钟周期数:((10000-1)×17+5)+4+3+3+16] ×588+2 ×10+2 ×8+20 =99968288 延时子程序的延时时间:99968288×(1/(5 ×106 ))=19.9936576s

不加NOP指令的计算:

延时子程序的时钟周期数:((10000-1)×17+5)+4+3+16] ×588+2 ×10+2 ×8+20 =99966524 延时子程序的延时时间:99968288×(1/(5 ×106 ))=19.9933048s P282

21. 某微机系统用8253做定时器,其口地址为40H~43H;8255A的PA口接8个开关K7~K0,PB口接8个指示灯LED7~LED0,其口地址为60H~63H;用8259A做中断控制器,其口地址为20H~21H;每隔1秒钟中断一次,读开关状态,并将开关状态显示在LED指示灯上。当开关合上时相应的指示灯点亮,断开时灯灭。要求: (1)画出硬件连结电路图

(2)编写程序。(设8253的CLK上接2MHz的时钟信号) 解:

43

8253口地址为40H~43H,8255A口地址为60H~63H, 8259A口地址为20H~21H;从地址连续可以看出:CPU是8088。

A7A6A5 A4 A3A2A1A0 十六进制地址

8259: 0010 0000 20H 0010 0001 21H

8253: 0100 0000 40H

0100 0001 41H 0100 0010 42H 0100 0011 43H

8255: 0110 0010 60H

0110 0011 61H 0110 0010 62H 0110 0011 63H

采用74LS138译码器,根据:

除用于接口芯片的内部端口的寻址的CPU低位地址线外,CPU的高位地址线中,所有芯片电平相同的地址通过逻辑电路(与、或门)连接到译码器的控制端上,所有芯片电平不同的地址作为译码器的译码输入线,译码器输出连接接口芯片的片选。

则:A7A6A5用于译码, A4A3A2=000(A4A3经与或门后接74LS138译码器的G2A、A2接74LS138译码器的G2B),74LS138译码器的G接电源。8259A片选接译码器的Y1,8253片选接译码器的Y2,8255A片选接译码器的Y3。

系统硬件电路如下:

设8259芯片中断类型码为40~47H。8253的OUT1接到8259的IR2上,用于产生中断。

8253的定时时间为1s,设8253的CLK上接2MHz时钟信号,则计数初值N=1/[1/(2×106)]=2×106,超过了8253一个通道的最大计数值216=65536,采用用2个8253通道(通道0和通道1)级连方式实现。N=N0×N1=2000×1000。 所以:通道0的初值N0 =2000,通道1的初值N1 =1000。通道0工作在方式2,通道1工作在方式3。

程序如下: ;设置8259的中断向量

MOV AX,SEG IRQ2

MOV DS,AX

MOV DX, OFFSET IRQ2

44

MOV AL,42H MOV AH,25H INT 21H ;8259初始化

MOV AL,13H ;ICW1边沿触发,单片8259,有ICW4

OUT 20H,AL

MOV AL,40H ;ICW2 中断类型号基值为40H OUT 21H,AL

MOV AL,01H ;ICW4 8088系统,普通EOI,;完全嵌套式 OUT 21H,AL MOV AL,0FDH

OUT 21H ,AL ;8255初始化

MOV AL,90H OUT 63H,AL ;8253初始化

;通道0初始化程序

MOV AL,00110101B OUT 43H,AL

MOV AL, 00H OUT 40H, AL MOV AL, 20H

OUT 40H, AL ;通道1初始化程序

MOV AL,01110111B OUT 43H,AL

MOV AL, 00H OUT 41H, AL MOV AL, 10H

OUT 41H, AL ;主程序

STI

ZX: NOP JMP ZX ;中断服务子程序 IRQ2: PUSH AX

STI

IN AL, 60H NOT AL OUT 61H ,AL MOV AL,20H

OUT 20H,AL POP AX IRET

;OCW1,设置IMR,中断屏蔽 ;PA口输入,方式0;PB口输出,方式0

;通道0控制字,读写两字节,方式2,十进制计数

;写人低字节 ;写人高字节

;通道1控制字,读写两字节,方式3,十进制计数

;写人低字节 ;写人高字节 ;从8255的PA口读人开关状态 ;8255的PA口开关状态取反

;8255的PB口控制LED,指示开关状态 ;发中断结束普通EOI命令 45

19. 8255A的口地址为80H~83H,8253的口地址为84H~87H。

(1)若A口接8个开关K7~K0,B口接8个指示灯LED7~LED0,当开关合上时相应的指示灯点亮,断开时灯灭。要求每隔0.5s检测一次开关状态,并随时在发光二极管LED7 ~LED0上显示出来。试画出硬件连结电路图,编写实现这种功能的程序。

(2)若把A口接的开关去掉,要求B口接的8个指示灯轮流熄灭(轮流点亮为跑马灯),每只灯熄灭1s,编写实现这种功能的程序。 解: (1)

硬件电路如下图所示。

其中:

8255A 的4个端的地址分别为:80H、81 H、82H和83 H,对应于8255A的A口、B口、C口和控制字寄存器。

8253 的4个端的地址分别为:84H、85 H、86H和87 H,对应于8253的T0、T1、T2和控制字寄存器。

8259 的2个端的地址分别为:88H、89 H。设8259的中断类型号为40~48 H,IRQ2的中断类型号为42H。

8253需要定时0.5s,通过T0,T1通道级联实现。0.5s/(1/ 2MHz)=1000000,设T0工作于方式2,初值为1000;T1工作于方式3,初值为1000(T1如果工作于方式0,则在中断服务子程序中需要重新写入初值,实现软件触发)。

程序如下: ;设置8259的中断向量

MOV AX,SEG IRQ2

MOV DS,AX

MOV DX, OFFSET IRQ2 MOV AL,42H MOV AH,25H INT 21H ;8259初始化

MOV AL,13H ;ICW1边沿触发,单片8259,有ICW4

OUT 88H,AL

46

MOV AL,40H ;ICW2 中断类型号基值为40H OUT 89H,AL

MOV AL,01H ;ICW4 8088系统,普通EOI,;完全嵌套式 OUT 89H,AL MOV AL,0FDH

OUT 89H ,AL ;OCW1,设置IMR,中断屏蔽 ;8255初始化

MOV AL,90H ;PA口输入,方式0;PB口输出,方式0

OUT 83H,AL ;8253初始化

;通道0初始化程序

MOV AL,00110101B ;通道0控制字,读写两字节,方式2,十进制计数 OUT 87H,AL

MOV AL, 00H

OUT 84H, AL ;写人低字节 MOV AL, 10H

OUT 84H, AL ;写人高字节

;通道1初始化程序

MOV AL,01110110B ;通道1控制字,读写两字节,方式3,十进制计数

OUT 87H,AL

MOV AL, 00H

OUT 85H, AL ;写人低字节 MOV AL, 10H

OUT 85H, AL ;写人高字节 ;主程序

STI

ZX: HLT JMP ZX ;中断服务子程序 IRQ2: PUSH AX

STI

IN AL, 80H ;从A口读人开关状态 NOT AL ;A口开关状态取反

OUT 81H ,AL ;B口控制LED,指示开关状态 MOV AL,20H

OUT 88H,AL ;发中断结束普通EOI命令 POP AX IRET (2)

与(1)类似。但1s/(1/ 2MHz)=2000000,设T0工作于方式2,初值为2000;T1工作于方式3,初值为1000(T1如果工作于方式0,则在中断服务子程序中需要重新写入初值,实现软件触发)。

程序如下: ;设置8259的中断向量

XOR AX,SEG IRQ2

MOV DS,AX

MOV DX, OFFSET IRQ2 MOV AL,42H

47

MOV AH,25H INT 21H ;8259初始化

MOV AL,13H ;ICW1边沿触发,单片8259,有ICW4

OUT 88H,AL

MOV AL,40H ;ICW2 中断类型号基值为08H OUT 89H,AL

MOV AL,01H ;ICW4 8088系统,普通EOI,;完全嵌套式 OUT 89H,AL MOV AL,0FDH

OUT 89H ,AL ;OCW1,设置IMR,中断屏蔽 ;8255初始化

MOV AL,90H ;PA口输入,方式0;PB口输出,方式0

OUT 83H,AL ;8253初始化

;通道0初始化程序

MOV AL,00110101B ;通道0控制字,读写两字节,方式2,十进制计数 OUT 87H,AL

MOV AL, 00H

OUT 84H, AL ;写人低字节 MOV AL, 20H

OUT 84H, AL ;写人高字节

;通道1初始化程序

MOV AL,01010110B ;通道1控制字,读写两字节,方式3,十进制计数

OUT 87H,AL

MOV AL, 00H

OUT 85H, AL ;写人低字节 MOV AL, 10H

OUT 85H, AL ;写人高字节 ;主程序

MOV AL, 0FEH ;熄灭一个灯,点亮一个灯为:01H OUT 81H, AL ;写人高字节 STI

ZX: HLT JMP ZX ;中断服务子程序 IRQ2: STI

ROL AL,1 ;熄灭灯左移,轮流熄灭

OUT 81H,AL

PUSH AX ; MOV AL,20H

OUT 88H,AL ;发中断结束普通EOI命令 POP AX IRET

48