微机原理、汇编语言与接口技术(韩晓茹)课后答案

文章目录

  • 习 题 1
  • 习 题 2
  • 习 题 3
  • 习题 4
  • 习 题5
  • 习 题6
  • 习 题 7
  • 习 题 8
  • 习题9
  • 习题10

习 题 1

1.1 冯·诺依曼型计算机有哪五大组成部件构成?
答:由运算器、存储器、控制器、输入设备和输出设备五大基本部件组成计算机硬件系统。

1.2 什么是微处理器、微型计算机和微型计算机系统?它们各由什么组成?
答:中央处理器CPU(Central Processing Unit)也称为微处理器,是微型计算机的核心,由运算器、控制器、寄存器以及相关的电路。
微型计算机由中央处理器、存储器、输入/输出接口和系统总线组成。
微型计算机系统由微型计算机硬件系统和软件系统两部分组成。也就是在微型计算机的外面加上电源和外部设备,然后配上系统软件和应用软件构成的系统。
1.3 什么是系统总线?按照信号的种类不同可以把系统总线分成哪三类 ?它们各有什么特点?
答:连接微处理器与存储器、输入输出接口,用以构成完整的微型计算机的总线称为系统总线。系统总线分为数据总线DB(Data Bus)、地址总线AB(Address Bus)和控制总线CB(Control Bus)。
数据总线DB用于传送数据信息,数据总线是双向三态形式。
地址总线AB是专门用来传送地址的,地址总线总是单向三态的。
控制总线CB用来传送控制信号和时序信号,制总线的传送方向由具体控制信号而定。
1.4 衡量微型计算机系统的性能的指标有哪些?
答:衡量微型计算机系统的性能的指标有字长、主频、运算速度和主存容量和存取速度。字长是指微机系统中CPU一次能处理的二进制位数。CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。运算速度是指每秒钟所能执行的指令条数。主存储器容量指内部存储器能存放数据的最大字节数。存取速度指主存完成一次读/写所需要的时间。
1.5 将十进制数(123.025)10和(96.12)10转换成二进制数和十六进制数。
答:(123.025)10=(11111011.00000110)2=(7B.06)16
1.6 将十六进制数(3E.7)16和(A4.B)16转换成十进制数。
答:(3E.7)16=(62.4375)10
(A4.B)16=(164.6875)10
1.7 求8位无符号数10110101B和01011101B对应的十进制数?
答:10110101B对应的十进制数是181。
01011101B对应的十进制数是93。
1.8 分别求78和-78的8位原码、补码和反码。
[78]原=0100 1110B [78]反=0100 1110B [78]补=0100 1110B
[-78]原=1100 1110B [-78]反=1011 0001B [-78]补=1011 0010B
1.9 设[X]补=11001010B,[Y]补=01001010B,求它们的真值。
答:X的真值是-54,Y的真值是74。
1.10 设X=+37,Y=-15,求[X-Y] 补。
答:[X]补=[+37]补=[+100101B]补=00100101B。
[-Y]补=[[Y]补]求补=[[-0001111B]补]求补=[11110001B]求补=00001111B。
[X-Y]补=[X]补+[-Y]补=00100101B+00001111B=0011 0100B

习 题 2

2.1 8086/8088 CPU分为哪两大功能部件?其各自的主要功能是什么?8086/8088 CPU中有哪些寄存器?各有什么用途?
解:从功能上来看,Intel 8086/8088微处理器可分为两部分,即执行单元EU(Execution Unit) 和总线接口单元BIU(Bus Interface Unit)。
执行单元EU 的功能是负责指令的译码、执行,包括算术、逻辑运算,控制等。总线接口单元BIU 的功能是负责8086/8088对存储器和I/O 设备的所有访问操作。具体包括:负责从内存单元中预取指令,并将其送到指令队列缓冲器暂存;从内存单元或外设端口中读取操作数或者将指令的执行结果传送到指定的内存单元或外设端口;根据有效地址(EA)形成物理地址(PA)。
8086/8088有4个16位数据寄存器:AX、BX,CX,DX,它们既可作为16位寄存器使用,存放数据或地址,也可以分别作为两个 8 位寄存器使用。
8086/8088有2个16位变址寄存器:SI 、DI,通常与DS联用,为访问当前数据段提供段内偏移地址或偏移地址分量。
8086/8088有2个16位地址指针寄存器:SP,BP,它们一般是用来存放堆栈操作数的偏移地址。
总线接口单元(BIU) 中设置有4 个16位的段寄存器,分别是代码段寄存器(CS),数据段寄存器(DS),堆栈段寄存器(SS)和附加段寄存器(ES)。
指令指针寄存器 (Instruction Pointer,IP) 用来存放下一条要执行的指令在当前代码段中的偏移地址。
标志寄存器也称程序状态字(PSW) 寄存器,用来存放运算结果的特征和机器工作状态。

2.2 8086/8088 CPU中标志寄存器有哪两类标志?简述各标志位的含义。
解:①(Zero Flag ,ZF)——零标志。若本次运算结果为0,则ZF=1,否则ZF=0。
②(Sign F1ag SF)——符号标志。此标志用于反映有符号数运算结果的符号是正还是负。对于有符号数,用最高位表示数的符号,当本次运算结果最高位为1 ,表示结果为负数,则SF=1,否则SF=0。
③(Parity Flag,PF)——奇偶标志。此标志是反映运算结果中最低字节中含“1”的个数为0或偶数时,PF=1,为奇数时,PF=0。 注意,PF标志仅反映运算结果的最低8位中“1”的个数是偶数或奇数,即使是进行16位字操作也是如此。
④(Auxiliary Carry Flag ,AF)——辅助进位标志。当进行8 位数( 字节)或16位数( 字)的低8 位运算时,低4 位向高4 位( 即D3 位向D4 位) 有进位或借位时,AF=1,否则AF=0。AF标志主要供 BCD码十进制算术指令判别是否要进行十进制调整,用户一般不必关心。
⑤(Carry Flag,CF)——进位标志。当本次算术运算结果使最高位产生进位( 加法运算)或借位( 减法运算) 时,则此标志位置“1”,即CF=1;若加法运算结果最高位无进位,或减法运算结果最高位无借位,则CF=0。
⑥(Overflow Flag ,OF)——溢出标志。当运算结果产生溢出时,使OF=1,否则OF=0。

2.3 简述伪指令“EQU”与“=”之间有什么区别?
解:“EQU”伪指令不能重复定义,而“=”伪指令可以重复定义。

2.4 画图说明下列语句分配的存储空间及初始化的数值
(1)FF1 DB ‘0100’,2+5,?,‘ABC’
(2)FF2 DW 2 DUP(?),‘A’,‘BC’,1000H,25H
(3)FF3 DB 2 DUP(1,2 DUP(2,3),4)

偏移地址	内容	变量名
0000H	30H	FF1
0001H	31H	
0002H	30H	
0003H	30H	
0004H	07H	
0005H	00H	
0006H	41H	
0007H	42H	
0008H	43H	
0009H	00H	FF2
000AH	00H	
000BH	00H	
000CH	00H	
000DH	41H	
000EH	00H	
000FH	43H	
0010H	42H	
0011H	00H	
0012H	10H	
0013H	25H	
0014H	00H	
0015H	01H	FF3
0016H	02H	
0017H	03H	
0018H	02H	
0019H	03H	
001AH	04H	
001BH	01H	
001CH	02H	
001DH	03H	
001EH	02H	
001FH	03H	
0020H	04H	

2.5 指出下列指令的错误。

	A1	DB	 ?
	A2	DB	 10
	K1	EQU	 10241)MOV  K1,AX			(2)MOV  A1,AX
(3)CMP  A1,A2			(4)K1  EQU  20485)MOV  AX,BH			(6)MOV [BP][DI]7)XCHG CS,AX			(8)POP CS

解:
(1) 立即数不能为目的操作数
(2) 两个操作数的类型不一致
(3) 两个操作数不能同时为存储器操作数
(4) K1不能用EQU重复定义
(5) 两个操作数类型不匹配
(6) 两个操作数不能同时为存储器操作数
(7) CS不能作为XCHG的操作数
(8) CS不能为目的操作数

2.6 假设在数据段进行如下的定义:

  DATA		Segment
		XX	DB	-50,71,5,65,0
		YY 	DB	200 DUP('ABCD')
		ZZ 	DW 	100 DUP(?)
		WW 	DW 	25H,1052H,370H,851H
  DATA 		ENDS

(1)用一条指令将YY的偏移地址送入BX
(2)用一条伪指令给出该数据段占用所有字节长度
(3)用一条伪指令给出变量ZZ分配的字节数目
(4)编写一段程序将WW数组中的数据全部送入YY缓冲区
(5)将数组XX中的第二个数据与第五个数据进行调换

解:(1)LEA BX, YY
(2)在数据段的最后加上:LEN EQU $-XX
(3)ZZLEN  EQU  WW-ZZ
(4)MOV AX,WW
	 MOV YY,AX
	 MOV AX,WW+2
	 MOV YY+2,AX
MOV AX,WW+4
	 MOV YY+4,AX
MOV AX,WW+6
	 MOV YY+6,AX
 (5)MOV AL,XX+1
      MOV XX+4,AL

2.7 什么叫寻址方式?8086/8088指令系统有哪些寻址方式?
解:指令中操作数的寻找方法称为寻址方式。
8086/8088系统所支持的七种基本寻址方式:立即寻址, 寄存器寻址, 直接寻址, 寄存器间接寻址,寄存器相对寻址,基址变址寻址和相对基址变址寻址。

2.8 将首地址为BLOCK的字数组中的第100个数送入AX中,试写出相关指令序列,要求分别使用以下三种寻址方式:
(1)以BX寄存器的间接寻址
(2)以BX寄存器的相对寻址
(3)以BX、SI寄存器的基址变址寻址

解:(1)MOV BX, OFFSET BLOCK +99*2
		MOV AX, [BX]2)MOV BX, 99*2
		 MOV AX, BLOCK[BX]
		或:
		LEA BX, BLOCK
		MOV AX, [BX+99*2]3)LEA BX, BLOCK		
		 MOV SI, 99*2
		 MOV AX,[BX+SI]
		或:
LEA SI, BLOCK		
		 MOV BX, 99*2
		 MOV AX,[BX+SI]

