资源描述
微机原理习题选讲
江苏大学机械学院测控系
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
VAR1 DB 32H, ’ABC’
VAR2 DW 1234H,40H, ’AB’
DD 12345678H
DB ?,11000011B
ARRY1 DB 2DUP(0,1)
ARRY2 DW 2DUP (?,1)
本例所定义的数据存储器分配情况如图示。寻址方式与指令系统
1. 已知(DS)=1000H,(ES)=2000H,(SS)=1100H,(SI)=1010H,(BX)=0200H,(BP)=0600H,请指出下列指令的源操作数字段是什么寻址方式?源操作数字段的物理地址是什么?
(1) MOV AL,[2400H]
(2) MOV AX,[BP]
(3) ADD AX,ES:[BP+10]
(4) MOV AL,[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)MOV DS,12H (2)MOV AH,400
(3)MOV BP,AL (4)MOV AX,[SI][DI]
(5)OUT 257H,AL (6)MOV BYTE PTR[BX],1000
(7)MOV [BX],[SI] (8) MOV 4[DI],02
(9) MOV [BX+SI+3],IP (10)PUSH BH
解: (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的状态:
MOV AX,7896H
ADD AL,AH
ADD AH,AL
ADD AL,0F2H
解: (1)MOV AX,7896H执行后,AX=7896H,即AH=78H,AL=96H,各标志位保持不变。
(2)ADD AL,AH执行后,AH=78H ,AL=0EH,即AX=780EH,所以各标志位状态为:CF=1,ZF=0,SF=0,OF=0,AF=0,PF=0。
(3)ADD AH,AL执行后,AH=86H,AL=0EH,即AX=860EH,所以各标志位状态为:CF=0,ZF=0,SF=1,OF=1,AF=1,PF=0。
(4)ADD AL,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中,则程序段如下:
MOV AX,DATAX
IMUL DATAY ;计算X*Y
MOV CX,AX
MOV BX,DX ;积保存到BX:CX
MOV AX,DATAZ
CWD ;将DATAZ扩展成32位
ADD AX,CX ;计算和
ADC DX,BX
SUB AX,1000 ;计算差
SBB DX,0
MOV CX,70 ;计算商和余数
IDIV CX
汇编程序基本设计方法
简单(顺序)程序
例4-25 有X,Y两个16位数3456H和0ABCDH,求两数之和,并将结果送到Z单元。
程序清单:
被加数 → AX
被加数 +加数→ AX
初始化
取段基址 →DS
源操作数指针 →SI
目的操作数指针→DI
开始
结果送Z
结束
DATA SEGMENT
X DW 3456H
Y DW 0ABCDH
Z DW 00
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS ,AX
LEA SI,X
LEA DI,Y
MOV AX,[SI]
ADD AX,[DI]
MOV Z,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
取BCD码 → AL
高4位清零
初始化
取段基址 →DS
源操作数指针 →SI
目的操作数指针→DI
开始
清零后的数加30H
转换成ASCII码
低位数送低位内存
再取BCD码→AL
右移4位,高位补零
加30H转化ASCII码
高位数送高位内存
结束
例4-26把压缩BCD码表示的数M,转换为两个相应的ASCII码,结果存在紧跟M后的两个内存单元,低位在前,高位在后。
程序清单:
DATA1 SEGMENT
M DB ?
N DB 2DUP(00)
DATA1 ENDS
CODE1 SEGMENT
ASSUME DS:DATA1,CS:CODE1
START:MOV AX, DATA1
MOV DS,AX
LEA SI,M
LEA DI,N
MOV AL,[SI]
AND AL,0FH
ADD AL,30H
MOV [DI],AL
MOV AL,[SI]
MOV CL,4
SHR AL,CL
ADD AL,30H
MOV [DI+1],AL
MOV AH,4CH
INT 21H
CODE1 ENDS
END START
分支程序
例4-27内存单元M有一个16位带符号数,求其绝对值,并将结果放回原处。
程序清单:
DATA2 SEGMENT
M DW ?
将带符号数送AX
初始化
取段基址送DS
取操作数指针送SI
开始
将求绝对值的数
送回原内存
结束
求补
小于零吗?
Y
N
DATA2 ENDS
CODE2 SEGMENT
ASSUME DS:DATA2,CS:CODE2
START:MOV AX, DATA2
MOV DS,AX
LEA SI,M
MOV AX,[SI]
AND AX,AX
JNS DONE
NEG AX
DONE: MOV [SI],AX
MOV AH,4CH
INT 21H
CODE2 ENDS
END START
例4-28编写实现下列函数的程序。
将X的值送AX
初始化
取段基址送DS
取X的指针送SI
开始
AX≥0?
Y
N
Y=-1
Y=0
AX>0?
Y
N
结束
Y=1
Y=
1 (当X>0)
0 (当X=0)
-1 (当X<0)
程序清单如下:
DATA3 SEGMENT
X DW ?
Y DW ?
DATA3 ENDS
CODE3 SEGMENT
ASSUME CS:CODE3,DS:DATA3
START:MOV AX, DATA3
MOV DS,AX
LEA SI,X
MOV AX,[SI]
AND AX,AX
JNS LP1
MOV Y,0FFH
JMP END1
LP1: JNZ LP2
MOV Y,00H
JMP END1
LP2: MOV Y,01H
END1:MOV AH,4CH
INT 21H
CODE3 ENDS
END START
循环程序
取加数送AL
初始化
取段基址送DS
取操作数指针送SI
累加器DX清零
累加次数10送循环计数器
开始
保存结果
结束
DX+AX→DX
CX-1→CX=0?
Y
N
带符号数扩展成16位数送AX
修改数据指针
SI+1→SI
例4-29 以ARRY开始的字节数组有10个带符号数,求出它们的和,并将和送到SUM字单元中。
程序清单如下:
DATA4 SEGMENT
ARRAY DB a1,a2,a3,...a10
SUM DW ?
DATA4 ENDS
CODE4 SEGMENT
ASSUME CS:CODE4,DS:DATA4
START:MOV AX, DATA4
MOV DS,AX
LEA SI,ARRAY
XOR DX,DX
MOV CX.10
DONE: MOV AL,[SI]
CBW
ADD DX,AX
INC SI
LOOP DONE
MOV SUM,DX
MOV AH,4CH
INT 21H
CODE4 ENDS
END START
例子4-30 统计数据段string字符串的字符个数,将统计值存入count单元,字符串是由字符$值为结束符的,统计时$不统计在内。
程序清单如下:
DATA5 SEGMENT
STRING DB 'How are you!','$'
取字符送AL
初始化
取段基址送DS
设置数据块指针SI
设置字符计数器CX=0
开始
统计值CX送COUNT
结束
CX+1→CX
AL=$?
N
Y
SI+1→SI
COUNT DW ?
DATA5 ENDS
CODE5 SEGMENT
ASSUME CS:CODE5,DS:DATA5
START:MOV AX, DATA5
MOV DS,AX
MOV SI,OFFSET STRING
XOR CX,CX
AGAIN:MOV AL,[SI]
CMP AL,'$'
JZ DONE
INC CX
INC SI
JMP AGAIN
DONE: MOV COUNT,CX
MOV AH,4CH
INT 21H
CODE5 ENDS
END START
例4-31 数据段buffer数组有100个字数据,统计该数组中所有为“1” 的位的个数,统AX右移1位
外循环初始化
设置计“1”计数器BX,初值=0
设置地址指针SI
设置外循环次数CH=100
开始
CF=1?
Y
N
BX+1→BX
Y
N
结束
将统计结果BX送RESULT
内循环初始化
取字数据送AX
设置内循环次数CL=16
CL-1→CL
修改字指针
SI+2→SI
CH-1→CH
CH=0?
CL=0?
N
Y
LOP1
LOP2
计结果存入result单元。
程序清单如下:
DATA6 SEGMENT
BUFFER DW a1,a2,a3,...,a100
COUNT EQU 100
RESULT DW ?
DATA6 ENDS
CODE6 SEGMENT
ASSUME CS: CODE6, DS:DATA6
START: MOV AX, DATA6
MOV DS, AX
MOV SI, OFFSET BUFFER
MOV CH, COUNT
MOV BX, 00H
LOP1: MOV AX, [SI]
MOV CL, 16
LOP2: SHR AX, 1
JNC NEXT
INC BX
NEXT: DEC CL
JNZ LOP2
INC SI
INC SI
DEC CH
JNZ LOP1
MOV RESULT, BX
MOV AH, 4CH
INT 21H
CODE6 ENDS
END START
子程序
例4-32 子程序SUM的功能是对字节数组求和,用寄存器传送参数,主程序两次调用子程序,对不同的数组求和。
程序清单如下:
DATA7 SEGMENT
; ARRYA DB a1,a2,a3,...,am
COUNTA EQU $-ARRYA
SUMA DW ?
; ARRYB DB b1,b2,b3,...,bn
COUNTB EQU $-ARRYB
SUMB DW ?
DATA7 ENDS
STACK1 SEGMENT
STAK DB 100 DUP(?)
TOP EQU 100
STACK1 ENDS
CODE7 SEGMENT
ASSUME CS:CODE7,DS:DATA7,SS:STACK1
MAIN: MOV AX, DATA7
MOV DS,AX
MOV AX,STACK1
MOV SS,AX
MOV SP,TOP
LEA SI,ARRYA
LEA DI,SUMA
MOV CX,COUNTA
CALL SUM
MOV SI,OFFSET ARRYB
MOV DI,OFFSET SUMB
MOV CX,COUNTB
CALL SUM
MOV AH,4CH
INT 21H
CODE7 ENDS
;子程序名为SUM,对字节数组求和
;SI=数组起始地址
;CX=数组长度
;DI=有效数组和目的地址
SUM PROC NEAR
PUSH AX
PUSH BX
MOV AX,00H
AGAIN:MOV BL ,[SI]
MOV BH,0
ADD AX,BX
INC SI
LOOP AGAIN
MOV [DI],AX
POP BX
POP AX
RET
SUM ENDP
END MAIN
存储器地址及其分配
例5-1图为某一8088系统的存储器连接图,试确定其中各芯片的地址空间。
片选:选中所用芯片(高位地址线)
字选:选中所用存储单元(低位地址线)
分析:对于芯片的使用
1、若使74LS138起作用,需满足:
A17=1;A19=A18=0;A16=A15=A14=0时选中 Y0
A16=1,A15=A14=0时选中Y4
2、若选中27128(16K EPROM,需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(8K SRAM,需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)2764 EPROM 8K×8 (需1片);6264 SRAM 8K×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 用存储器芯片SRAM 6116构成一个4KB的存储器,要求其地址范围在78000H~78FFFH之间。
0
0
1
1
1
1
分析::
记住:210=1K (A9A8A7…A0: ...00 0000 0000 ~ …11 1111 1111 )
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:
MOV DX,0FBC3H
;8255的控制寄存器端口地址送DX
MOV AL,10000001B
;A组方式0:A口输出,C口高4位输出
;B组方式0:B口输出,C口低4位输入
OUT DX,AL
;方式控制字送控制寄存器
MOV AL,00001101B
;C口的按位操作控制字,使PC6初始状态置1
OUT DX,AL
;C口位操作控制字送控制寄存器
下面是打印一批字符的程序段:
MOV CX,COUNT
;将字符串长度作为循环次数
MOV SI ,OFFSET DATA
;取字符串首地址
GOON:
MOV DX,0FBC2H
;0FBC2H为C口的地址
IN AL,DX
;从C口读入打印机的BUSY信号状态
AND AL,02H
JNZ GOON
;若BUSY为高电平则循环等待
MOV AL,[SI]
;否则取一个字符
MOV DX,0FBC0H
;0FBC0H为A口的地址
OUT DX,AL
;输出一个字符到A口
MOV DX,0FBC2H
;准备在PC6上生成一个负脉冲
MOV AL,0
OUT DX,AL
;因仅PC6接打印机,故由C口输出00H将使PC6变低
MOV AL,40H
OUT DX,AL
;在使PC6变高,在PC6上生成一个STROBE负脉冲
INC SI
;指向下一个字符
LOOP GOON
;若未结束则继续
HLT
注:STROBE负脉冲也可以利用控制字对C口的按位置位/复位操作来实现。
MOV DX,0FBC3H
MOV AL,00001100B; PC6复位(=0)
OUT DX,AL
MOV AL,00001101B; PC6置位(=1)
OUT DX,AL
附 录
1 许立梓等编 . 微型计算机原理及应用 . 北京:机械工业出版社, 2008
2 冯博琴主编 . 微型计算机原理与接口技术 . 北京: 清华大学出版社, 2002
展开阅读全文