微机原理答案(第二版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题答案
1-1解释和区别下列名词术语。
(1). 微处理器μP,微计算机μC,微处理器系统μPS。
(5). 位、字节、字和双字。
(7). RAM和ROM
(8). I/O接口和I/O设备。
(9). 芯片总线、片总线、内总线和外总线。
答:(1). 把CPU的复杂电路,包括运算器和控制器作在一片或几片大规模集成电路的半导体芯片上,这种集成电路叫微处理器μP。
微处理器为核心,配上RAM、ROM,I/O接口及有关辅助电路组成的微型化的主计算机装置称为微计算机μC。
微处理器为核心构成的专用系统称为微处理器系统μPS。
(5)一个二进制的位称作位、8个相邻二进制位称作字节、2个字节称作字,2个字(4个字节)称作双字。
(7)能进行随即读写操作的存储器称作RAM。
只读存储器叫ROM。
(8)输入/输出接口电路称作I/O接口,通过I/O接口接入的外部设备如监视器,键盘、鼠标称作I/O设备。
(9)位于CPU芯片内部,用来实现CPU内部各功能单元电路之间的相互连接和信号的传递的总线叫芯片总线。
片总线是微计算机主板或单板微计算机上以CPU芯片为核心,芯片与芯片间连接的总线。
内总线指微计算机系统中实现插件板之间的连接的总线。
如IBM PC 的PC总线,PC-XT总线,PCI、ISA总线等等。
外总线用于系统之间的连接,完成系统与系统之间通信的总线。
如RS-232,IEE488、USB等等。
1-6 将下列十进制数转换为二进制数、十六进制数和BCD数
(1)124.625
(6)268.875
解:
(1)124=01111100B=7CH,0.625×16=10,所以0.625=0.AH=0.1010B
∴124.625=7C.AH=01111100.1010B=000100100100.011000100101BCD
(2)268=256+12=100001100B=10CH,0.875×16=14,∴0.875=0.EH=0.1110B.
∴268.875=10C.EH=100001100.111B=001001101000.100001110101BCD
1-7 用16位二进制数表示出下列十进制数的原码、反码和补码。
(1)+128
(4)-5
解:
(1)+128 的原码和补码反码均为0000000100000000B
(4)-5的原码为1000000000000101B,反码为1111111111111010B,补码为1111111111111011B。
1-9 写出系列字母、符号的ASCII码
(1)B (2)H (3)SP(空格)(4)5 (5)$ (6)CR(回车符)(7)LF(换行)解:(1)42H、(2)48H、(3)20H、(4)35H、(5)24H、(6)0DH、(7)0AH
1-10 试绘出以下十六进制数在内存中存放的示意图。
设存放地址均为00H。
解:
(1)F7H (2)03BAH (3)C804326BH (4)1122334455667788H
2-1 请将左边的术语和右边的含义联系起来,在括号中填入你选择的代号字母: 1. 字长 (i )a. 指由8个二进制位组成的通用基本单元。
2. 字节 (a )b. 是CPU 执行指令的时间刻度。
3. 指令 (h )c. μPS 所能访问的存储单元数,与CPU 地址总线条数有关。
4. 基本指令执行周期(g )d. 唯一能代表存储空间每个字节单元的地址,用5位十六进制数表示。
5. 指令执行时间 (j )e. CPU 访问1次存储器或I/O 操作所花的时间。
6. 时钟周期 (b )f. 由段基址和偏移地址两部分组成,均用4位十六进制数表
示。
7. 总线周期 (e )g.. 指寄存器加法指令执行所花时间。
8. Cache (k )h. 完成操作的命令。
9. 虚拟存储器 (l )i. 指μP 在交换,加工,存放信息时信息的基本长度。
10. 访存空间 (c )j. 各条指令执行所花的时间不同,不同指令,该值不一。
11. 实际地址 (d )k. 为缓解CPU 与主存储器间交换数据的速度瓶颈而建立的高速存储器。
12. 逻辑地址 (f )l. CPU 执行程序时看到的一个速度接近内存却具有外存容量的假想存储器。
2-2 下面列出计算机中常用的一些单位,试指出其用途和含义。
(1) MIPS (2)KB (3)MB (4)GB (5) TB 解:(1)MIPS 用来表示计算机运行的速度。
1MIPS =1百万条指令/秒。
(2)KB 用来表示计算机访存空间大小。
1KB =1024(210)B (字节) (3)MB 用来表示计算机访存空间大小。
1MB =1048576(220
)B (字节) (4)GB 用来表示计算机访存空间大小。
1GB =1024M (230)B (字节) (5)TB 用来表示计算机访存空间大小。
1TB =1024G (240
)B (字节) 2-4 试将左边的标志和右边的功能联系起来。
要求:
(1) 在括号中填入右边功能的代号;
(2) 填写其类型(属状态标志者填S :属控制标志者填C )。
C8H
03H
04H 02H 32H 01H 6BH 00H 内容 地址 11H
07H 22H
06H
33H 05H 44H 04H 55H 03H 66H 02H 77H 01H 88H 00H 内容 地址 F7H
00H
内容 地址 03H
01H
BAH 00H 内容 地址
(3)写出各标志为0时表示的状态。
解:AX、BX、CX、DX用作数据寄存器,用作存放操作数、中间结果。
SP堆栈指针、BP基址指针、SI源变趾、DI目的变趾。
IP指令指针,FH 控制标志、FL 状态标志。
CS 存储代码段首趾、DS存储数据段首趾、SS 存储堆栈段首趾、ES 附加数据段首趾。
2-8 若一个程序段开始执行之前,(CS)=97F0H,(IP)=1B40H,试问该程序段启动执行指令的实际地址是什么?
解:启动执行指令的实际地址PA=97F0H×10H+1B40H=99A40H
2-9 若堆栈段寄存器(SS)=3A50H,堆栈指针(SP)=1500H,试问这时堆栈顶的实际地址是什么?
解:栈顶的实际地址=(SS)×10H+(SP)=3A50H×10H+1500H=3BA00H
2-11 将8086下列工作方式的特点填于表中。
解:
2-的存放示意图。
解:示意图如下
2-21 列表填写 8086/8088 的存储器和I/O 的保留空间及其用途: 解:
3-1 指令由 操作码 字段和 操作数 字段组成。
8086的指令长度在 1~6个字节 范围。
3-2 分别指出下列指令中源操作数和目的操作数的寻址方式。
若是存储器寻址,试用表达式表示出EA =?PA =?
(1) MOV SI,2100H (4) ADC AX,[BX][SI] (7)MOV AX,ES:[BX] 解(1)源操作数是立即数寻址,目的操作数是寄存器寻址。
(4)源操作数是基址变趾寻址,EA =(BX)+(SI),PA =16×(DS)+(BX)+(SI),
目的操作数是寄存器寻址。
(7)源操作数是寄存器间接寻址,其中EA =(BX ),PA =16×(ES)+(BX ), 目的操作数是寄存器寻址。
3-3 已知 8086 中一些寄存器的内容和一些存储单元的内容如图3-20所示,试指出下列指令执行后,AX 中的内容(即(AX )=?)。
(1)MOV AX,2010H (2) MOV AX,BX (3) MOV AX,[1200H] (4) MOV AX,[BX]
(5)MOV AX,1100H[BX] (6)MOV AX,[BX][SI] (7)MOV AX,1100H[BX+SI] (8)LEA AX,[SI]
0100H BX SI DS
3000H
0002H CPU
12H
30100H 30101H 30102H 30103H
31200H 31201H 31202H 312-3H
┇
B7H 4CH 78H 34H 65H
2AH 56H M
解:(1)(AX)=2010H(2)(AX)=0100H(3)(AX)=4C2AH(4)(AX)=3412H (5)(AX)=4C2AH (6)(AX)=7856H (7)(AX)=65B7H (8)(AX)=0002H
3-4
已知(AX)=2040H,(DX)=380H,端口(PORT)=(80H)=1FH,(PORT+1)=45H,
执行下列指令后,指出结果等于?
解:(1)OUT DX,AL;端口(DX)=40H
(2)OUT DX,AX;端口(DX)=40H,(DX+1)=20H
(3)IN AL,PORT;(AL)=1FH
(4)IN AX,80H;(AX)=451FH
(5)OUT PORT1,AL;端口(PORT1)=40H
(6)OUT PORT1,AX;端口(PORT1)=40H
端口(PORT1+1)=20H
3-5 已知:(SS)=0A2F0H,(SP)=00C0H,(AX)=8B31H,(CX)=0F213H,试画出下列指令执行到位置1和位置2时堆栈区和SP指针内容的变化示意图。
图中应标出存储单元的实际地址PA。
PUSH AX
PUSH CX;位置1
POPF ;位置2
3-7
个程序段的运行结果是什么?2.
解:
(1)LEA SI,NUM1;4-
MOV AX,[SI];2-10T
ADD AX,4[SI];3-
MOV 8[SI],AX;3-10T
ADD SI,2;3-4T
MOV AX,[SI];2-10T
ADC AX,4[SI];3-
MOV 8[SI],AX;3-10T
总计23个字节,84
(2)
MOV AX,NUM1;3-10T
ADD AX,NUM2;4-9T=6T
MOV SUM,AX;3-10T
MOV AX,NUM1+2;3-10T
位置1栈顶
SS
SP
ADC AX,NUM2+2;4-9T+6T
MOV SUM+2,AX;3-10T
总计20个字节,70个时钟周期。
可见
1. 两个程序运行结果相同。
2. 第二个程序占20个字节,比前者少3个字节,运行时间比前者少14个时钟周期。
3-11 已知数据如图3-21所示,低位在前,按下列要求编写程序段:
1. NUM1 和 NUM2 两个字数据相乘(均为无符号数),乘积放在SUM开始的单元。
解:
MOV AX,NUM1
MUL WORD PTR NUM2
MOV SUM,AX
MOV SUM+2,DX
2. NUM1 和NUM2 两个字数据相乘(均为带符号数),乘积放在SUM开始的单元。
解:
MOV AX,NUM1
IMUL WORD PTR NUM2
MOV SUM,AX
MOV SUM+2,DX
3. NUM1单元的字节数据除以13(均为无符号数),商和余数依次放入SUM开始的两个字单元。
解:MOV AL,NUM1
MOV AH,0
MOV CL,13
DIV CL
MOV SUM,AX
4. NUM1字单元的字数据除以NUM2字单元的字,商和余数依次放入SUM开始的两个字单元。
MOV AX,NUM1
MOV DX,0
MOV CX,NUM2
DIV CX
MOV SUM,AX
MOV SUM+2,DX
3-13 已知(AL)=0C4H,DATA单元中内容为5AH,写出下列每条指令单独执行后的结果。
①AND AL,DATA;(AL)=40H
②OR AL,DATA;(AL)=0DEH
③XOR AL,DATA;(AL)=9EH
④NOT DATA;(DATA)=0A5H
⑤AND AL,0FH;(AL)=04H
⑥OR AL,01H;(AL)=0C5H
⑦XOR AL,0FFH;(AL)=3BH
⑧TESTAL,80H;(AL)=0C4H
所有指令执行后都对标志寄存器有影响。
3-19 写出下面指令序列完成的数学计算是什么?
解:MOV CL,3;(CL)←3
SHL AX,CL;(AX)←(AX)×8
SHL BL,CL;(BL)←(BL)×8
SHL CX,CL;(CX)←(CX)×8,此时(CL)=18H
SHL DH,CL;DH算术左移24位后(DH)=0,CF=0
3-20 写出能替代下列重复操作指令完成同样功能的的指令序列
1. REP MOVSW
2. REP CMPSB
3. REP SCASB
4. REP LODSW
解:
1 AGAIN: MOVSW 3 AGAIN:SCASB
DEC CX DEC CX
JNZ AGAINN JNZ AGAIN
2 AGAIN: CMPSB 4 AGAIN:LODSW
DEC CX DEC CX
JNZ AGAIN JNZ AGAIN
3-23 下面两条短转移指令的转移地址ADDR1和ADDR2分别是多少(用十六进制表示)?
1.0220 EB 0A JMP ADDR1
2.0230 EB F7 JMP ADDR2
解:JMP ADDR1 的下一条指令的地址偏移为0222H,0222H+0AH=022CH。
∴ADDR1地址偏移量为022CH。
JMP ADDR2下一条指令的地址偏移量为0232H,0232H+0FFF7H=0229H。
∴ADDR2地址偏移量为0229H。
3-27试编写一个程序段,能完成下列数学表达式的功能。
-1 (X≤-1)
X=0 (-1<X<1)
1 (X≥1)
解:设带符号数(WORD)在AX中,程序段如下
GETX: TEST AX,AX
JNS TZERO
MOV AX,0FFFFH
JMP TEND
TZERO:JZ TEND
MOV AX,1
TEND: RET
3-28 8086的中断机构中共允许256级中断,其专用中断有5个,分别为类型0中断(除数为0的中断)、类型1中断(单步中断)、类型2中断(非屏蔽中断NMI)、类型3中断(断点中断)和类型4中断(溢出中断)。
3-30 用DOS功能调用编写一个程序,能将3-17题中的结果在屏幕上显示出来。
解:MOV CL,4
MOV AL,87H
MOV BL,AL
SHR BL,CL
AND AL,0FH
OR AL,30H
MOV DL,AL
MOV AH,2
INT 21H
AND BL,0FH
OR BL,30H
MOV DL,BL
INT 21H
4-2 计算下列表达式的值(设A1=50,B1=20,G1=2 )
解:
1. A1*100+B1=50*100+20=5020
2. A1 MOD G1+B1=50 MOD 2 +20=20
3. (A1+2)*B1-2=(50+2)*20-2=1038
4. B1/3 MOD 5=20/3 MOD 5=1
5.(A1+3)*(B1 MOD G1)=(50+3)*(20 MOD 2)=0
6. A1 GE G1= 50 GE 2 =11111111B
7. B1 AND 7=20 AND 7= 4
8. B1 SHL 2 + G1 SHR 1= 20 SHL 2 + 2 SHR 1= 81
4-3 已知数据段定义如下,设该段从03000H开始:
DSEG SEGMENT
ARRAY1 DB 2 DUP(0,1,?)
ARRAY2 DW 100 DUP(?)
FHZ EQU 20H
ARRAY3 DB 10 DUP(0,1,4 DUP (2),5)
DSEG ENDS
试用分析算符OFFSET,LENGTH,SIZE,SEG,TYPE 求出ARRAY1,ARRAY2,ARRAY3的段、偏移量和类型,以及它们的LENGTH和SIZE。
解:求段:
SEG ARRAY1=0300H
SEG ARRAY2=0300H
SEG ARRAY3=0300H
求偏移量:
OFFSET ARRAY1=0000H
OFFSET ARRAY2=0006H
OFFSET ARRAY3=00EEH
求类型:
TYPE ARRAY1=1
TYPE ARRAY2=2
TYPE ARRAY3=1
求LENGTH:
LENGTH ARRAY1=6
LENGTH ARRAY2=100
LENGTH ARRAY3=70
求SIZE:
SIZE ARRAY1=6
SIZE ARRAY2=200
SIZE ARRAY3=70
4-7 下述程序段执行后,寄存器CX,SI的内容是多少?
ARRY DW 20 DUP(5)
┆
XOR AX,AX
MOV CX,LENGTH ARRY
MOV SI, SIZE ARRY-TYPE ARRY
解:(CX)=20
(SI)=40-2=38
4-8 试定义一个结构,它应包括一个学生的下列信息:姓名、学号及三门课程的成绩。
然后给出3条结构预置语句,将3个学生的情况送入3个结构变量中。
解:
DAT A SEGMENT
STUDENT STRUC
NAME DB 4 DUP(?)
NO DB ?
ENG DB ?
MAT DB ?
PHY DB ?
STUDENT ENDS
S1 STUDENT<…ZHAN‟,20H,78H,95H,80H>
S2 STUDENT<…WANG‟,21H,88H,91H,90H>
S3 STUDENT<…LILI‟,22H,79H,75H,70H>
DAT A ENDS
4-9 试定义一条宏指令,它可以实现任一数据块的传送(假设无地址重叠),源地址、目的地址和块长度作为参数处理。
MOVDATA MACRO SN,DN,CN,PN
MOV AL,PN
CLD
TEST AL,#80H
JZ CONT
STD
CONT: MOV SI,OFFSET SN
MOV DI,OFFSET DN
MOV CX,CN
REP MOVS DN,SN
ENDM
4-10 设VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误,并改正之。
(1)ADD VAR1,VAR2 (2)SUB AL,VAR1 (3)JMP LAB[SI]
(4)JNZ VAR1 (5)JMP NEAR LAB (6)MOV AL,VAR2
解:
(1)MOV AX,VAR1 (2)MOV AH,0 (3)JMP OFFSET LAB [SI] ADD AX,VAR2 SUB AX,VAR1
(4)MOV SI,VAR1 (5)JMP NEAR PTR LAB (6)MOV AX,VAR2 JNZ TARGET
……
TARGET:JMP [SI]
4-11 已知数据定义如下,问L1和L2等于多少?
B1 DB 1,2,3,‟123‟
B2 DB 0
L1 EQU $-B1
L2 EQU B2-B1
解:$=7,∴$-B1=7-0=7
即L1等于7
L2=B2的偏移地址6-B1的偏移地址0=6
4-15 用查表法将存放于数据段中的一个有序的十六进制数串(范围:0~FH)翻译成ASCII 码表仍放于数据段中。
解:
DAT A SEGMENT
XDHEX DB 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
TBASCII DB …0123456789ABCDEF‟
DAT A ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DAT A
MAIN PROC FAR
ST ART: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DAT A
MOV DS,AX
MOV CX,16
MOV SI,OFFSET XDHEX
MOV BX,OFFSET TBASCII
MOV AH,0
AGAIN: MOV AL,[SI]
MOV DI,AX
MOV AL,[BX+DI]
MOV [SI],AL
INC SI
LOOP AGAIN
RET
ST ART ENDP
CODE ENDS
END ST ART
4-16 试编写一程序,把X和Y中的大者存于BIG单元,若X=Y,则把其中之一存入BIG 单元。
解:DA TA SEGMENT
X DW ?
Y DW ?
BIG DW ?
DA TA ENDS
;------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DAT A
MAIN PROC FAR
ST ART: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DAT A
MOV DS,AX
MOV AX,X
CMP AX,Y
JNC STOBIG;无符号数判断,有符号数用JGE
MOV AX,Y
STOBIG:MOV BIG,AX
RET
START ENDP
CODE ENDS
END START
4-17试编写一程序,比较两个字符串STRING1和STRING2 所含字符是否完全相同,若相同显示“MATCH”,反之,则显示“NO MATCH”。
解:
DATA SEGMENT
STRING1 DB 50 DUP(?)
STRING2 DB 50 DUP(?)
MAT DB …MATCH$‟
NMAT DB …NO MATCH$‟
DATA ENDS
;------------------------------
CODE EGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN PROC FAR
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV CX, LENGTH STRING1
LEA SI, STRING1
LEA DI, STRING2
LEA DX,MAT
CLD
REPE CMPSB
JE PLAY
LEA DX,NMAT
PLAY: MOV AH,09
INT 21H
RET
START ENDP
CODE ENDS
END START
4-19 假设已编好5个乐曲程序,它们的入口地址(含段首趾和偏移地址)存放在数据段中的跳越表MUSICTAB中。
试编写一个管理程序,其功能是:根据键盘输入的乐曲编号00~04 转到所点乐曲入口,执行乐曲程序。
解:
DATA SEGMENT
MUSICTAB DW OFFSET MUSIC0,SEG MUSIC0
DW OFFSET MUSIC1,SEG MUSIC1
DW OFFSET MUSIC2,SEG MUSIC2
DW OFFSET MUSIC3,SEG MUSIC3
DW OFFSET MUSIC4,SEG MUSIC4
DATA ENDS
;------------------------------
CODE EGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
;---------------------------------------------------------------
KEYIN: MOV AH,1
INT 21H
SUB AL,30H
MOV CL,4
ROL AL,CL
MOV BL,AL
MOV AH,1
INT 21H
SUB AL,30H
ADD AL,BL
MOV AH,0
ADD AX,AX
ADD AX,AX
LEA BX, MUSICTAB
MOV SI,AX
JMP DWORD PTR[BX][SI];见教科书116页,④段间间接寻址
MUSIC0:…
MUSIC1:…
MUSIC2:…
MUSIC3:…
MUSIC4:…
EXIT: RET
START ENDP
CODE ENDS
END START
4-21 在数据段中存有一字符串(≤80个字符),以回车CR结束。
编一程序统计此字符串的长度,并将它存入数据区LENTH单元,也显示在屏幕上。
解:设字符串为STRING字节单元开始,程序采用DO_WHILE的循环结构,CX寄存器用作字符串长度计数。
循环结束条件两个:(1)找到CR,屏幕上显示字符串长度-LENTH。
(2)未找到CR,屏幕上显示“ERROR”。
DATA SEGMENT
STRING DB '12345678'
DB 0DH
DB 71 DUP(?)
LENTH DB 80 DUP(?)
ERR DB 'ERROR$'
DATA ENDS
;-------------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN PROC FAR
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
;-------------------------------------------------
MOV DI,OFFSET STRING
CLD
MOV CX,80
MOV AL,0DH
REPNZ SCASB
JNZ PLAYER
MOV AX,80
SUB AX,CX
MOV CL,10
DIV CL
MOV DL,AL
OR DL,30H
PUSH AX
MOV AH,2
INT 21H
POP AX
MOV DL,AH
OR DL,30H
MOV AH,02
INT 21H
RET
PLAYER:MOV DX,OFFSET ERR
MOV AH,9
INT 21H
RET
;----------------------------------------------------
MAIN ENDP
CODE ENDS
END START
4-22 试用串操作指令将一个数组BLOCK(均为字节数)中的奇数和偶数分开存放。
解:1设数组BLOCK在数据段,程序运行后把数组中的奇数存放在数据段数组PODA TA、偶数存放在数据段数组PEDA TA中。
2程序分两次扫描,第一次搜索奇数,并存放于PODA TA中、第二次搜索偶数,并存放于PEDA TA中。
3 两次搜索均用FOR语句结构。
DATA SEGMENT
BLOCK DB 1,2,3,4,5,6,7,8,9,90,21,33
COUNT EQU $-BLOCK
PODATA DB COUNT DUP(?)
PEDATA DB COUNT DUP(?)
DATA ENDS
;-----------------------------------------
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
;-----------------------------------------
MOV SI,OFFSET BLOCK
MOV DI,OFFSET PODATA
MOV CX,COUNT
AGAIN: MOV AL,[SI]
INC SI
TEST AL,1
JZ ELOP
MOV [DI],AL
INC DI
ELOP: LOOP AGAIN
;------------------------------------------
MOV SI,OFFSET BLOCK
MOV DI,OFFSET PEDATA
MOV CX,COUNT
AGAIN1: MOV AL,[SI]
INC SI
TEST AL,1
JNZ ELOP1
MOV [DI],AL
INC DI
ELOP1: LOOP AGAIN1
;------------------------------------------
RET
;------------------------------------------
MAIN ENDP
CODE ENDS
;------------------------------------------
END START
4-23 编一个程序,其功能是将一个字数组ARRAY中的正数和负数分开存放于以PLUS和MINNUS开始的单元中,并在屏幕上显示出正数和负数的个数。
设该数组长度放在数组的第一个字单元中。
解:①搜索采用FOR 语句结构循环程序。
②程序每次循环采用正负数分支完成该次正数与负数分离存储。
DATA SEGMENT
ARRAY DW 10H,8 DUP(1FH,-12)
PLUS DW 10H DUP(?,?)
MINUS DW 10H DUP(?,?)
DATA ENDS
;--------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
;--------------------------------
MOV SI,OFFSET ARRAY
MOV DI,OFFSET PLUS
MOV BX,OFFSET MINUS
LODSW
MOV CX,AX
AGAIN: LODSW
TEST AX,8000H
JNZ MINS
PLS: STOSW
LOOP AGAIN
JMP COMOUT
MINS: XCHG BX,DI
STOSW
XCHG BX,DI
LOOP AGAIN
COMOUT: MOV AX,ARRAY
SUB DI,OFFSET PLUS
SUB BX,OFFSET MINUS
MOV AX,DI
MOV CL,10
DIV CL
OR AL,30H
OR AH,30H
MOV DL,AL
PUSH AX
MOV AH,2
INT 21H
POP AX
MOV DL,AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
INT 21H
MOV AX,BX
MOV CL,10
DIV CL
OR AL,30H
OR AH,30H
MOV DL,AL
PUSH AX
MOV AH,2
INT 21H
POP AX
MOV DL,AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
RET
;-----------------------
MAIN ENDP
CODE ENDS
END START
4-24 现有一组无序的字:25,46,3,75,-5,30,要求对它们进行排序,其算法如图4-31所示。
试编写完成此功能的程序。
解:
DATA SEGMENT
ARRAY DW 25,46,3,75,-5,30 COUNT EQU $-ARRAY
DATA ENDS
;----------------------------------- STACK SEGMENT PARA STACK 'STACK'
DB 60 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK SORT_ PROC FAR
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,COUNT/2-1
CLD
AGAIN0: MOV DI,CX
MOV SI,OFFSET ARRAY
AGAIN1: LODSW
CMP AX,[SI]
JNL NEXT
XCHG [SI],AX
MOV [SI-2],AX
NEXT: DEC DI
JNZ AGAIN1
LOOP AGAIN0
RET
SORT_ ENDP
;---------------------------------
CODE ENDS
END START
4-25 试编写一程序求级数12+22+32+…的前几项和刚大于1000的项数n。
解:采用DO_WHILE循环结构,程序结束时CL中存放n
DATA SEGMENT
N DB ?
DATA ENDS
;------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
;--------------------------------
MOV CL,0
MOV BX,0
AGAIN: INC CL
MOV AL,CL
MUL CL
ADD BX,AX
CMP BX,1000
JBE AGAIN
MOV N,CL
MOV AL,CL
CBW
MOV CL,10
DIV CL
OR AL,30H
MOV CL,AH
MOV DL,AL
MOV AH,2
INT 21H
MOV DL,CL
OR DL,30H
INT 21H
RET
;----------------------------------
MAIN ENDP
CODE ENDS
END START
4-27 数据区中存放着一字节数组BLOCK(其个数为任意),均为组合的十进制数。
试编写一程序求该数组之和,并存入SUM单元(和>1字节)。
解:采用最简单的FOR语句循环结构,寄存器CX作循环控制即可。
DATA SEGMENT
ARRAY DB 12H,13H,14H,15H
DB 16H,17H,18H,19H
COUNT EQU $-ARRAY
SUM DW ?
SUMCHAR DB 6 DUP(?)
DB '$'
DATA ENDS
;------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA MAIN PROC FAR
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
;------------------------------
MOV CX,COUNT
MOV AX,0
MOV SI,OFFSET ARRAY AGAIN: ADD AL,[SI]
DAA
XCHG AH,AL
ADC AL,0
DAA
XCHG AH,AL
INC SI
LOOP AGAIN
MOV SUM,AX
MOV DI,OFFSET SUMCHAR
MOV DX,DI
MOV CL,4
PUSH AX
ROR AH,CL
AND AH,0FH
OR AH,30H
MOV [DI],AH
INC DI
POP AX
PUSH AX
AND AH,0FH
OR AH,30H
MOV [DI],AH
INC DI
ROR AL,CL
AND AL,0FH
OR AL,30H
STOSB
POP AX
AND AL,0FH
OR AL,30H
STOSB
MOV AH,9
INT 21H
RET
;----------------------------------
MAIN ENDP
CODE ENDS
END START
5-6 试简述SRAM芯片上CE,OE,WE引脚的用途。
解:可以用功能表描述三者作用。
5-7 简述DRAM芯片上CAS,RAS引脚的用途。
解:DRAM的地址线如果是n条,其存储单元数>2n,一般为22n。
实际需要2n 条地址线,所以地址线采用时分复用技术,CAS=L时n条地址线代表列地址线,RAS=L时选通行地址线。
使n条地址线完成2n条地址线的功能。
5-8 若一些存储器芯片的地址总线数量分别为8、10、12、14。
存储器对应的存储单元个数为多少?
解:8条时存储单元个数为28=256 个单元,
10条时存储单元个数为210=1024 个单元,
12条时存储单元个数为212=4096 个单元,
14条时存储单元个数为214=16384 个单元。
5-12 CPU 的存储器系统由一片6264(8K×8 SRAM)和一片2764(8K×8 EPROM)组成。
6264的地址范围是8000H~9FFFH、2764的地址范围是0000H~1FFFH。
画出用74LS138译码器的全译码法存储器系统电路(CPU)的地址宽度为16)。
解:8K为213需要13根地址线,∴A0~A12接6262、2764的13根地址线。
A13~A15三根地址线接74LS138的A、B、C三个输入端。
具体电路如图所示:
5-13 某微处理器系统中有1片EPROM 2716,它与CPU的连接如图5-21所示。
问2716的地址空间的分配是多少?
解:如图可见A11~A15全为0时2716被选中,
∴其地址空间为0000H ~ 07FFH。
习题答案第 6、7 章
6-2 简述接口电路组成中各部分的作用,并区分什么是接口?什么是端口?
答:接口部分功能如下:
1.接向CPU部分的功能
(1)总线驱动器:用来实现对CPU数据总线速度和驱动能力的匹配。
(2)地址译码器:接收CPU地址总线信号,进行译码,实现对各寄存器(端口)的
寻址。
(3)控制逻辑:接收CPU控制总线的读/写等控制信号,以实现对各寄存器(端口)
的读/写和时序控制。
2.接向外设部分的功能
(1)数据寄存器(缓冲器):包括数据寄存器和输出寄存器。
前者暂存外设送来的
数据,以便CPU读取,后者暂存CPU送来的数据,以便外设取走。
(2)控制寄存器:接收存放CPU的各种控制命令(或控制字)及其他信息。
这些控
制命令用以设置接口工作方式、工作速度、指定某些参数及引脚功能等。
控制
寄存器一般只能写入。
(3)状态寄存器:保存外设的当前信息。
如,忙/闲状态、准备就绪状态等等,以
供CPU查询、判断。
以上3个寄存器均可由程序进行读或写。
类似存储器单元,所以又称为可编程序的I/O端口。
通常由系统给它们各分配一个地址码,称作端口地址。
外设必须通过输入或输出接口电路才能于CPU交换信息。
这种电路简称接口。
每个接口电路都需占用CPU的一个或多个I/O端口地址。
如8255A是一种接口,它占用4个端口地址。
6-3 说明CPU对I/O设备采用的两种不同编趾方式的优缺点和访问I/O设备采用的指令有哪些?
答:I/O设备两种编趾方法是:
1.统一编趾
这种编趾方式又叫存储器映象方式,是从存储器空间划出一部分给I/O端口。
每个端口相当于一个存储单元。
优点是指令系统简单,便于掌握,且访问外设的寻址方式多。
缺点是,译码相对复杂。
2.I/O端口单独编趾
译码电路相对简单(I/O指令所需地址线相对较少)。
缺点:指令系统相对复杂,且单独的I/O指令寻址方式弱。
访问I/O设备采用的指令是:
(1)IN AL,PORT
(2)IN AX.PORT
(3)IN AL,DX
(4)IN AX,DX
(5)OUT PORT,AL
(6)OUT PORT,AX
(7)OUT DX.AL
(8)OUT DX,AX
6-4说明CPU与I/O设备之间交换数据的控制方式有哪些?比较它们的优缺点?
答:CPU与外设之间数据交换的控制方式可归纳为3种:程序控制方式、中断控制方式和直接存储器存取(DMA)方式。
程序控制方式硬件花销小,初学者容易掌握,但效率太低。
只适合实时性要求不高的场
合。
中断控制方式比程序控制方式复杂,但比DMA简单,效率也在二者之间。
可满足一般实时性较高的系统。
DMA控制方式最复杂,但效率最高。
适用于传送速率高,信息量大的场合如软、硬盘驱动器便采用DMA方式。
------------------------------------------------------------------------------- 6-9 8237A 选择存储器到存储器的传送模式必须具备哪些条件?
答:8237A存储器到存储器传送模式,需用CH0寻址控制源地址,CH1寻址控制目的地址。
所以这种模式必须保证DMA的通道0和1可同时用于M→M传送模式。
两个通道缺一不可。
6-15 微机系统总线层次化结构是怎样的?系统总线的作用是什么?
答:微机系统内的总线可归为4级:
(1)片内总线:又称芯片内部总线,位于CPU芯片内部,用来实现CPU内部各功能单元电
路之间的相互连接和信号的信号传递。
(2)片总线:又称元件级总线,是微计算机主板上或单板微计算机上以CPU芯片为核心,
芯片与芯片间连接的总线。
(3)内总线:又称微计算机总线或板级总线,通常又称为微机系统总线,用来实现计算机
系统中插件板与插件板间的连接。
如PC机的ISA总线,PCI总线等。
(4)外总线:又称通信总线,用于系统之间的连接,完成系统与系统间的通信。
如:RS-
232C。
IEEE-488、USB等等。
系统总线一般指内总线,作用如(3)所述。
6-16 试比较适用于80X86系列微机的并行总线的主要性能?
答:
6-18 什么是USB总线?它有哪些特点?可作为哪些设备的接口?
答:USB(Universal Serial Bus,通用串行总线)是一种新型的外设接口标准。
USB的特点:
(1)连接简单快速:能自动识别系统中设备的接入或移走,真正做到“即插即用”。
(2)可用一种类型的连接器连接多种外设:统一使用4针插头取代了机箱背后种类繁多的
串/并插头,实现了将常规I/O设备、多媒体设备,通信设备以及家用电器统一为一种接口的愿望。
(3)支持多设备的连接:理论1个USB主机连接多达127个外设,两个设备之间的距离可
达5m。
(4)传输速率快:USB1.1版的数据传输率分1.5Mb/s的低速传输和12Mb/s全速传输两种方
式(USB2.0速率可达280Mb/s).比普通并口快约10倍。
(5)内置电源供应:一般串/并口设备都需自带专用电源,USB提供了5V,500mA电源,免
除了自带电源的麻烦。
可用USB接口的设备:
(1)扫描仪、数码相机、数码摄像机、数字声音系统、显示器、软驱动器、网卡及通用I/O
设备的打印机、键盘、鼠标游戏操纵杆、优盘等等。
7-1 什么是中断类型码、中断向量、中断向量表?在基于8086/8088的微机系统中,中断类型码和中断向量之间有什么关系?
答:8086/8088有256 级中断。
可用软中断指令INT n 与之对应。
N取值范围0~255。
256级中断对应的代表0~255其中的某个数n称作中断类型号又称中断类型码。
CPU根据此类型号n,从内存实际地址00000H~003FFH区的中断向量表找到中断服务程序的首地址,每个类型号含4个字节的中断向量。
中断向量是中断服务程序的入口地址。
在8086/8088的微机系统中,中断类型号n×4就得到中断向量在中断向量表的存放地址。
从此地址开始,前两个字节存放着中断服务程序入口地址的偏移量(IP),后2个字节单元存放着中断服务程序入口地址的段首趾(CS)。
7-5 8259A中断控制器的功能是什么?
答:8259A中断控制器的功能包括:管理输入到CPU的中断请求,实现优先权判决,提供中断向量、屏蔽中断输入等功能。
7-8 8086/8088系统中断源的优先级别依次为:
除法错→INT n→INTO→NMI→INTR→单步。
习题答案
7-22条件同7-21题。
利用8259A管理8级中断源,要求:
(1)写出8259A的初始化程序(其端口自定):
(2)当有中断请求时,要求8086CPU把一个1KB的数据块从AREA1开始的存储区送至AREA2开始的存储区。
试编写一主程序等待中断和该中断服务程序。
解:设8259A的首趾为20H,中断类型码80H,选编IRQ4
DA TA SEGMENT
AREA1 DB 400H DUP(?)
AREA2 DB 400H DUP(?)
DA TA ENDS
;-------------------------------------------------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA,ES:DA TA
MAIN PROC FAR
START:PUSH DS
MOV AX,4000H
MOV DS,AX
XOR DX,DX
MOV AX,2584H
INT 21H
MOV AX,DA TA
MOV DS,AX
MOV ES,AX
;---------------------------------------
CLI
MOV AL,13H;边沿触发、不级联,设置ICW4
OUT 20H,AL
MOV AL,80H;中断类型码
OUT 21H,AL
MOV AL,03H;一般全嵌套方式,中断自动结束方式
OUT 21H,AL
MOV AL,0
OUT 21H,AL
;--------------------------------------------------------------------------
STI
LL: JMP LL
MAIN ENDP
CODE ENDS
INTCODE SEGMENT A T 4000H
ASSUME CS:INTCODE,DS:DA TA,ES:DA TA
INT_PROC PROC
INT_SER: MOV SI,OFFSET AREA1
MOV DI,OFFSET AREA2
MOV CX,400H
CLD
REP MOVSB
IRET
INT_PROC ENDP
INTCODE ENDS
END START
8-5试画出8255A与CPU的连接图,并说明8255A的A0,A1地址线与8086CPU的A1,A2地址线连接的原因。
解:连接示意图如下。
8255的A0,A1接8086CPU的A1,A2使8255的A、B、C及控制端口
地址全为偶地址。
使其D0~D78位数据总线全用8086的低8位数据总线访问。
注:ISA总线中不是如此。
8-7简述8255A工作在方式1时,A组端口和B组端口工作在不同状态(输入或输出)时,C口各位的作用。
解:可用下表说明。
8-9 使用8255A作为CPU与打印机接口。
A口工作于方式0(输出),C口工作于方式0。
8255A 与打印机和CPU的连线如图8-54所示(8255A的端口地址及CPU内存地址自行设定)。
试
编写一程序,用查询方式将100个数据打印(8255A的端口地址及100个数据的存放地址自行设定)。
图8-54 8255A作为打印机接口示意
解:设8255A端口地址200H~203H,内存首趾DS:0000H,程序如下;
DATA SEGMENT
CHAR DB 100(?)
P8255A EQU 200H
P8255B EQU 201H
P8255C EQU 202H
P8255CO EQU 203H
MODE8255 EQU 10000001B
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV DX,P8255CO
MOV AL,MODE8255
OUT DX,AL
MOV AL,00001101B;PC0置1
OUT DX,AL
MOV CX,100
MOV SI,OFFSET CHAR
LPST: MOV DX,P8255C
IN AL,DX
TEST AL,1
JNZ LPST
LODSB
MOV DX,P8255A
OUT DX,AL
MOV AL,00001100B
MOV DX, MODE8255
OUT DX,AL
INC AL
OUT DX,AL
LOOP LPST
RET
START ENDP
CODE ENDS
END START
8-10 8250和调制解调器的连接如图8-55所示。
已知端口地址68H~6EH。
试编写下列程序段:
①一般方式下的初始化程序段:设定字符7位、1个偶校验位、2个停止位、启动接收
和发送器。
(设波特率发生器的频率1.8432MHz)
解:
MOV AL,80H;
OUT 6BH,AL;设通信线路控制寄存器D7为1
;-----------------------------------------------
MOV AL,60H
OUT 68H,AL;1200波特率因子低8位
MOV AL,00H
OUT 69H,AL; 1200波特率因子高8位
;-------------------------------------------------------------
MOV AL,00001110B;奇校验,7位数据,2位停止控制字
OUT 6BH,AL;控制字送通信控制寄存器
;--------------------------------------------------------------- MOV AL,00000011B;调制解调控制寄存器:DTR和RTS有效
OUT 6CH,AL
;----------------------------------------------------------------- MOV AL,0
OUT 69H,AL;屏蔽各种中断。
;--------------------------------------------------------------
FOREVER:IN AL,6EH ;等待调制解调器就绪
TEST AL,10H
JZ FOREVER
TEST AL,20H
JZ FOREVER
COMSTA: ……;通信开始
8-11在上题①条件下采用状态查询方式,输入100个数给CPU,放在首趾符号为Buffer的内存缓冲区中(每输入一个字符需要检测错误信息标志,出错时转入出错程序处理)。
解:初始化程序与上题基本相同。
DATA SEGMENT
BUFFER DB 100 DUP(?)
COUNT EQU $-BUFFER
DATA ENDS
;---------------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
;----------------------------------
MOV AL,80H;
OUT 6BH,AL;设通信线路控制寄存器D7为1
;-----------------------------------------------
MOV AL,60H
OUT 68H,AL;1200波特率因子低8位
MOV AL,00H
OUT 69H,AL; 1200波特率因子高8位
;------------------------------------------------------------- MOV AL,00001110B;奇校验,7位数据,2位停止控制字
OUT 6BH,AL;控制字送通信控制寄存器
;--------------------------------------------------------------- MOV AL,00000001B;调制解调控制寄存器:DTR有效
OUT 6CH,AL
;----------------------------------------------------------------- MOV AL,0
OUT 69H,AL;屏蔽各种中断。
;--------------------------------------------------------------
SWAIT: IN AL,6EH ;等待调制解调器就绪
TEST AL,10H;设备就绪?
JZ SWAIT
MOV SI,OFFSET BUFFER
MOV CX,COUNT
MOV AX,DATA
MOV DS,AX
MOV ES,AX
FOREVER: IN AL,6DH
TEST AL,1EH
JNZ ERROR
TEST AL,01H
JZ FOREVER
RECEIVE: IN AL,68H
AND AL,7FH
STOSB
LOOP FOREVER
RET
ERROR: IN AL,68H
JMP FOREVER
START ENDP
CODE ENDS
END START
8-19 8253每个通道的最大定时值是多少?欲使8253用于定时值超过其最大值时,应如何应用?
答:8253最大定时值是216=65536,如果需要超过此值,可采用级联方式。
例如计数器0的OUT0连接到计数器1的CLK1。
采用两级级联定时长度达232=4294967296
8-20利用8253作为定时器,8255一个输出端口控制8个指示灯,编写一个程序,使8个指示灯依次闪动,闪动频率为每秒1次。
解:利用计数器0作定时,CLK0频率1MHz。
定时器0计数初值5000(0C350H),工作在方式2,分频产生20Hz脉冲,OUT0输出的20Hz脉冲连接到CLK1,计数器1计数初值20,也工作在方式2,对20Hz20分频产生秒信号。
以此周期刷新8255指示灯。
设8255端口地址40H~43H,8253端口地址20H~23H,程序采用查询方式工作:
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUMU CS:CODE,DS:DATA
START PROC FAR
MOV AL,10000000B;8255PA口方式0输出控制字
OUT 43H,AL
MOV CL,1
MOV AL,CL
OUT 40H,AL;点亮第一个灯(初始状态)
;------------------------------------------------------。