2.9 已知:(BX)=1200H,(BP)=2400H,(SI)=0100H,(DI)=0200H,(SS)=1000H,(DS)=2000H,(ES)=3000H,变量VAR1对应地址为2000H,试分别指出下列指令中存储器的寻址方式及物理地址。
(1)MOV AL,[020H]
(2)MOV AL,[BP+010H]
(3)MOV [BX+SI-20H],AX
(4)MOV BL,ES:[BX+10H]
(5)MOV VAR1[BX+DI],AL
解:(1)直接寻址 PA=(DS)*16+EA=20000h+020H=20020H
(2)寄存器相对寻址PA=(SS)*16+EA=10000H+2400H+010H=12410H
(3)相对基址加变址寻址PA=(DS)*16+EA=20000H+1200H+0100H-20H=212E0H
(4)寄存器相对寻址PA=(ES)*16+EA=30000H+1200H+10H=31210H
(5)相对基址加变址寻址PA=(DS)*16+EA=20000H+2000H+1200H+0200H=23400H

2.10 设Block为字单元1000H:001FH的符号地址(变量),该单元的内容是01A1H,试问以下两条含有Block的指令有什么不同?指令执行后BX的内容是多少?
(1)MOV BX,Block
(2)LEA BX,Block
解:(1)BX的内容为01A1H
(2)BX的内容为001FH

2.11 什么叫堆栈?采用堆栈的意义?
解:

2.12 若在数据段中从字节变量TABLE相应的单元开始存放了015的平方值,试写出包含有XLAT指令的指令序列查找N(015)中的某个数的平方。(设N的值存放在CL中)
解:
LEA BX, TABLE
MOV AL, N
XLAT

2.13 编写程序对存放在DX,AX中的双字节长数据的求补
解:NOT DX ;首先将(DX, AX)取反
NOT AX
ADD AX, 1 ;最低位加1,注意:不能用INC指令
ADC DX, 0 ;把进位(如果有)传递到高位

2.14 写出实现下列计算的指令序列。(假定X、Y、Z、W、R都为有符号数字变量)
(1)Z=(WX)/(R+6) (2)Z=((W-X)/(5Y))*2
(3)Z= (X+Y)/R - W (4)Z= (X/Y+ W )*100+R
解:

1)	MOV	AX, W
		IMUL	X
MOV	BX, R
ADD	BX, 6
IDIV	BX
MOV	Z, AX
MOV	R, DX
(2)	MOV	AX, Y
		MOV	BX, 5
		IMUL	BX
		MOV	BX, AX
		MOV	AX, W
		SUB		AX, X
		MOV	CX, 2
		IMUL	CX
		IDIV	BX
		MOV	Z, AX
	(3)	MOV 	AX, X
			ADD 	AX,Y
			CWD	
			IDIV	R
			SUB 	AX,W
			MOV	Z,AX
	(4)	MOV	AX,X
			CWD	
			IDIV	Y
			ADD 	AX,W
			MOV	BX,100
			IMUL	BX
			MOV	BX,AX
			MOV	CX,DX
			MOV	AX,R
			CWD
			ADD	AX,BX
			ADC	DX,CX
			;结果存放在DX、AX中

2.15 设在AX、BX、CX、DX中均存放的是用压缩的BCD码表示的4位十进制数,试编写程序完成以下的计算:
(1)(AX)+(BX) →AX
(2)(DX)-(CX) →DX

解:(1)ADD AL, BL
	    DAA
        XCHG AL, AH
		ADC AL, BH
		DAA
		XCHG AL, AH
   	(2)MOV 	AL,DL
SUB 	AL, CL
DAS
MOV 	DL, AL
MOV 	AL, DH
SBB		AL, CH
DAS
MOV 	DH, AL
		

2.16 简述指令的“DAA”和“DAS”对BCD码运算后进行调整的规则。
解:DAA的调整规则:

if (AL低4>9 或 AF=1)then
	AL=AL+06H ;
	AF=1 ;
endif 
if (AL高4>9 或 CF=1)then
	AL=AL+60H ;
	CF=1 ;
endif

DAS的调整规则:
if (AL低4>9 或 AF=1)then
 	AL=AL-06H ;
	AF=1 ;
endif 
if (AL高4>9 或 CF=1)then
	AL=AL-60H ;
	CF=1 ;
 Endif

2.17 用程序段实现对存入在BX,AX的双字进行左移5位。

解:	SHL 	AX,1
		RCL 	BX,1
SHL 	AX,1
		RCL 	BX,1
SHL 	AX,1
		RCL 	BX,1
SHL 	AX,1
		RCL 	BX,1
SHL 	AX,1
		RCL 	BX,1

2.18 试分析下列程序完成什么功能?

 MOV	CL,4
 SHL	DX,CL
 MOV	BL,AH
 SHL 	AX,CL
 SHR	BL,CL
 OR		DL,BL

解:把32位二进制代码(DX, AX)联合左移4位。

2.19 已知程序段如下:

MOV	AX,1234H
		MOV	CL,4
		ROL	AX,CL
		DEC	AX
		MOV	CX,4
		MUL	CX

试问:(1)每条指令执行后,AX寄存器的内容是什么?
(2)每条指令执行后,CF,SF及ZF的值分别是什么?
(3)程序运行结束时,AX及DX寄存器的值为多少?

解:	MOV	AX,1234H		;AX内容为1234H,CF、SF、ZF的值保留初值
	MOV	CL,4			;AX内容为1234H,CF、SF、ZF同上
	ROL	AX,CL			;AX内容为2341H,CF=1、SF=0、ZF=0
	DEC	AX				;AX内容为2340H,CF=1、SF=0、ZF=0
	MOV	CX,4			;AX内容为2340H,CF=1、SF=0、ZF=0
	MUL	CX				;AX内容为8D00H,CF=0、SF=0、ZF=0

2.20 程序中的“转移”是个什么概念?CPU执行转移指令是如何实现转移的?
解:程序中的“转移”是指改变程序的顺序执行过程,某条指令执行完后,不是紧接着执行该指令后面的指令,而是执行其它的指令。CPU是通过改变CS和IP指令指针的值来实现转移的。

2.21 设(DS)=2000H,(BX)=0030H,(SI)=0202H,(20232H)=00H,(200233H)=06H,分别执行下述两条指令后,实际转移的目标地址物理地址多少?
(1)JMP BX
(2)JMP Word PTR[BX+SI]
解:(1)目的地址为0030H
(2)转移的目标地址为:由[BX+SI]寻址得存储单元的地址为20232H,目的地址为0600H。

2.22 编写指令序列,实现下述要求
(1) 使AX寄存器的低 4 位清零,其余位不变。
(2) 使BX寄存器的低4 位置1,其余位不变。
(3) 测试 BX中的位0 和位4,当这两位同时为零时,将AL置1,否则AL置0。
解:

1)AND 	AX, 0FFF0H
	(2)OR 	AX, 000FH
	(3)TEST	AX, 0011H
		 JZ		NEXT		;ZF=1,表明这两位同时为0,转走将AL置1
		 MOV	AL,0		;ZF=0,表明这两位不同时为0,将AL清0
		 JMP 	EXIT
NEXT:	 MOV 	AL,1
EXIT:

2.23 下面程序段在什么情况下执行结果是(AH)=0?

 BEGIN:	IN   AL, 60H 
		TEST AL, 80H 
		JZ   BRCH1 
		XOR  AX, AX 
		JMP  STOP 
BRCH1:	MOV  AH, 0FFH 
STOP:	 …… 

解:从60H端口读到是数据最高位为1时,使(AH)为0;数据最高位为0时,使(AH)为0FFH。

2.24 “CALL”指令与“JMP”指令相同之处是什么?不同之处是什么?
解:相同之处:“CALL”指令和“JMP”指令都能实现程序的控制转移,改变程序顺序指令的过程。
不同之处:“CALL”指令执行时,使程序转移到子程序中执行,执行完子程序后,还是会回到调用程序,继续执行紧跟在“CALL”指令之后的那条指令。但“JMP”指令执行完后一般不会去执行紧跟在“JMP”指令之后的那条指令。

2.25 叙述8086/8088CPU执行指令“CALL DWORD PTR[100H]”的步骤。

2.26 设下列程序执行前,栈顶指针SS:SP为1000H:0220H,试求:
POP CX
POP BX
POP AX
RET 4
(1) 画出该程序执行后的堆栈存储情况示意图。
解:使堆栈指针加10,上面的5个字的内容出栈,图略。
(2) 给出当前栈顶SS和SP的值。
(SS)=1000H, (SP)=022AH

2.27 一双字长的带符号数放在X和X+2中(X为变量),试编写一程序对这个数求其绝对值。
解:
TEST [X+2], 8000H ;测试最高位,判断正负,负数好取绝对值
JZ DONE
MOV AX, X
MOV DX, [X+2]
NOT AX
NOT DX
ADD AX, 1
ADC DX, 0
MOV [X], AX
MOV [X+2], DX
DONE:
2.28 试编写一个汇编语言程序,要求将键盘输入的小写字母用大写字母显示出来。
解:CODE SEGMENT
ASSUME CS: CODE
START:
MOV AH, 01H
INT 21H
CMP AL, 0DH ;输入回车推出程序
JZ EXIT
OR AL, 20H
MOV AH, 02H
INT 21H
JMP START
EXIT: MOV AX, 4C00H
INT 21H
CODE ENDS
END START

2.29 试编写程序实现例 2 36的功能,但是不要使用字符串操作指令。
解: LEA SI, STRING1-1
LEA DI, STRING2-1
MOV CX, 20
AGA: INC SI
INC DI
MOV AL, [SI]
CMP AL, ES:[DI]
LOOPZ AGA

2.30 试编写程序实现例 2 37的功能,但是不要使用字符串操作指令。
解: LEA DI, STRING2
MOV AL, ‘A’
MOV CX, 20
AGA: CMP AL, ES:[DI]
JZ EXIT
INC DI
LOOP AGA
EXIT:
2.31 在使用“REPNZ CMPSB”指令时,应事先做好哪些工作?
解:将源串的偏移地址送入SI,目的串的偏移地址送入DI,方向标志DF清0,比较的字节数送入CX。

2.32 已知在以ARRAY为首地址的内存区域存放了100个字节数,试编写相关的程序段用以完成将该数据传送到BUFF为首地址的存储区域中。分别用以下不同方法实现。
(1)用一般数据传送指令“MOV”实现。
(2)用字符传送指令“MOVSB”实现。
(3)用重复操作前缀传送指令“REP MOVSB”实现。
(4)用LODSB/STOSB实现。
解:(1)
LEA SI, ARRAY
LEA DI, BUFF
MOV CX, 100
AGA: MOV AL, [SI]
MOV [DI], AL
INC SI
INC DI
LOOP AGA
(2)
LEA SI, ARRAY
LEA DI, BUFF
MOV AX, DS
MOV ES, AX
MOV CX, 100
CLD
AGA: MOVSB
LOOP AGA

