微机原理期末考试习题选讲资料.docx
《微机原理期末考试习题选讲资料.docx》由会员分享,可在线阅读,更多相关《微机原理期末考试习题选讲资料.docx(26页珍藏版)》请在冰豆网上搜索。
微机原理期末考试习题选讲资料
微机原理习题选讲
江苏大学机械学院测控系
2011年9月
存储器数据组织
:
:
:
VAR1
32H
41H
‘A’
42H
‘B’
43H
‘C’
VAR2
34H
1234H
12H
40H
0040H
00H
42H
‘B’
41H
‘A’
78H
12345678H
56H
34H
12H
--
预留的存储单元
C3H
11000011B
ARRY1
00H
第一组字节方式的0,1
01H
00H
第二组字节方式的0,1
01H
ARRY2
--
第一组字方式的?
,1
--
01H
00H
--
第二组字方式的?
,1
--
01H
00H
:
:
:
例4-3
VAR1DB32H,’ABC’
VAR2DW1234H,40H,’AB’
DD12345678H
DB?
11000011B
ARRY1DB2DUP(0,1)
ARRY2DW2DUP(?
1)
本例所定义的数据存储器分配情况如图示。
寻址方式与指令系统
1.已知(DS)=1000H,(ES)=2000H,(SS)=1100H,(SI)=1010H,(BX)=0200H,(BP)=0600H,请指出下列指令的源操作数字段是什么寻址方式?
源操作数字段的物理地址是什么?
(1)MOVAL,[2400H]
(2)MOVAX,[BP]
(3)ADDAX,ES:
[BP+10]
(4)MOVAL,[BX+SI+25]
解:
(1)该指令的源操作数字段是直接寻址方式
物理地址PA=(DS)×16+2400H=1000H×16+2400H=12400H
(2)该指令的源操作数字段是寄存器间接寻址方式
物理地址PA=(SS)×16+(BP)=1100H×16+0600H=11600H
(3)该指令的源操作数字段是寄存器相对寻址方式
物理地址PA=(ES)×16+(BP)+10=2000H×16+0600H+000AH=2060AH
(4)该指令的源操作数字段是寄存器相对基址变址寻址方式
物理地址PA=(DS)×16+(BX)+(SI)+25
=1000H×16+0200H+1010H+0019H=11229H
2.请指出下列指令中得错误:
(1)MOVDS,12H
(2)MOVAH,400
(3)MOVBP,AL(4)MOVAX,[SI][DI]
(5)OUT257H,AL(6)MOVBYTEPTR[BX],1000
(7)MOV[BX],[SI](8)MOV4[DI],02
(9)MOV[BX+SI+3],IP(10)PUSHBH
解:
(1)不能直接向DS中送立即数
(2)400超过了一个字节的范围
(3)寄存器类型不匹配
(4)SI、DI不能同时使用
(5)直接寻址的输出指令中,端口号只能在0~0FFH范围内
(6)1000超过了一个字节的范围
(7)源和目的操作数不能同时为存储器操作数
(8)源操作数与目的操作数的类型不明确
(9)IP不能作源和目的操作数
(10)PUSH是字操作指令
3.请写出如下程序片段中每条算术运算指令执行后标志CF、ZF、SF、OF、PF和AF的状态:
MOVAX,7896H
ADDAL,AH
ADDAH,AL
ADDAL,0F2H
解:
(1)MOVAX,7896H执行后,AX=7896H,即AH=78H,AL=96H,各标志位保持不变。
(2)ADDAL,AH执行后,AH=78H,AL=0EH,即AX=780EH,所以各标志位状态为:
CF=1,ZF=0,SF=0,OF=0,AF=0,PF=0。
(3)ADDAH,AL执行后,AH=86H,AL=0EH,即AX=860EH,所以各标志位状态为:
CF=0,ZF=0,SF=1,OF=1,AF=1,PF=0。
(4)ADDAL,0F2H执行后,AH=86H,AL=00H,即AX=8600H,所以各标志位状态为:
CF=1,ZF=1,SF=0,OF=0,AF=1,PF=1。
4.X、Y、Z均为16位带符号数,请编写一个程序段计算表达式(X*Y+Z-1000)/70的值。
解:
假设X、Y和Z分别存放在名为DATAX、DATAY和DATAZ的变量单元中。
计算结果保存在AX中,余数保存在DX中,则程序段如下:
MOVAX,DATAX
IMULDATAY;计算X*Y
MOVCX,AX
MOVBX,DX;积保存到BX:
CX
MOVAX,DATAZ
CWD;将DATAZ扩展成32位
ADDAX,CX;计算和
ADCDX,BX
SUBAX,1000;计算差
SBBDX,0
MOVCX,70;计算商和余数
IDIVCX
汇编程序基本设计方法
简单(顺序)程序
例4-25有X,Y两个16位数3456H和0ABCDH,求两数之和,并将结果送到Z单元。
程序清单:
DATASEGMENT
XDW3456H
YDW0ABCDH
ZDW00
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
LEASI,X
LEADI,Y
MOVAX,[SI]
ADDAX,[DI]
MOVZ,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例4-26把压缩BCD码表示的数M,转换为两个相应的ASCII码,结果存在紧跟M后的两个内存单元,低位在前,高位在后。
程序清单:
DATA1SEGMENT
MDB?
NDB2DUP(00)
DATA1ENDS
CODE1SEGMENT
ASSUMEDS:
DATA1,CS:
CODE1
START:
MOVAX,DATA1
MOVDS,AX
LEASI,M
LEADI,N
MOVAL,[SI]
ANDAL,0FH
ADDAL,30H
MOV[DI],AL
MOVAL,[SI]
MOVCL,4
SHRAL,CL
ADDAL,30H
MOV[DI+1],AL
MOVAH,4CH
INT21H
CODE1ENDS
ENDSTART
分支程序
例4-27内存单元M有一个16位带符号数,求其绝对值,并将结果放回原处。
程序清单:
DATA2SEGMENT
MDW?
DATA2ENDS
CODE2SEGMENT
ASSUMEDS:
DATA2,CS:
CODE2
START:
MOVAX,DATA2
MOVDS,AX
LEASI,M
MOVAX,[SI]
ANDAX,AX
JNSDONE
NEGAX
DONE:
MOV[SI],AX
MOVAH,4CH
INT21H
CODE2ENDS
ENDSTART
例4-28编写实现下列函数的程序。
程序清单如下:
DATA3SEGMENT
XDW?
YDW?
DATA3ENDS
CODE3SEGMENT
ASSUMECS:
CODE3,DS:
DATA3
START:
MOVAX,DATA3
MOVDS,AX
LEASI,X
MOVAX,[SI]
ANDAX,AX
JNSLP1
MOVY,0FFH
JMPEND1
LP1:
JNZLP2
MOVY,00H
JMPEND1
LP2:
MOVY,01H
END1:
MOVAH,4CH
INT21H
CODE3ENDS
ENDSTART
循环程序
例4-29以ARRY开始的字节数组有10个带符号数,求出它们的和,并将和送到SUM字单元中。
程序清单如下:
DATA4SEGMENT
ARRAYDBa1,a2,a3,...a10
SUMDW?
DATA4ENDS
CODE4SEGMENT
ASSUMECS:
CODE4,DS:
DATA4
START:
MOVAX,DATA4
MOVDS,AX
LEASI,ARRAY
XORDX,DX
MOVCX.10
DONE:
MOVAL,[SI]
CBW
ADDDX,AX
INCSI
LOOPDONE
MOVSUM,DX
MOVAH,4CH
INT21H
CODE4ENDS
ENDSTART
例子4-30统计数据段string字符串的字符个数,将统计值存入count单元,字符串是由字符$值为结束符的,统计时$不统计在内。
程序清单如下:
DATA5SEGMENT
STRINGDB'Howareyou!
','$'
COUNTDW?
DATA5ENDS
CODE5SEGMENT
ASSUMECS:
CODE5,DS:
DATA5
START:
MOVAX,DATA5
MOVDS,AX
MOVSI,OFFSETSTRING
XORCX,CX
AGAIN:
MOVAL,[SI]
CMPAL,'$'
JZDONE
INCCX
INCSI
JMPAGAIN
DONE:
MOVCOUNT,CX
MOVAH,4CH
INT21H
CODE5ENDS
ENDSTART
例4-31数据段buffer数组有100个字数据,统计该数组中所有为“1”的位的个数,统
计结果存入result单元。
程序清单如下:
DATA6SEGMENT
BUFFERDWa1,a2,a3,...,a100
COUNTEQU100
RESULTDW?
DATA6ENDS
CODE6SEGMENT
ASSUMECS:
CODE6,DS:
DATA6
START:
MOVAX,DATA6
MOVDS,AX
MOVSI,OFFSETBUFFER
MOVCH,COUNT
MOVBX,00H
LOP1:
MOVAX,[SI]
MOVCL,16
LOP2:
SHRAX,1
JNCNEXT
INCBX
NEXT:
DECCL
JNZLOP2
INCSI
INCSI
DECCH
JNZLOP1
MOVRESULT,BX
MOVAH,4CH
INT21H
CODE6ENDS
ENDSTART
子程序
例4-32子程序SUM的功能是对字节数组求和,用寄存器传送参数,主程序两次调用子程序,对不同的数组求和。
程序清单如下:
DATA7SEGMENT
;ARRYADBa1,a2,a3,...,am
COUNTAEQU$-ARRYA
SUMADW?
;ARRYBDBb1,b2,b3,...,bn
COUNTBEQU$-ARRYB
SUMBDW?
DATA7ENDS
STACK1SEGMENT
STAKDB100DUP(?
)
TOPEQU100
STACK1ENDS
CODE7SEGMENT
ASSUMECS:
CODE7,DS:
DATA7,SS:
STACK1
MAIN:
MOVAX,DATA7
MOVDS,AX
MOVAX,STACK1
MOVSS,AX
MOVSP,TOP
LEASI,ARRYA
LEADI,SUMA
MOVCX,COUNTA
CALLSUM
MOVSI,OFFSETARRYB
MOVDI,OFFSETSUMB
MOVCX,COUNTB
CALLSUM
MOVAH,4CH
INT21H
CODE7ENDS
;子程序名为SUM,对字节数组求和
;SI=数组起始地址
;CX=数组长度
;DI=有效数组和目的地址
SUMPROCNEAR
PUSHAX
PUSHBX
MOVAX,00H
AGAIN:
MOVBL,[SI]
MOVBH,0
ADDAX,BX
INCSI
LOOPAGAIN
MOV[DI],AX
POPBX
POPAX
RET
SUMENDP
ENDMAIN
存储器地址及其分配
例5-1图为某一8088系统的存储器连接图,试确定其中各芯片的地址空间。
片选:
选中所用芯片(高位地址线)
字选:
选中所用存储单元(低位地址线)
分析:
对于芯片的使用
1、若使74LS138起作用,需满足:
A17=1;A19=A18=0;A16=A15=A14=0时选中Y0
A16=1,A15=A14=0时选中Y4
2、若选中27128(16KEPROM,需14根地址线A13~A0)
需满足:
1)Y0=0(A16=A15=A14=0)
A19
A18
A17
A16
A15
A14
A13
A12
A11
……
27128:
20000H~23FFFH
A0
0
0
1
0
0
0
0
0
0
……
0
1
1
1
……
1
3、若选中1#6264(8KSRAM,需13根地址线A12~A0)
需满足:
1)A13=0;
2)Y4=0(A16=1,A15=0,A14=0)
A19
A18
A17
A16
A15
A14
A13
A12
A11
……
1#6264:
30000H~31FFFH
A0
0
0
1
1
0
0
0
0
0
……
0
1
1
……
1
4、若选中2#6264需满足:
需满足:
1)A13=1;
2)Y4=0(A16=1,A15=0,A14=0)
A19
A18
A17
A16
A15
A14
A13
A12
A11
……
2#6264:
32000H~33FFFH
A0
0
0
1
0
0
0
1
0
0
……
0
1
1
……
1
例5-2设计某一16位微处理器系统,要求存储容量位8K的EPROM,采用2764芯片,地址为FE000H~FFFFFH;RAM容量为16K,选用6264芯片,地址为F0000H~F3FFFH。
采用全译码方式。
分析:
1)2764EPROM8K×8(需1片);6264SRAM8K×8(需2片)
2)对于2764:
地址范围FE000H~FFFFFH,当A15=A14=A13=1时,选中Y7,2764片选端CE使能。
C
B
A
A19
A18
A17
A16
A15
A14
A13
A12
A11
……
A0
1
1
1
1
1
1
1
0
0
……
0
1
1
1
1
1
1
1
1
1
……
1
3)对于6264:
地址范围F0000H~F3FFFH,(8K需13根地址线0000H~1FFFH)
2#6264:
F0000H+1FFFH=F1FFFH→(F0000H~F1FFFH)
1#6264:
F2000H+1FFFH=F3FFFH→(F2000H~F3FFFH)
当A15=A14=A13=0时,选中Y0,2#6264片选端CE使能
当A15=A14=0,A13=1时,选中Y1,1#6264片选端CE使能
C
B
A
A19
A18
A17
A16
A15
A14
A13
A12
A11
……
A0
2#
1
1
1
1
0
0
0
0
0
……
0
1
1
1
1
0
0
0
1
1
……
1
1#
1
1
1
1
0
0
1
0
0
……
0
1
1
1
1
0
0
1
1
1
……
1
例5-3用存储器芯片SRAM6116构成一个4KB的存储器,要求其地址范围在78000H~78FFFH之间。
分析:
:
记住:
210=1K(A9A8A7…A0:
...0000000000~…1111111111)
1K:
0000H~03FFH
3K:
0000H~0BFFH(1K+2K)
2K:
0000H~07FFH
4K:
0000H~0FFFH
8K:
0000H~1FFFH
题目要求:
地址范围为78000H~78FFFH的4KB内存空间,而6116为2K×8故需2片。
①2K:
78000H~787FFH(78000H+07FFH=787FFH)
②2K:
78800H~78FFFH(78800H+07FFH=78FFFH)
C
B
A
A19
A18
A17
A16
A15
A14
A13
A12
A11
A10
……
A0
0
1
1
1
1
0
0
0
0
0
……
0
①
Y0
0
1
1
1
1
0
0
0
0
1
……
1
0
1
1
1
1
0
0
0
1
0
……
0
②
Y1
0
1
1
1
1
0
0
0
1
1
……
1
思考:
首地址为42000H,组成6K空间,末地址是多少?
(答案:
437FFH提示:
6K=4K+2K)
8255的应用
例7-3利用8255作为打印机的连接接口,并通过该打印机接口打印字符串,字符串长度放在DS段的COUNT单元中,要打印的字符存放在从DATA单元开始的数据区中。
8255与打印机的连接
CPU通过8255接口将数据传送到打印机的D0~D7端,然后利用一个负脉冲STROBE(宽度≥1μs)将数据锁存在打印机内部,以便打印机进行处理。
同时,打印机的BUSY端送出高电平信号,表示其正忙。
仅当BUSY端信号变低后,CPU才可以将下一个数据送给打印机。
INT:
MOVDX,0FBC3H
;8255的控制寄存器端口地址送DX
MOVAL,10000001B
;A组方式0:
A口输出,C口高4位输出
;B组方式0:
B口输出,C口低4位输入
OUTDX,AL
;方式控制字送控制寄存器
MOVAL,00001101B
;C口的按位操作控制字,使PC6初始状态置1
OUTDX,AL
;C口位操作控制字送控制寄存器
下面是打印一批字符的程序段:
MOVCX,COUNT
;将字符串长度作为循环次数
MOVSI,OFFSETDATA
;取字符串首地址
GOON:
MOVDX,0FBC2H
;0FBC2H为C口的地址
INAL,DX
;从C口读入打印机的BUSY信号状态
ANDAL,02H
JNZGOON
;若BUSY为高电平则循环等待
MOVAL,[SI]
;否则取一个字符
MOVDX,0FBC0H
;0FBC0H为A口的地址
OUTDX,AL
;输出一个字符到A口
MOVDX,0FBC2H
;准备在PC6上生成一个负脉冲
MOVAL,0
OUTDX,AL
;因仅PC6接打印机,故由C口输出00H将使PC6变低
MOVAL,40H
OUTDX,AL
;在使PC6变高,在PC6上生成一个STROBE负脉冲
INCSI
;指向下一个字符
LOOPGOON
;若未结束则继续
HLT
注:
STROBE负脉冲也可以利用控制字对C口的按位置位/复位操作来实现。
MOVDX,0FBC3H
MOVAL,00001100B;PC6复位(=0)
OUTDX,AL
MOVAL,00001101B;PC6置位(=1)
OUTDX,AL
附录
1许立梓等编.微型计算机原理及应用.北京:
机械工业出版社,2008
2冯博琴主编.微型计算机原理与接口技术.北京:
清华大学出版社,2002