(3) LEA SI, ARRAY
LEA DI, BUFF
MOV AX, DS
MOV ES, AX
MOV CX, 100
CLD
REP MOVSB
(4)
LEA SI, ARRAY
LEA DI, BUFF
MOV AX, DS
MOV ES, AX
MOV CX, 100
CLD
AGA: LODSB
STOSB
LOOP AGA

2.33 判断STRING1和STRING2为首地址的内存区域存放了二个长度为20的字符串是否相等。若相等将SIGN单元置1,反之,将SIGN单元置0。分别用以下不同方法实现。
(1)用比较条件转移指令实现。
(2)用重复操作前缀搜索指令实现。
解:(1)
LEA SI, STRING1-1
LEA DI, STRING2-1
MOV CX, 20
AGA: INC SI
INC DI
MOV AL, [SI]
CMP AL [DI]
LOOPZ AGA
JZ EQ
MOV SIGN, 0
JMP EXIT
EQ: MOV SIGN, 1
EXIT:

(2)
LEA SI, STRING1
LEA DI, STRING2
MOV AX, DS
MOV ES, AX
MOV CX, 20
CLD
REPE CMPSB
JZ EQ
MOV SIGN, 0
JMP EXIT
EQ: MOV SIGN, 1
EXIT:

2.34 试用其他指令序列来代替完成以下指令的功能:
(1)LOOP NEXT
(2)LDS BX,[100H]
(3)XLAT
(4)LOOPZ NEXT
(5)LAHF
(6)XCHG AX,[BX]
(7)NEG Word PTR[1000H]
(8)ADC AL,[SI+BX]
(9)TEST AL,00001111B
(10)MOVSW(DF=0)
(11)REPZ CMPSB(DF=0)
解:(1)DEC CX
JNZ NEXT
(2)MOV BX, [100H]
MOV DS, [102H]
(3) MOV AH,0
ADD BX, AX
MOV AL, [BX]
(4) JNZ EIXT
LOOP NEXT
EXIT:
(5) 题目好像不对
(6) MOV CX, [BX]
MOV [BX], AX
MOV AX, CX
(7) MOV AX, 0
SUB AX, [1000H]
MOV [1000H], AX
(8) JNC NEXT
ADD AL, [SI+BX]
INC AL
JMP DONE
NEXT: ADD AL,[SI+BX]
DONE:
(9) MOV BL,AL
AND BL, 00001111B
(10) MOV AX,[SI]
MOV ES:[DI],AX
INC SI
INC SI
INC DI
INC DI
(11) NEXT:MOV AL,[SI]
CMP AL,ES:[DI]
JNE EXIT
INC SI
INC DI
LOOP NEXT
EXIT:

习 题 3

2.35 在以Block为首地址的字节单元中,存放了一个班级的学生考试成绩。试编写一程序,利用学生的序号来查表得到该学生的成绩,设学生的序号在NUMBER单元,查表结果存入RESULT单元。
解:
DSEG SEGMENT
BLOCK DB 67,78,86,57,88,75,78,96,77,88,87,95,67,86,83,55
NUMBER DB 9 ; 要显示的16进制数字
RESULT DB ? ; 存放要显示数字对应的七段码
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS:DSEG
START :MOV AX, DSEG
MOV DS, AX
MOV BX, OFFSET BLOCK
MOV AL, NUMBER ; 取16进制数字
AND AL, 0FH
XLAT ; 查表取得对应的七段码
MOV RESULT, AL ; 保存
MOV AX, 4C00H
INT 21H
CSEG ENDS
END START

2.36 试编程序,统计由52600H开始的100个单元中所存放的字符“A“的个数,并将结果存放在DX中。
解:
CSEG SEGMENT
ASSUME CS: CSEG
START :MOV AX, 5260H
MOV DS, AX
MOV BX, 0
MOV AL, ‘A’
MOV CX,100
MOV DX,0
AGA:CMP AL,[BX]
JNZ LP
INC DX
LP: INC BX
LOOP AGA
MOV AX, 4C00H
INT 21H
CSEG ENDS
END START

2.37 在当前数据段(DS),偏移地址为GRADE开始的连续80个单元中,存放着某班80个同学某门考试成绩。按要求编写程序:
①试编写程序统计≥90分;80分~89分;70分~79分;60分~69分,<60分的人数各为多少,并将结果放在同一数据段、偏移地址为LEVEL开始的连续单元中。
②试编写程序,求该班这门课的平均成绩为多少,并放在该数据段的AVER单元中。
解:
DATA SEGMENT
GRADE DB 80 DUP(?) ;运行前置入具体数据
LEVEL DB 0 ;大于90
LEVEL1 DB 0 ;80分~89分
LEVEL2 DB 0 ;70分~79分
LEVEL3 DB 0 ;60分~69分
LEVEL4 DB 0 ;<60分
AVER DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX

			LEA		SI, GRADE
			MOV	DX,0
			MOV	CX, 80
	AGAIN:	MOV	AL, [SI]
			CMP	AL, 59			;分段测试
			JA		L1 
	L0:		INC		LEVEL4
			JMP		NEXT
	L1:		CMP	AL, 69
			JA		L2
			INC		LEVEL3
			JMP		NEXT
	L2:		CMP	AL, 79
			JA		L3
			INC		LEVEL2
			JMP		NEXT
	L3:		CMP	AL, 89
			JA		L4
			INC		LEVEL1
			JMP		NEXT
	L4:		INC		LEVEL
	NEXT:	ADD	SI, 1
			ADD 	DL,AL	;求累加和
			ADC 	DH,0
			LOOP	AGAIN
			MOV 	AX,DX
			MOV 	BL,80
			DIV		BL
			MOV 	AVER,AL

EXIT: MOV AX, 4C00H
INT 21H
CODE ENDS
END START

2.38 在以字节变量ARRAY为首地址的内存区域存储了一组带符号的数据,试编写程序将数据组的所有正数相加,并将和送入SUM字单元。
解:
DATA SEGMENT
ARRAY DB 12,-67,44,67,-35,66,55,-98,87,-87,33,83
COUNT EQU $-ARRAY
SUM DW ? ;SUM存放累加和
DATA ENDS
CODE SEGMENT
ASSUME DS: DATA, CS: CODE
START: MOV AX, DATA
MOV DS, AX
MOV BX, 0 ;BX是数组元素在数组内的位移,初值0
MOV CX, COUNT ;装载循环计数器的初始值
MOV DX, 0 ;累加器AX清零
ONE: MOV AL,ARRAY[BX]
CMP AL,0
JLE NEXT
CBW
ADD DX,AX ;
NEXT: INC BX ;修改BX的值,为下一次操作做准备
LOOP ONE ;计数循环
MOV SUM, DX ;保存结果(累加和)
MOV AX, 4C00H
INT 21H
CODE ENDS
END START

2.39 若某班有50名学生,考汇编语言课程,且所有考生的成绩都已存放自XX单元开始的内存区中,试编写一程序找出最高分和最低分。

解:DATA SEGMENT
XX DB 50 DUP (?) ;运行前置入具体数据

	COUNT		EQU $-XX
	MIN			DB	?
	MAX		DB	?

DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
MOV MIN, 100 ;假设最小的数
MOV MAX, 0 ;假设最大的数
LEA SI, XX
MOV CX, COUNT
AGAIN: MOV AL, [SI]
CMP AL, MIN
JAE SKIP1
MOV MIN, AL ;比预设最小值还小,保留
SKIP1: CMP AL, MAX
JBE SKIP2
MOV MAX, AL ;比预设最大值还大,保留
SKIP2: INC SI
LOOP AGAIN
EXIT: MOV AX, 4C00H
INT 21H
CODE ENDS
END START

2.40 在首地址为ARRAY为首地址的内存区域里,存放了一组带符号的数据,试编写程序分别统计零、正数和负数的个数,统计结果分别存放在ZZ、XX、YY中。

解:
DATA SEGMENT
ARRAY DB 56,-42,66,87,0,88,-88,68,0,-67,58,97,-66,86,77
;运行前置入具体数据
COUNT EQU $-ARRAY
XX DB 0 ;正数的个数
YY DB 0 ;0的个数
ZZ DB 0 ;负数的个数
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, ARRAY
MOV CX, COUNT
AGAIN: MOV AL, [SI]
CMP AL, 0 ;分段测试
JGE L1
L0: INC ZZ
JMP NEXT
L1:
JG L2
INC YY
JMP NEXT
L2: INC XX
NEXT: ADD SI, 1
LOOP AGAIN
EXIT: MOV AX, 4C00H
INT 21H
CODE ENDS
END START

2.41 设有一个管理软件可接受十个键盘命令(分别是A、B、C,…,J),执行这十个命令的程序入口地址分别是PROCA、PROCB、PROCC,…,PROCJ。编写一程序从键盘上接收命令,并转去执行相应的程序。要求分别用以下两种方式来实现:
(1)用比较转移指令
(2)用地址表法

解:(1)
DATA SEGMENT
PROMPT DB 0DH, 0AH, “INPUT A CHAR (‘A’~‘J’): $”
MSGA DB 0DH, 0AH, “FUNCTION A EXECUTED . $”
MSGB DB 0DH, 0AH, “FUNCTION B EXECUTED . $”
MSGC DB 0DH, 0AH, “FUNCTION C EXECUTED . $”
MSGD DB 0DH, 0AH, “FUNCTION D EXECUTED . $”
MSGE DB 0DH, 0AH, “FUNCTION E EXECUTED . $”
MSGF DB 0DH, 0AH, “FUNCTION F EXECUTED . $”
MSGG DB 0DH, 0AH, “FUNCTION G EXECUTED . $”
MSGH DB 0DH, 0AH, “FUNCTION H EXECUTED . $”
MSGI DB 0DH, 0AH, “FUNCTION I EXECUTED . $”
MSGJ DB 0DH, 0AH, “FUNCTION J EXECUTED . $”
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
INPUT: LEA DX, PROMPT
MOV AH, 9
INT 21H ;输出提示信息
MOV AH, 1
INT 21H ;输入一个数字
; ***************** ① 开始测试条件*******************
CMP AL, ‘A’
JB INPUT ;不在"A~J"内,重新输入
JE FA ;字符"A",转FA
CMP AL, ‘B’
JE FB ;字符"B",转FB
CMP AL, ‘C’
JE FC ;字符"C",转FC
CMP AL, ‘D’
JE FD ;字符"D",转FD
CMP AL, ‘E’
JE FE ;字符"E",转FE
CMP AL, ‘F’
JE FF ;字符"F",转FF
CMP AL, ‘G’
JE FG ;字符"G",转FG
CMP AL, ‘H’
JE FH ;字符"H",转FH
CMP AL, ‘I’
JE FI ;字符"I",转FI
CMP AL, ‘J’
JE FJ ;字符"J",转FJ

	JMP	INPUT			;大于"J",重新输入

; ② 各分支语句序列*
FA: CALL PROCA ;调用PROCA程序块
JMP EXIT ;每个分支结束,都要用JMP指令跳转到所有分支结束的地方
FB: CALL PROCB ;调用PROCB程序块
JMP EXIT
FC: CALL PROCC ;调用PROCC程序块
JMP EXIT
FD: CALL PROCD ;调用PROCD程序块
JMP EXIT
FE: CALL PROCE ;调用PROCE程序块
JMP EXIT
FF: CALL PROCF ;调用PROCF程序块
JMP EXIT
FG: CALL PROCG ;调用PROCG程序块
JMP EXIT
FH: CALL PROCH ;调用PROCH程序块
JMP EXIT
FI: CALL PROCI ;调用PROCI程序块
JMP EXIT
FJ: CALL PROCJ ;调用PROCJ程序块
JMP EXIT ;最后一个分支结束,JMP可以省略
EXIT:
MOV AX, 4C00H
INT 21H

PROCA PROC
LEA DX, MSGA
MOV AH, 9
INT 21H
RET
PROCA ENDP

PROCB PROC
LEA DX, MSGB
MOV AH, 9
INT 21H
RET
PROCB ENDP

PROCC PROC
LEA DX, MSGC
MOV AH, 9
INT 21H
RET
PROCC ENDP

PROCD PROC
LEA DX, MSGD
MOV AH, 9
INT 21H
RET
PROCD ENDP

PROCE PROC
LEA DX, MSGE
MOV AH, 9
INT 21H
RET
PROCE ENDP

PROCF PROC
LEA DX, MSGF
MOV AH, 9
INT 21H
RET
PROCF ENDP

PROCG PROC
LEA DX, MSGG
MOV AH, 9
INT 21H
RET
PROCG ENDP

PROCH PROC
LEA DX, MSGH
MOV AH, 9
INT 21H
RET
PROCH ENDP

PROCI PROC
LEA DX, MSGI
MOV AH, 9
INT 21H
RET
PROCI ENDP

PROCJ PROC
LEA DX, MSGJ
MOV AH, 9
INT 21H
RET
PROCJ ENDP
CODE ENDS
END START

(2)
DATA SEGMENT
PROMPT DB 0DH, 0AH, “INPUT A CHAR (‘A’~‘J’): $”
MSGA DB 0DH, 0AH, “FUNCTION A EXECUTED . $”
MSGB DB 0DH, 0AH, “FUNCTION B EXECUTED . $”
MSGC DB 0DH, 0AH, “FUNCTION C EXECUTED . $”
MSGD DB 0DH, 0AH, “FUNCTION D EXECUTED . $”
MSGE DB 0DH, 0AH, “FUNCTION E EXECUTED . $”
MSGF DB 0DH, 0AH, “FUNCTION F EXECUTED . $”
MSGG DB 0DH, 0AH, “FUNCTION G EXECUTED . $”
MSGH DB 0DH, 0AH, “FUNCTION H EXECUTED . $”
MSGI DB 0DH, 0AH, “FUNCTION I EXECUTED . $”
MSGJ DB 0DH, 0AH, “FUNCTION J EXECUTED . $”
ADDTBL DW FA,FB,FC,FD,FE,FF,FG,FH,FI,FJ;
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
INPUT: LEA DX, PROMPT
MOV AH, 9
INT 21H ;输出提示信息
MOV AH, 1
INT 21H ;输入一个数字
CMP AL, ‘A’
JB INPUT ;不在"A~J"内,重新输入
CMP AL, ‘J’
JA INPUT ;不在"A~J"内,重新输入

SUB	AL,'A'	 	;将数字字符“1”到“3”转换为0, 1, 2
SHL	AL, 1		;转换为0,2,4
MOV	BL, AL
MOV	BH, 0		;转入BX
JMP	ADDTBL[BX]	;间接寻址,转移到对应程序块

; ② 各分支语句序列*
FA: LEA DX, MSGA ;FA程序块
JMP OUTPUT ;每个分支结束,都要用JMP指令跳转到所有分支结束的地方
FB: LEA DX, MSGB ;FB程序块
JMP OUTPUT
FC: LEA DX, MSGC ;FC程序块
JMP OUTPUT
FD: LEA DX, MSGD ;FD程序块
JMP OUTPUT
FE: LEA DX, MSGE ;FE程序块
JMP OUTPUT
FF: LEA DX, MSGF ;FF程序块
JMP OUTPUT
FG: LEA DX, MSGG ;FG程序块
JMP OUTPUT
FH: LEA DX, MSGH ;FH程序块
JMP OUTPUT
FI: LEA DX, MSGI ;FI程序块
JMP OUTPUT
FJ: LEA DX, MSGJ ;FJ程序块
JMP OUTPUT ;最后一个分支结束,JMP可以省略
OUTPUT: MOV AH, 9
INT 21H

	MOV	AX, 4C00H
	INT	21H

CODE ENDS
END START
2.42 设在寄存器AX,BX,CX中存放的是16位无符号数,试编写程序段,找出三个数值居中的一个,并将其存入BUFF字单元中。
解:
DATA SEGMENT
BUFF DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX,5
MOV BX,3
MOV CX,6
CMP AX,BX
JA L1
JZ L2
L0: CMP AX,CX ;AX JAE L4 ;AXCX
L2: CMP BX,CX
JBE L5
JMP L6
L1:
CMP BX,CX
JAE L5 ;BX
CMP AX,CX
JA L6
L4: MOV BUFF,AX
JMP DONE
L5: MOV BUFF,BX
JMP DONE
L6: MOV BUFF,CX
DONE: MOV AX, 4C00H
INT 21H
CODE ENDS
END START

2.43 编写确定一个十进制数x(2≤x≤200)是否是素数(质数)的程序。
解:
DATA SEGMENT
x DB 12 ;x(2≤x≤200)
FLAG DB 0 ;X是素数,FLAG=1,否则FLAG=0
DATA ENDS
CODE SEGMENT
ASSUME DS: DATA, CS: CODE
START: MOV AX, DATA
MOV DS, AX
MOV BL,2
MOV BH,X
SHR BH,1 ;计算测试范围
MOV FLAG,1 ;先假设x为素数
NEXT: MOV AL,X
MOV AH,0
DIV BL
CMP AH,0 ;余数为0,说明不是素数,退出
JZ NO
INC BL
CMP BL,BH
JZ EXIT ;到测试边界,退出
JMP NEXT

NO: MOV FLAG,0
EXIT: MOV AX, 4C00H
INT 21H
CODE ENDS
END START

2.44 在以BLOCK为首地址的数据区域按着从小到大的顺序存放了一个年级(180人)学生的汇编语言成绩表。试编写程序将分数82插入到该数组合适的位置。
解:
DATA SEGMENT
BLOCK DB 1,3,5,7,9,12,15,25,35,36,37,40,42,46,57 ;学生的成绩表,可根据实际填写
ST DB 39 ;另外一个学生的成绩
DATA ENDS

CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, BLOCK+14 ;取成绩表中最后一个学生成绩的偏移地址给SI
MOV CX, 15
MOV AL, ST
CMPBLK: CMP AL, [SI] ;要插入的学生成绩比成绩表中的成绩小,则转CHANGE
JB CHANGE
MOV [SI+1],AL ;插入该学生成绩
JMP DONE
CHANGE: MOV BL,[SI] ;把表中成绩后移
MOV [SI+1],BL
DEC SI
LOOP CMPBLK
DONE: MOV AX, 4C00H
INT 21H

CODE ENDS
END START

2.45 已知数组A中包含15个互不相等的整数,数据B中包含20个互不相等的整数,试编写一程序,将即在A数组中出现又在B数组中出现的整数存放于数组C中。
解:
DATA SEGMENT
A DB 1,3,5,7,9,12,15,25,35,36,37,40,42,46,57
B DB 3,5,9,12,25,36,37,42,57,58,60,4,8,11,17,29,33,44,55,66
C DB 20 DUP (0)
DATA ENDS

CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
MOV ES, AX
LEA SI, A
LEA BX, C
MOV CX, 15
CLD
CMPAB:
LODSB ;从数组A中取出一个数
LEA DI, B
PUSH CX
MOV CX, 20
REPNZ SCASB ;与数组B中的元素比较
JNZ LOP ;数据不同,比较下一个数
MOV [BX],AL ;数据相同,则保存在数组C中
INC BX
LOP: POP CX
LOOP CMPAB

EXIT:	MOV	AX, 4C00H
	INT	21H				
			
CODE	ENDS
	END	START

2.46 在某子程序的开始处要保护标志寄存器Flags、AX、BX、CX、DX寄存器的内容,在子程序结束时要恢复它们的内容。例如:
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
……
……
;恢复现场
试写出恢复现场时的指令序列。
解:
POP DX
POP CX
POP BX
POP AX
POPF

2.47 什么叫主程序与子程序之间传递参数?实现参数传递一般有哪几种方法?每种方法的适用场合?
解:

2.48 简述嵌套调用和递归调用的不同。
解:

2.49 在以BLOCK为首地址处存放100个无符号字节数。试编写一程序,求出该数组中的最大数与最小数的差,并将其送入RESULT单元,要求调用子程序来完成对最大数和最小数的求解。
解:
DATA SEGMENT
BLOCK DB 56,42,66,87,88,88,68,67,58,97,66,86,77
COUNT EQU $-XX
RESULT DB 0
DATA ENDS

CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
MOV MIN, 100 ;假设最小的数
MOV MAX, 0 ;假设最大的数
LEA SI, BLOCK
MOV CX, COUNT
CALL MAXMIN
SUB AH,AL
MOV RESULT,AH
EXIT: MOV AX, 4C00H
INT 21H

		MAXMIN	PROC	
			MOV	AH,0		;存放大数
			MOV	AL,255		;存放小数
		AGAIN:	MOV	DL,[SI]
			CMP	AL,DL
			JBE	SKIP1
			MOV	AL,DL			;比预设最小值还小,保留
		SKIP1:	CMP	AH,DL
			JAE	SKIP2
			MOV	AH,DL		;比预设最大值还大,保留
		SKIP2:	INC SI
			LOOP AGAIN
			RET
		MAXMIN	ENDP
					
	CODE	ENDS
			END	START

2.50 某年级参加英语4级考试的有250名学生,试编写一程序完成60-69,70-79,80-89,90-100四个分数段的统计工作,要求用子程序完成每个分数段的统计工作。
解:
DATA SEGMENT
BLOCK DB 60,64,68,72,79,76,74,80,89,84,85,88,98,95,100 ;学生的成绩表,可根据实际填写
COUNT60 DB 0 ;存放成绩在60-69的学生数
COUNT70 DB 0 ;存放成绩在70-79的学生数
COUNT80 DB 0 ;存放成绩在80-89的学生数
COUNT90 DB 0 ;存放成绩在90-100的学生数

DATA ENDS

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

	MOV 	CX, 4
	LEA	DI, COUNT60
	MOV	AL, 60
COUNTA:	LEA	SI, BLOCK
	CALL	COUNT
	MOV	[DI],DL
	ADD 	AL,10
	INC	DI
	LOOP 	COUNTA
	
DONE:	MOV	AX, 4C00H
	INT	21H	
	
COUNT	PROC
	PUSH	CX
	MOV	CX, 15
	MOV	DL,0	;统计学生的人数
	MOV	AH,AL
	ADD	AH,9	;计算统计的区间
	CMP	AH,99	
	JNZ	AGA
	INC 	AH	;统计区间包含100时
AGA:	CMP 	[SI],AL
	JB 	NEXT
	CMP	[SI],AH
	JA	NEXT
	INC	DL
NEXT:	INC 	SI
	LOOP	AGA
	POP	CX
	RET
COUNT	ENDP
				
CODE	ENDS
	END	START

2.51 编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。

解:假设AL中数为ASCII,用最高位来保存校验信息,代码如下。
EVENODD PROC
AND AL, 07FH
JP OK
OR AL, 80H
OK: RET
ENENODD ENDP

2.52 试编程序利用上题的子程序,对52600H开始的256个单元的数据加上偶校验。
解:
CODE SEGMENT
ASSUME CS: CODE
START:
MOV AX, 5260H
MOV DS, AX
MOV SI,0
MOV CX, 256
NEXT: MOV AL,[SI]
CALL EVENODD
MOV [SI],AL
INC SI
LOOPNEXT
DONE: MOV AX, 4C00H
INT 21H
CODE ENDS
END START

习题 4

4.1 解释8086/8088最大、最小工作模式的定义和特点,如何设定8086/8088的工作模式?
答:所谓最小模式,就是系统中只有一个8086/8088微处理器。在这种情况下,所有的总线控制信号都是直接由8086/8088的相关引脚产生,系统中的总线控制逻辑电路被减到最少。最小模式适用于规模较小的微机应用系统。
最大模式是相对于最小模式而言的。在最大模式下,系统中至少包含两个微处理器,其中8086/8088作为主处理器,其它的微处理器称为协处理器,它们协助主处理器工作。在最大模式中,总线控制信号由8086/8088外部的总线控制逻辑生成,总线控制逻辑电路较复杂。最大模式用在中、大规模的微机应用系统中。
MN/ (Minimum/Maximum),为最大最小模式选择引脚,为输入方向。当该引脚输入高电平时,8086工作在最小模式,当输入低电平时工作在最大模式。

4.2 何为引脚的分时复用?8086、8088各有哪些分时复用引脚?8086和8088在引脚上的区别主要有哪些?
答:引脚复用是指,同一个引脚在不同时刻传送不同类型的信息。
8086具有16根地址/数据复用引脚,它们是AD15~AD0(Address/Data),用于分时传送地址信息和数据信息。
A19/S6~A16/S3(Address/Status)是4根地址/状态复用信号输出引脚,分时输出地址及状态信息,三态输出。
/S7(Bus High Enable/Status):高8位数据允许/状态复用信号引脚,分时输出 和状态信号S7。
8088只具有8根地址/数据复用引脚AD7AD0,A19/S6A16/S3(Address/Status)是4根地址/状态复用信号输出引脚。
8086和8088在引脚上的区别主要有:
(1)8088只具有8根地址/数据复用引脚AD7AD0,另外还有8跟地址专用引脚A15A8。不管是8088还是8086,传送地址信息的引脚都是20根,都能访问1MB内存空间。8088具有8根数据引脚,而8086具有16根数据引脚,因此8088每次对外只能访问8位数据,而8086既可以访问8位数据又可以访问16位数据。
(2)8088的存储器或I/O端口选择信号引脚为 ,而8086的对应引脚为 ,它们的作用刚好相反。
(3)8088无 /S7引脚,被 代替。
4.3 分别介绍8086最小模式下ALE、HOLD、HLDA、NIMI、INTR和 引脚的作用及有效电平。
答:ALE(Address Latch Enable):地址锁存允许引脚,输出,高电平有效。用于将地址信息锁存到外部的地址锁存器中。
HOLD(Hold Request):总线保持请求信号引脚,三态输入,高电平有效。用作传送系统中的其它总线部件向8086发来的总线使用请求信号。
HLDA(Hold Acknowledge):总线保持响应信号引脚,三态输出,高电平有效。有效时表示8086认可其他总线部件提出的总线使用请求,准备让出总线控制权。
NMI(Non-Maskable Interrupt):非屏蔽中断请求输入引脚,上升沿有效。当该引脚由低变高时,表示外部产生了非屏蔽中断请求。
INTR(Interrupt Request):可屏蔽中断请求输入引脚,高电平有效。当该引脚出现高电平时,表示外部产生了可屏蔽中断请求。
(Interrupt Acknowledge):可屏蔽中断请求响应引脚,三态输出,低电平有效。该引脚输出低电平表示8086响应了可屏蔽中断请求。

4.4 8086为什么设置 /S7引脚?在总线周期的T1状态,该引脚和AD0引脚输出的信息有哪几种组合,分别代表什么操作?
答:由于8086对外有16根数据线,既可以访问8位数据又可以访问16位数据。因此 /S7高8位数据允许/状态复用信号引脚来选择高8为位数据线。它和AD0的组合见下表:
表4-2 和A0的代码组合和对应的操作

A0 操作 所用数据引脚
0 0 从偶地址单元开始读/写一个字 AD15 ~ AD0
0 1 从奇地址单元或端口读/写一个字节 AD15 ~ AD8
1 0 从偶地址单元或端口读/写一个字节 AD7 ~ AD0
1 1 无效
0 1 从奇地址开始读/写一个字(在第一个总线周期将低8位数据送到AD15 ~AD8,下一个周期将高8位数据送到AD7~AD0 ) AD15 ~ AD0
1 0

4.5 8086和8088最大模式、最小模式下的总线周期类型分别由哪些引脚信号区分?80286的总线周期类型由哪些引脚信号区分? 当8086执行指令“ADD AX, [BX+10H]”时,引脚 、 和 上输出的信息分别是什么?
答:8086在最小模式下总线类型由 、 和 区分,最大模式由 、 、 区分。80286引脚 、 、 、 上的信号组合决定了80286的总线周期类型。
当8086执行指令“ADD AX, [BX+10H]”时,引脚 、 和 上输出的信息分别是1、0、1。

4.6 8086/8088最大、最小模式下的微处理器子系统主要有哪些部件构成?简要介绍每个部件的功能。8086、8088微处理器子系统中分别需要多少片地址锁存器,如果需要的话,各需要多少片数据收发器?
答:最小模式下的8086/8088子系统构成情况,主要包括8086/8088微处理器、时钟发生器8284A、地址锁存器8282和数据收发器8286。时钟发生器8284A为系统提供频率恒定的时钟信号,同时对外部设备发出的准备好(READY)信号和复位(RESET)信号进行同步。地址锁存器的输出形成了系统地址总线A19~A0和控制总线中的 。在需要增加数据总线的驱动能力时,可选配数据收发器8286。
最大模式子系统中增加总线控制器8288,解决主处理器和协处理器之间的协调工作,和对系统总线的共享控制问题。
需要3片地址锁存器,2片数据收发器。

4.7 简述8086、8088总线周期的构成情况。如果(DS)=1000H,(AX)=1234H,主存的访问速度足够快(不需要插入TW状态),则8086在指令“MOV [2000H], AX”的指行阶段需要哪种总线周期操作?在该总线周期的各个T状态,8086相关引脚输出的信息分别是什么?如果换作是8088执行以上指令,情况又是什么?
答:需要一个总线写周期。在T1状态输出12000H的物理地址,并发出ALE地址锁存信号以及 =0的信号, 输出低电平;T2状态撤销地址信号,在总线上输出16位数据1234H, 有效,表示要对存储器或外设进行写操作, 有效,使得数据收发器可以传输数据。T3状态数据写入存储器。T4状态撤销各控制及状态信号,总线操作结束。
如果是8088执行以上指令,则需要2个总线写周期,第一个周期将AX中低8位数据34H写往12000H单元,第二个周期将AX中高8位数据12H写往12001H单元。

4.8 8086/8088复位时的操作主要有哪些?复位后执行的首条指令的地址是多少?
答:当RESET引脚上有高电平时,CPU就结束当前操作,进入初始化(复位)过程,包括把各内部寄存器(除CS)清0,标志寄存器清0,指令队列清0,将FFFFH送CS。在复位时,不具有三态功能的控制引脚输出无效状态,而具有三态功能的引脚全部处于浮空状态。
首条指令的地址是0FFFF0H。

习 题5

5.1 名词解释
存储位元、存储单元、存储矩阵、存储周期、存取时间
答:存储位元是用于存放单个二进制信息位的电路,又称为基本存储电路。
存储单元是存储器的最小访问单位,由若干个存储位元组成。
存储矩阵就是存储器中所有存储位元的总称。
存储周期是指对存储器进行连续访问所需的最小时间间隔。
存取时间是指从启动一次主存储器访问到完成该访问为止所需要的时间。

5.2 SRAM存储器一般具有哪几类引脚?它们的作用分别是什么?如果某种SRAM存储器的容量为“8K×4”,则它分别具有多少根地址引脚和数据引脚?
答:SRAM存储器一般具有地址引脚、数据引脚、片选引脚及读写控制引脚。
地址引脚用来接收访问部件送出的存储单元地址。
数据引脚用来向访问部件送出所访问存储单元的信息,或者接收访问部件欲写入到存储单元中的信息。
片选引脚有效是存储芯片才能工作。
读写控制引脚控制对存储芯片做读操作还是做写操作。
SRAM存储器的容量为“8K×4”,则它分别具有13根地址引脚和4根数据引脚。

5.3 DRAM存储器一般具有哪几类引脚?它们的作用分别是什么?如果某种DRAM存储器的容量为“16K×8”,则它分别具有多少根地址引脚和数据引脚?外部器件提供的地址信息应如何输入到该存储器内部?
答:除了地址引脚、数据引脚、读/写控制引脚外,DRAM还具有一对特殊引脚:行地址选择引脚 和列地址选择引脚 。 用于将地址引脚输入的地址信息锁存到行地址缓冲与锁存器,而 用于将地址引脚输入的地址信息锁存到列地址缓冲与锁存器。
DRAM存储器的容量为“16K×8”,则它分别具有7根地址引脚和8根数据引脚。存储单元的14位地址信息分两次送出,每次送出7位,分别在 和 的作用下锁存到行地址锁存器和列地址锁存器。

5.4 为什么需要进行存储器扩展?存储器扩展的方式有哪几种?扩展时,存储芯片的片选信号如何生成?
答:由于受到硬件集成度的限制,单个存储芯片的容量是有限的,所以主存储器往往由若干个存储芯片共同构成,即用多个存储芯片扩展形成主存储器。扩展方式有位扩展、字扩展、字位全扩展。扩展时存储芯片的片选信号由地址信号的高位地址译码产生。

5.5 在8088最小模式系统中,使用2片容量为“32K×8”的62256(主要引脚包括:地址引脚A14~A0、数据引脚D7~D0、片选引脚 、读引脚 和写引脚 )SRAM存储芯片构造起始地址为60000H,且地址连续的64KB存储区域。片选信号的生成方式采用全译码,通过3-8译码器74LS138和必要的门电路实现。请回答以下问题:
(1)需要使用几片62256SRAM芯片?采用何种扩展方式?
(2)画出存储器扩展后的逻辑框图。
(3)确定2片62256SRAM存储芯片在8088最小模式系统中的地址范围。
答:(1)需要2片62256芯片。采用字扩展方式。
(2)

(3)芯片1的地址范围是60000H~67FFFH;
	芯片2的地址范围是68000H~6FFFFH。

5.6 在8086最小模式系统中,使用4片容量为“8K×8”的6264SRAM存储芯片构造起始地址为C8000H,且地址连续的32KB存储区域。片选信号的生成方式采用全译码,通过3-8译码器74LS138和必要的门电路实现。请回答以下问题:
(1)画出存储器扩展后的逻辑框图。
(2)在所画的存储器扩展逻辑框图中,存储器的奇区和偶区分别由哪些6264构成?
(3)确定4片6264RAM存储芯片在8086最小模式系统中的地址范围。

答:(1)框图如下:

(2)存储器的偶区由1#和3#芯片构成,奇区由2#和4#芯片构成。
(3)1#芯片的地址范围为C8000H~CBFFFEH中的偶地址构成。
2#芯片的地址范围为C8000H~CBFFFFH中的奇地址构成。
3#芯片的地址范围为CC000H~CFFFFEH中的偶地址构成。
4#芯片的地址范围为CC000H~CFFFFFH中的奇地址构成。

5.7 现代微型计算机的主存储器通常划分成哪几个区域?分别存放什么信息?高端内存区的地址范围是什么?
答:分成常规内存、保留内存和扩展内存。
常规内存用来存放系统、用户的程序和数据。
保留内存用于存放显示信息的显示缓存区、用于存放系统引导程序的BIOS ROM区和用于存放各种接口电路驱动程序的ROM等。
扩展内存分别用于存放系统、用户的程序和数据以及各类引到程序。
在扩展内存中,把地址范围在100000 H~10FFEFH间的约64KB称为高端内存。

5.8 CMOS存储器内包含哪两个功能模块?系统如何访问CMOS存储器中的存储单元?写出在CMOS中设置报警时间为“18:59:55”的汇编语言程序片断。
答:CMOS存储器内部包含两个功能模块:用来记录系统时间的实时时钟电路和一定容量的非挥发性随机读写存储器(NVRAM)。
CMOS在系统中占用两个I/O地址,分别是70H和71H。70H用来存放存储单元的地址,而71H用来存放存储单元中的内容。通过操作70H和71H两个端口地址就可以完成对CMOS中存储单元的访问。
程序段如下:
MOV DX,70H
MOV AL,01H ;设置秒报警存储单元地址
OUT DX,AL ;或者:OUT 70H,AL
MOV DX,71H
MOV AL,55 ;设置秒报警值为55
OUT DX,AL ;或者用:OUT 71H,AL
MOV DX,70H
MOV AL,03H ;设置分报警单元地址
OUT DX,AL ;或者:OUT 70H,AL
MOV DX,71H
MOV AL,59 ;设置分报警值为59
OUT DX,AL ;或者用:OUT 71H,AL
MOV DX,70H
MOV AL,05H ;设置小时报警单元地址
OUT DX,AL ;或者:OUT 70H,AL
MOV DX,71H
MOV AL,18 ;设置小时报警值为18
OUT DX,AL ;或者用:OUT 71H,AL

5.9 BIOS软件主要分为哪几个功能模块?分别完成什么功能?
答:BIOS程序主要分为三部分:
(1)自检及初始化程序
这部分包括系统建立、加电自检、初始化以及磁盘自举等。计算机上电后或复位后,首先进行加电自检,检查各组成模块工作状态是否良好,然后对各组成模块进行初始化,最后进入磁盘自举阶段,将磁盘上的操作系统核心代码装入到主存,开始启动系统。
(2)系统参数设置程序
用来设置系统的参数并存入CMOS存储器中。在计算中启动时,通过按按键上的特定按键(如Del、F2等)即可启动参数设置程序,进入参数设置界面。
(3)ROM BIOS例程
系统启动后的主体。系统程序或者用户程序通过它们可以访问计算机的硬件资源或者完成特定的操作,如访问磁盘,获取按键信息等。

5.10 何为SHADOW RAM?在计算机系统中设置SHADOW RAM有什么好处?
答:SHADOW RAM即影子内存。由于系统引导程序BIOS和各种接口的专用引导程序用ROM存储器存放,而ROM存储器的工作速度要慢于RAM存储器,可以在RAM区域中划分专用的区域,用来保存各类引导程序的备份。当微处理器需要访问引导程序时就可以知道访问RAM而不需要访问ROM,从而提高工作效率。

5.11 现代微型计算机的三级存储体系指的是什么?高速缓冲存储系统和虚拟存储系统分别有哪两级存储器构成?各自解决什么问题?
答:计算机系统中的存储系统往往是由很多不同类型的存储器共同构成的,例如高速缓冲存储器Cache、主存储器MM及辅助存储器AM等,三种存储器可以构建计算机系统的三级存储体系(Cache-MM-AM)。
高速缓冲存储系统由高速缓冲存储器Cache和主存储器MM组成,主要解决存储速度的问题。
虚拟存储系统由主存储器MM和辅助存储器AM组成,主要解决存储容量的问题。

习 题6

6.1 在计算机系统中,外设为什么需要通过I/O接口连接主机?I/O接口通常有哪几类功能?
答:由于外部设备的种类繁多,工作原理不尽相同,工作速度的差别也很大,因此外设不能直接通过总线与处理器相连接,必需通过I/O接口与总线相连。
I/O接口的功能可以概括为以下几个方面:
(1)地址译码和设备选择功能
(2)数据缓冲功能
(3)传递主机控制命令、存放外设状态信息
(4)数据格式转换功能
(5)增大驱动能力和提供工作电平
(6)其它功能,例如提供主机和外设的时间匹配的控制、中断功能和错误检测功能等。

6.2 I/O接口内部一般应包含哪几个功能模块?按照存储的信息不同,端口分为哪几种?
答:I/O接口内部由若干个端口加上地址译码电路和控制逻辑等组成。
存放数据信息的寄存器称为数据端口,存放状态信息的寄存器称为状态端口,存放控制命令的寄存器称为命令端口或控制端口。

6.3 端口的地址编排方式有哪几种?基于Intel系列微处理器的计算机系统中,端口的地址编排方式属于哪一种?能够访问的端口数量是多少?通过什么指令访问端口?
答:常见的端口编址方式有统一编址和独立编址。Intel系列处理器采用独立编址方式。能够访问的端口数是64K个8位端口。通过IN指令从端口中读出数据,通过OUT指令向端口写数据。

6.4 什么是端口的“输入缓冲”和“输出锁存”?简单的输入端口和输出端口内部通常由什么器件构成?
答:“输入缓冲”是指只有当主机对输入端口进行读操作时,三态缓冲器的控制信号有效,它的输入端和输出端导通,锁存器中的内容就被送往系统数据总线。当不对输入端口进行读操作时,三态缓冲器的控制信息无效,输入端和输出端不导通,输入端口和系统数据总线隔离,不影响其它部件通过数据总线进行信息传输。
“输出锁存”是指当主机对输出端口进行写操作时,锁存信号有效,系统数据总线上传来的数据被锁存到锁存器的输出端,最终被送往输出端口所连接的输出设备。在不对输出端口进行写操作时,锁存信号无效,锁存器的输出保持不变。
简单的输入端口内部通常由三态缓冲器构成,必要时可增加锁存器;输出端口由锁存器构成。

6.5 8088最小模式的计算机系统中,指令“IN AL, DX”的功能是什么?如果(DX)=120H,则在该指令的执行期间需要什么类型的总线操作?在该总线周期的各个T状态,8088相关引脚上输出的信息分别是什么?
答:从由DX指出的端口中读出8位数据,并保存在AL寄存器中。在该指令执行期间做的是总线读操作。在T1状态,地址线上输出端口地址0120H,输出IO/M#为高电平;DEN#信号有效为低电平;T2状态输出RD#=0 的读有效信号,输出DT/R#为低的信号;T3状态在RD#的上升沿时接收外设的数据,存入内部寄存器;T4状态总线操作结束。

6.6 主机与外设间传递信息的控制方式有哪几种?各有什么特点?简述程序查询方式的工作流程。
答:由4种控制方式:程序控制方式、中断方式、直接存储器存取(DMA)方式和通道方式。程序控制方式是指微处理器通过反复执行事先编制好的程序完成对外设信息的访问。程序控制方式分为直接控制方式和程序查询控制方式两种。
程序中断方式在几种控制方式中是最重要的一种方式,它不仅允许主机和外设并行工作,并且允许一台主机管理多台外设,使它们同时工作,大大提高CPU的工作效率。
DMA方式即直接存储器存取方式(Direct Memory Access),是一种直接依靠硬件在主存和I/O设备之间进行数据传送的I/O数据传送控制方式。DMA方式只需要占用系统总线,不需要切换程序,因此节省了CPU的大量时间,使得CPU的效率得以提高。
计算机系统中设置能够代替CPU管理控制外设的独立部件,即I/O通道。主机在执行I/O操作时,只需要启动有关通道,通道将执行通道程序完成输入输出操作。

程序查询方式的工作过程包括三个基本过程:
①读取外设的工作状态信息;
②判断外设是否准备就绪。如果没有,则回到1,继续查询等待;
③若已就绪,CPU进行一次数据传送,并进行指针修改和判断是否结束等操作,如果数据传输没有完成,则转①继续下一个数据的传输,如果传输结束则结束退出。

6.7 阅读图6-19中的查询式输入接口电路,编写完成以下功能的汇编语言程序:以查询方式从输入设备读入100个字节数据,存储到数据段内存缓冲区INBUFF中。
答:
LEA BX,INBUFF
MOV CX,100
STATUS: MOV DX, 102H ;指定状态端口地址
IN AL,DX ;读状态端口
TEST AL,80H ;测试标志位D7
JZ STATUS ; D7=0未就绪,转移后继续查询
MOV DX, 100H ; D7=1就绪,指定数据输入端口地址
IN AL,DX ;从数据输入端口获取外设数据
MOV [BX],AL
INC BX
LOOP STATUS

6.8 阅读图6-20中的查询式输出接口电路,编写完成以下功能的汇编语言程序:以查询方式将数据段内存缓冲区OUTBUFF中定义的若干个字节数据传送给输出设备,当从输出缓冲区取到的数据为“0DH”时,输出该数据后程序结束。
答:

LEA SI,OUTBUFF
STATUS: MOV DX, 102H ;指定状态端口地址
IN AL,DX ;读状态端口
TEST AL,80H ;测试标志位D7
JNZ STATUS ;D7=1,忙,继续查询
MOV DX, 100H ;D7=0,不忙,指定数据输出端口
MOV AL,[SI]
CMP AL,0DH
JZ EXIT
OUT DX,AL ;向数据输出端口写入新数据
INC SI
JMP STATUS
EXIT:

6.9 阅读图6-25开关量输出接口,如果数码管为共阴极,且系统数据线D7D0由高位到低位依次连接74LS273的D8D1引脚,则0~9十个字形信息的字形码分别是什么?如果端口地址为310H,写出在数码管显示“2”的汇编语言程序片断。
答:共阴极字行码如下:
字形信息 0 1 2 3 4 5 6 7 8 9
字形码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH
在数码管上显示“2”的片段如下:
MOV DX,310H
MOV AL,5BH
OUT DX,AL

6.10 简述使用“行扫描法”识别键盘矩阵中被按下的按键的完整过程。阅读图6-26矩阵键盘接口,分别确定(R0,C5)、(R2,C7)、(R6,C6)处按键的2字节行列码。
答:按键(R0,C5)行列码为:FEDFH
按键(R2,C7)行列码为:FB7FH
按键(R6,C6)行列码为:BFBFH

习 题 7

7.1 什么是中断?中断源可分为哪两大类?
答:所谓中断,是指CPU执行程序时,突然有某个外部或内部事件发生,请求CPU处理,CPU暂停当前正在执行的程序,转去执行处理该事件的服务程序,服务完毕后,CPU返回原来程序被中断的地方继续执行。
根据中断发生的原因及位置的不同,分为内部中断和外部中断。其中外部中断又分为可屏蔽中断和不可屏蔽中断。
内部中断也称为软件中断,是由CPU检测到异常情况或执行软件中断指令引起的一种中断,属于非屏蔽中断。内部中断一般是在执行某条指令时或根据标志寄存器某个标志位状态而产生的,一般有除法出错、单步中断、断点中断、溢出中断和INT n中断。

7.2 简要叙述一个完整的中断过程。
答:一个完整的中断处理的基本过程应该包括:中断请求、中断判优、中断响应、中断处理以及中断返回等五个基本阶段。

7.3 当同时有多个中断源向8086发出中断时,它是按照什么顺序来响应中断的?
答:当同时有多个中断源向8086发出中断时,CPU按照如下顺序俩响应中断:内部中断(除单步中断)>NMI中断>INTR中断>单步中断。除单步中断外,任何内部中断的优先级都高于外部中断。

7.4 什么是中断向量?什么是中断向量表?假设中断类型号为43H的中断向量为3210H:4567H,请画图说明中断向量的存放方法。
答:中断向量是指中断服务程序的入口地址,包括段基地址和偏移地址。
8086系统中从内存00000H~0003FFH共1024个字节按中断类型号从低到高的顺序依次存放了256个中断源的中断向量,称为中断向量表。
中断向量地址为:43H*4=20CH。
从20CH开始到20FH共4个字节的内容依次为:67H、45H、10H、32H。

7.5 假设中断类型9的中断服务程序首地址为INTR_9,编写设置中断向量表的程序段。
答:MOV AX,SEG INTRPROC
MOV DS,AX ;DS:DX中预置中断服务程序的入口地址
MOV DX,OFFSET INTR_9
MOV AH,25H ;AH中为DOS调用功能号
MOV AL,9 ;AL中预置中断类型号
INT 21H ;DOS调用

7.6 8259A的中断请求寄存器IRR、中断屏蔽寄存器IMR和中断服务寄存器ISR各有什么作用?
答:中断请求寄存器IRR是一个具有锁存功能的8位寄存器,存放外部输入的中断请求信号IR0IR7的状态。当IRi(i=07)端有中断请求时,IRR相应的位IRRi置“1”。
中断屏蔽寄存器IMR用来存放外部请求IR0~IR7对应的屏蔽信息。当IMR i为“0”时,允许IRR寄存器中IRRi位的中断请求进入中断优先级判别器。当IMR i为“1”,IRRi位的中断请求被屏蔽,禁止进入中断优先级判别器。
中断服务寄存器是8位寄存器ISR,用于存放正在被8259A服务着的中断状态,当ISR i为“1”表示IRRi位的中断正在服务中;为“0”表示没有被服务。

7.7 假设8259A的IR1、IR4和IR7连接有三个中断源,IR4和IR7同时发出了中断请求信号,在中断服务期间,IR1又发出了中断请求。假设8259A工作在全嵌套方式,端口地址为20H和21H。(1)编写代码开放3个中断源的屏蔽位;(2)CPU按照什么顺序响应三个中断源中断请求?
答:(1) MOV AL,01101101B ;开放IR1、IR4和IR7的屏蔽位
OUT 21H,AL
(2)按照IR4 、IR1和IR7的顺序响应中断

7.8 假设8259A初始化时,中断类型号设置为20H~27H,则IR3对应的中断类型号是多少?
答:IR3对应的中断类型号是23H。

习 题 8

8.1 试分析8255A方式0、方式1和方式2的主要区别,并分别说明它们适合于什么应用场合。
答:方式0是一种基本的输入/输出工作方式,在这种方式下,三个端口都可以由程序设置为输入或输出,没有固定的用于应答的联络信号。工作于方式0的端口适用于无条件传送方式和查询方式。

8.2 当8255A的A口工作在方式2时,其端口B适合于什么样的功能?写出此时各种不同组合情况的控制字。
答:端口B可以工作在方式0输出或输入;或方式1输出或输入。控制字如下:
11000000B 11000010B 11000100B 11000110B

8.3 若8255A的端口A定义为方式0,输入;端口B定义为方式1,输出;端口C的上半部定义为方式0,输出。试编写初始化程序。(口地址为80H~83H)
答:方式字为:10010100B。指令序列如下:
MOV AL,94H
OUT 83H,AL

8.4 假设一片8255A的使用情况如下:A口为方式0输入,B口为方式0输出。此时连接的CPU为8086,地址线的A1、A2分别接至8255A的A0、A1,而芯片的 来自A3A4A5A6A7=00101,试写出8255A的端口地址和初始化程序。
答:方式字为:10010000B。8255的四个端口地址为A0H、A2H、A4H和A6H。指令序列如下:
MOV AL,90H
OUT 0A6H,AL

8.5 什么是异步串行通信?什么是同步串行通信?
答:异步通信中收发双方不需要在同一个时钟信号的控制下进行数据传输,双方各自通过自己的时钟信号进行数据的收发。数据以字符为单位进行传输,字符与字符之间传输是异步的,可以有任意时间的间隔,字符内部各位的传输是同步的。
同步通信是收发双方在共同的时钟信号控制下进行数据通信的一种方式。在同步时钟信号的一个周期时间里,发送方的数据线上同步地发送一位数据。同步通信要求发送时钟和接收时钟保持严格的同步。

8.6 假设串行异步通信的数据传输率为56000bps,每一帧有7位数据位,1位奇校验和1位停止位,则每秒钟最多可是传输多少个字符?写出发送方向接收方发送‘7’的二进制数字流。
答:每帧有1+7+1+1共10为数据,所以每秒钟传输的字符为:
56000/10=5600个。
‘7’的ASCII为00110111B,传送的二进制流为:0111011001。

8.7 8251A内部有哪些寄存器?分别举例说明它们的作用和使用方法。
答:8251内部有方式控制字寄存器、命令控制字寄存器、状态寄存器以及同步字符寄存器。

8.8 8251A内部有哪几个端口?它们的作用分别是什么?
答:8251A内部有2个端口,一个为数据端口,用来发送和接收数据;另一个用来设置8251的工作方式和读取状态字。

8.9 8251A的引脚分为哪几类?分别说明它们的功能。
答:8251A的引脚有与处理器相连接的引脚,串行发送相关引脚,串行接收相关引脚,与MODEM相连接的引脚等几类引脚。具体功能略。

8.10 已知8251A发送的数据格式为:数据位7位、偶校验、1个停止位、波特率因子64。设8251A的控制口地址是3FAH,数据口地址是3F8H。试编写用查询法和中断法收发数据的通信程序。
答: MOV CX, 3
XOR AL, AL
MOV DX, 3FAH
AGA: OUT DX, AL
CALL DELAY
LOOP AGA
MOV AL,40H ;软复位命令
OUT DX,AL
CALL DELAY
MOV AL,01111011B ;设置模式字
OUT DX, AL ;7位数据,1位停止位,偶校验,波特率因子64
CALL DELAY
MOV AL, 17H
OUT DX, AL ;设置控制字,清除错误标志,全双工,DTR(______)有效
CALL DELAY
MOV AX, DATA
MOV DS, AX
LEA BX, BUFF
MOV CX, 10
MOV DX, 3FAH ;读状态,查询RXRDY
STATUS:
IN AL,DX
TEST AL, 02H ;RXRDY=1?
JZ STATUS
MOV DX, 3F8H ; RXRDY=1,读入数据
IN AL, DX
MOV [BX], AL ;输入并保存数据
INC BX
MOV DX, 3FAH
IN AL, DX
TEST AL, 38H ;判断有没有错误
JNZ ERR ;出错转出错的处理
LOOP STATUS
JMP EXIT
ERR: ……

EXIT: ……

8.11 若8251A的收、发时钟的频率为38.4KHz,它的 和 引脚相连,试完成满足以下要求的初始化程序:(8251A的地址为02C0H和02C1H。)
(1)单工异步通信,每个字符的数据位数是7,停止位为1位,偶校验,波特率为2400bit/s,发送允许。
(2)单工同步通信,每个字符的数据位数是8,无校验,内同步方式,双同步字符,同步字符为16H,接收允许。
答:(1)MOV AL,01111010B ;送模式字
MOV DX,02C1H
OUT DX,AL ;异步方式,5位/字符,偶校验,2个停止位
NOP
NOP
MOV AL,00110001B ;设置控制字,使发送允许,清出错标志使 有效
OUT DX, AL
(2)MOV AL,00001100B ;同步模式,用2个同步字符,无校验,8位数据位
MOV DX, 02C1H
OUT DX,AL
NOP
NOP
MOV AL,16H
OUT DX,AL ;送同步字符16H
NOP
NOP
OUT DX,AL
NOP
NOP
MOV AL, 10010100B ;设置控制字,使发送器和接收器启动
OUT DX, AL

8.12 试说明定时和计数在实际系统中的应用?这两者之间有和联系和差别?
答:略。

8.13 定时和计数有哪几种实现方法?各有什么特点?
答:定时与计数的实现可以分为软件和硬件两种方法。软件方法是通过延时子程序完成的,当定时的时间较长时,需要通过双重循环来完成。软件定时方法无需太多的硬设备,控制比较简单方便,但在定时期间,CPU不能从事其它工作,降低了计算机的利用率,并且定时精度低。
硬件方法是通过不可编程的硬件定时器或可编程的硬件定时器/计数器来实现。不可编程的硬件定时是采用计数器等原件构成,在电路连接好后,定时时间和范围不能改变,使用不够灵活。可编程硬件定时器/计数器可以通过指令设定定时器/计数器的时间常数,定时精确,使用方便灵活,得到了广泛的应用。

8.14 试说明定时/计数器芯片Intel8254的内部结构。
答:略。

8.15 定时/计数器芯片Intel8254占用几个端口地址?各个端口分别对应什么?
答:占4个端口地址。8254的A1A0为00时对应于计数器0,A1A0为01时对应于计数器1,A1A0为10时对应于计数器2,A1A0为11时对应于控制端口。

8.16 8254芯片共有几种工作方式?每种方式各有什么特点?
答:共有六种工作方式。具体工作方式略。

8.17 某系统中8254芯片的计数器02和控制端口地址分别为FFF0HFFF3H。定义计数器0工作在方式2,CLK0=2MHz,要求输出OUT0为1kHz的速率波;定义计数器l工作在方式0,CLKl输入外部计数事件,每计满100个向CPU发出中断请求。试写出8254计数器0和计数器1的初始化程序。
答:MOV AL, 00110100B
MOV DX, 0FFF3H
OUT DX, AL
MOV AX, 2000
MOV DX, 0FFF0H
OUT DX, AL
MOV AL, AH
OUT DX, AL

MOV AL, 01010000B
MOV DX, 0FFF3H
OUT DX, AL
MOV AL, 100
MOV DX, 0FFF1H
OUT DX, AL

8.18 试编写一程序,使IBM PC机系统板上的发声电路发出200Hz至900Hz频率连续变化的报警声。
答:略。

8.19 设8254的计数器2工作在计数方式,外部事件从CLK2引入,计数器2每计500个脉冲向CPU发出中断请求,CPU响应这一中断后重新写入计数值,开始计数,保持每1秒钟向CPU发出一次中断请求。假设条件如下:
① 8254的计数器2工作在方式0;
② 外部计数事件频率为1kHz;
③ 中断类型号为54H;
④ 8254各端口地址为200H~203H;
⑤ 由8259A进行中断管理。
试编写程序完成以上任务,并画出硬件连接图。

习题9

9.1 简述DMA传送方式的一般过程。
答:DMA传送直接由DMA控制器(DMAC)控制实现。传送过程分为DMA请求、DMA响应、DMA传送和DMA结束处理4个阶段。

9.2 DMA传送方式为什么能实现高速传送?
答:DMA(Direct Memory Access,直接存储器存取)是一种直接依靠硬件在主存和I/O设备之间进行数据传送的I/O控制方式。这种方式下数据的输入输出不需要CPU执行指令,也不经过CPU内部寄存器,可以达到极高的传送速率。

9.3 为什么要采用DMA技术?什么情况下适于采用DMA技术?
答:由于采用DMA技术,数据的输入输出不需要CPU执行指令,也不经过CPU内部寄存器,可以达到极高的传送速率。因而广泛应用于磁盘、网络通信以及高速数据采集等高速I/O设备的接口中。

9.4 8237A有哪两种工作模式?各有何特点?
答:DMAC有两种工作模式,分别为从模块模式和主模块模式。
(1)从模块模式是指,在CPU掌管总线时,它是总线上的被控设备,CPU可以对它进行初始化或其它的I/O读写操作;
(2)主模块模式是指:在DMAC接管总线时,它是总线的主控设备,通过系统总线来控制存储器和外设直接进行数据交换。

9.5 8237A的地址线和读/写信号线与其他I/O接口芯片有何不同?
答:由于8237可以工作在两种模式下,所以它的地址信号和读写信号也有两种作用,既能输入又能输出。当工作在从模块时,地址信号和读写信号线作为输入信号使用接收从CPU发出的信息,对8237A进行初始化。当8237A工作在主模块时,地址信号和读写信号就作为输出信号使用了,用来控制对外设的读写操作。

9.6 8237A有哪几种数据传送方式?各有什么特点?
答:8237A可以工作在单字节传送方式、数据块传送方式、请求传送方式和级联传送方式。
单字节方式一次传送一个字节,效率低,但它会保证在两次DMA传送之间CPU有机会重新获得总线控制权,执行一个CPU总线周期。
数据块传送方式一次请求传送一个数据块,数据块最大长度可以达到64KB,传输效率高;但在整个DMA传送期间CPU长时间无法控制总线(无法响应其它DMA请求,无法处理中断等)。
请求传送方式可由外设利用DREQ信号将一批数据分成几次传送,在这种方式下,允许外设的数据没准备好时,暂时停止DMA传送。
当一片8237A通道不够用时,可通过多片级联的方式增加DMA通道。

9.7 什么是8237A的空闲周期和有效周期?
假如要将18000H~18FFFH存储单元的内容传送到外部设备,采用8237A通道2进行块传送,写出相关的初始化程序。
答:当8237A任一通道都没有DMA请求时就处于空闲周期。当8237A在空闲周期采样到外设有DMA请求时,就脱离空闲周期,进入有效周期。
在有效周期,8237A作为主控芯片控制DMA传送操作。DMA传送借用系统总线完成,其控制信号以及工作时序类似CPU总线周期。有效周期由S0~S4五种状态组成。
初始化程序如下所示:
OUT 0DH,AL ;输出主清除命令
MOV AL,01H
OUT 81H,AL ;地址的高4位写入通道2的页面寄存器
MOV AL,00H
OUT 04H,AL ;输出通道2的当前和基地址的低8位
MOV AL,80
OUT 04H,AL ;输出通道2的当前和基地址的高8位
MOV AX,4096-1 ;字节数是所需传输的字节数减1
OUT 05H,AL ;输出通道2的当前和基字节计数初值低8位
MOV AL,AH
OUT 05H,AL ;输出通道2的当前和基字节计数初值高8位
MOV AL,10001010B ;设置工作方式字
OUT 0BH,AL ;输出工作方式控制字
MOV AL,02H ;开放通道2的屏蔽位
OUT 0AH,AL ;输出屏蔽字
MOV AL,00H ;设置命令控制字
OUT 08H,AL ;输出命令控制字

习题10

  1. 什么是A-D和D-A?
    将模拟信号转换成数字信号的过程称为模数(A-D),
    将数字信号转换成模拟信号的过程称为数模(D-A)。
  2. 一个典型的闭环控制系统由哪些部分组成?
    传感器;控制器;执行器;被控对象
  3. 一个8位的D-A转换器的满量程(对应的数字量位255)为10V。分别确定模拟量3V和7V所对应的数字量
    3/10255=77,7/10255=179
  4. 根据图10-5所示的DAC0832单极性电压输出电路,编写输出负向锯齿波的程序,其中锯齿波的最大电压为4.5V,最小电压为1.5V
   	MOV  A, #00H         ;取下限值           
    MOV  DPTR,#7FFFH ;指向0832口地址
MM:MOVX  @DPTR,A ;输出
   INC  A   ;延时
   NOP
   NOP
   NOP
    SJMP  MM   ;反复
  1. 简述逐次逼近式A-D转换器的工作原理
    逐次逼近比较式的基本原理是:将被测电压和一个可变的基准电压进行逐次比较,最终逼近被测电压。即采用一种“对分搜索”的策略,来逐步缩小Ux的位置范围
    逐次逼近型(也称逐位比较式) A/D转换器主要由逐次逼近比较寄存器SAR, D/A转换器、比较器以及时序和控制逻辑等部分组成。它从SAR的最高位开始,逐位设定SAR寄存器中的数字量,经D/A转换得到电压Vc,与待转换模拟电压Vx进行比较。通过比较,逐次确定各位的数码应是“1”还是“0”。转换结果能否准确逼近模拟信号,主要取决于SAR和D/A的位数。位数越多,越能准确逼近模拟量。

  2. 同时使用A-D和D-A转换器的系统中,地线连接时应该注意什么?
    模拟信号很容易受到电源和数字信号的干扰引起波动。为提高输出的稳定性,减少误差,模拟信号部分必须采用高精度基准电源VREF和独立的地线。所以,要把数字地和模拟地分开。模拟地是模拟信号及基准电源的参考地,其余信号的参考地,包括工作电源地,数据、地址、控制等对应的“地”都是数字地。连接时,先所有的模拟地连接在一起,把所有的数字地连接在一起, 然后在一个点上(注意:不是两个或更多)把模拟地和数字地连接起来。

  3. 已知A-D转换器的满刻度输入电压为10V,分别计算8位、12位和16位时,最小有效位的量化单位各为多少?
    10/256=0.04
    10/4096=0.0024
    10/65536=0.00015

  4. A-D转换器与CPU之间采用查询方式和采用中断方式时,各有什么特点?
    查询方式就是不断的查询某个标志位,需要耗费大量的cpu 的时间,一般情况下除专门用于延时外不用这种方式(自己认为),中断方式比较适合处理具有随即特性的事件,事件发生后向cpu提出申请,然后cpu会保存当前的任务转去处理事件
    编程时查询方式要不断查询标志位,而中断要编写中断服务子程序来处理中断事件

  5. 图10-18所示的接口电路中,将8255A的端口A的工作方式改为方式0输入,EOC的信号作为状态信号来使用。修改电路,并编写程序将IN0~IN7这8路模拟信号转换为数字信号保存在缓冲区BUF中。

你可能感兴趣的:(汇编与微机原理)