第1章微型计算机基础知识1
1.1知识要点1
1.2习题解答4
第2章8086/8088微处理器7
2.1知识要点7
2.2习题解答10
第3章8086/8088指令系统13
3.1知识要点13
3.2习题解答14
3.3Debug使用实验25
实验1Debug的使用30
实验2算术运算指令的应用32
实验3串操作指令的应用33
实验4转移指令的应用34
第4章汇编语言及其程序设计35
4.1知识要点35
4.2习题解答36
4.3汇编语言程序设计实验44
实验1显示字符实验51
实验2响铃程序53
实验3排序54
实验4二分查找法56
实验5C语言与汇编语言混合编程58
实验6从键盘输入数据并显示60
实验7计算N!63
实验8两个多位十进制数相减68
实验9接收月/日/年信息并显示70
实验10学生成绩名次表74
[1][3]微型计算机原理与接口技术习题及实验指导(第2版)目录[3][3]第5章存储器79
5.1知识要点79
5.2习题解答80
第6章输入/输出与中断技术85
6.1知识要点85
6.2习题解答88
6.3基本输入/输出接口实验93
实验1用74HC245读入数据93
实验2用74HC273输出数据95
实验316×16 LED点阵显示实验99
实验4LCD液晶显示实验104
实验58279键盘显示实验108
实验68259A中断控制器实验112
第7章可编程接口芯片116
7.1知识要点116
7.2习题解答118
7.3可编程接口芯片应用实验123
实验18255输入/输出实验123
实验28255控制交通灯实验128
实验3步进电动机控制实验132
实验48253定时实验138
实验58253计数器实验142
实验68251A可编程通信实验144
实验7电子钟(CLOCK)实验150
第8章数/模转换及模/数转换技术156
8.1知识要点156
8.2习题解答157
8.3数/模转换和模/数转换实验159
实验1数/模转换实验159
实验2模/数转换实验162
实验3直流电动机测速实验164
第9章总线技术171
9.1知识要点171
9.2习题解答172
参考文献175
第1章微型计算机基础知识1
1.1知识要点1
1.2习题解答4
第2章8086/8088微处理器7
2.1知识要点7
2.2习题解答10
第3章8086/8088指令系统13
3.1知识要点13
3.2习题解答14
3.3Debug的使用实验24
实验1Debug的使用29
实验2算术运算指令的应用31
实验3串操作指令的应用32
实验4转移指令的应用33
第4章汇编语言及其程序设计34
4.1知识要点34
4.2习题解答35
4.3汇编语言程序设计实验43
实验1显示字符实验50
实验2响铃程序52
实验3排序53
实验4二分查找法55
实验5C语言与汇编语言混合编程57
实验6从键盘输入数据并显示59
实验7计算N!62
实验8两个多位十进制数相减67
实验9接收年月日信息并显示70
实验10学生成绩名次表74
第5章存储器79
[1][3]微型计算机原理与接口技术习题及实验指导(第2版)目录[3][3]5.1知识要点79
5.2习题解答80
第6章输入/输出与中断技术85
6.1知识要点85
6.2习题解答88
6.3基本输入输出接口实验93
实验1用74HC245读入数据93
实验2用74HC273输出数据95
实验316x16 LED点阵显示实验99
实验4LCD点阵显示实验104
实验58279键盘显示实验108
实验68259A中断控制器实验112
第7章可编程接口芯片116
7.1知识要点116
7.2习题解答118
7.3可编程接口芯片应用实验123
实验18255输入/输出实验123
实验28255控制交通灯实验128
实验3步进电机控制实验132
实验48253定时实验138
实验58253计数器实验142
实验68251可编程通信实验144
实验7电子钟(CLOCK)150
第8章数/模转换及模/数转换技术156
8.1知识要点156
8.2习题解答157
8.3数/模转换和模/数转换实验159
实验1D/A数模转换实验159
实验2模/数转换实验(ADC0809实验)162
实验3直流电机测速实验164
第9章总线技术171
9.1知识要点171
9.2习题解答172
参考文献175
第1章微型计算机基础知识1
1.1知识要点1
1.2习题解答4
第2章8086/8088微处理器6
2.1知识要点6
2.2习题解答9
第3章8086/8088指令系统11
3.1知识要点11
3.2习题解答12
3.3Debug使用实验21
实验1Debug的使用26
实验2算术运算指令的应用28
实验3串操作指令的应用29
实验4转移指令的应用30
第4章汇编语言及其程序设计31
4.1知识要点31
4.2习题解答32
4.3汇编语言程序设计实验41
实验1显示字符实验41
实验2BCD到ASCII码转换48
实验3响铃程序50
实验4C语言与汇编语言混合编程51
实验5从键盘输入数据并显示54
实验6计算N!57
实验7两个多位十进制数相减62实验8接收年/月/日信息并显示65
实验9排序68
实验10学生成绩名次表73
第5章存储器78
5.1知识要点78
5.2习题解答79
第6章输入/输出与中断技术84
6.1知识要点84
6.2习题解答87
6.3基本输入/输出接口实验91
实验1用74HC245读入数据91
实验2用74HC273输出数据93
实验316×16点阵显示实验96
实验48段数码管显示100
实验5键盘扫描显示实验104
实验68259外部中断实验110
第7章可编程接口芯片115
7.1知识要点115
7.2习题解答117
7.38253/8255应用实验122
实验18255输入/输出实验122
实验2步进电机控制实验126
实验38253定时实验131
实验48253计数器实验133
实验5液晶显示控制实验135
实验68251A串行通信实验144
第8章数/模转换及模/数转换技术156
8.1知识要点156
8.2习题解答157
8.3数/模转换和模/数转换实验159
实验1数/模转换实验159
实验2模/数转换实验161
实验3压力传感器实验164
实验4直流电机控制实验170
第9章总线技术174
9.1知识要点174
9.2习题解答175
参考文献178
第3章
8086/8088
指令系
统
3.知识要点
1
1.8086CPU
寻址方式
操作数的寻址方式是指获得指令中操作数地址即段内偏移地址的方法。
(1)立即寻址:操作数是立即数。
(2)直接寻址:操作数在内存中,指令中直接给出操作数所在的内存单元的偏移
地址。
(3)寄存器寻址:操作数在CPU 内部的寄存器中。
(4)寄存器间接寻址:操作数在内存中,内存单元的偏移地址存放在寄存器中。
(5)寄存器相对寻址:操作数在内存中,内存单元的偏移地址一部分由间接寻址寄存
器提供,另一部分是指令给定的8位或16 位地址位移量,二者相加形成操作数的有效地址。
(6)基址变址寻址:操作数在内存中,基址寄存器和变址寄存器相加作为操作数的
偏移地址。
(7)基址变址相对寻址:操作数在内存中,操作数的地址由基址寄存器加上变址寄
存器再加上地址位移量构成。
(8)隐含寻址:操作码隐含地指明操作数的地址。
2.8086CPU
指令系统
8086CPU 的主要指令如表3-1所示。
表3-
1
8086CPU
的主要指令
指令类型助记符
数
据
传
送
一般数据传送MOV,PUSH,XCHG,XLAT,CBW,CWD
输入/输出指令IN,OUT
地址传送指令LEA,LDS,LES
标志传送指令LAHF,SAHF,PUSHF,POPF
续表
指令类型助记符
算
术
运
算
加法指令ADD,ADC,INC
减法指令SUB,SBB,DEC,NEG,CMP
乘法指令MUL,IMUL
除法指令DIV,IDIV
十进制调整指令DAA,AAA,DAS,AAS,AAM,AAD
逻辑运算和移位指令AND,OR,NOT,XOR,TEST,SHL,SAL,SHR,SAR,ROL,
ROR,RCL
串操作MOVS,CMPS,SCAS,LODS,STOS
控制转移指令JMP,CALL,RET,LOOPE,INT,INTO,IRET 各类条件转移指令
处理器控制指令CLC,STC,CMC,CLD,STD,CLI,STI,HLT,WAIT,ESC,LOCK,NOP
3.习题解答
2
1. 什么叫寻址方式?8086 指令系统中有哪几种寻址方式?
解:寻址方式,即获得地址的方法,主要指获得段内偏移地址的方法。寻址方式共有
8种:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、寄存器相对寻址、基址变址
寻址、基址变址相对寻址、隐含寻址。
2. 存储器寻址可用的寻址方式有哪几种?
解:存储器寻址可以使用5种寻址方式,即直接寻址、寄存器间接寻址、寄存器相对
寻址、基址变址寻址、基址变址相对寻址。
3. 指令中[] 的作用是什么
?
解:指令中[] 表示地址
。
4. 寄存器寻址可以使用的8位寄存器有哪些
?
解:AL 、BL 、CL 、DL 、AH 、BH 、CH 、DH
。
5. 寄存器寻址可以使用的16 位寄存器有哪些
?
解:AX 、BX 、CX 、DX 、BP 、SP 、SI 、DI 、CS 、DS 、ES 、SS
。
6. 寄存器间接寻址可以使用的寄存器有哪些
?
解:SI 、DI 、BX 、BP
。
7. 寄存器间接寻址方式中默认段寄存器是什么?
解:SI 、DI 、BX 寄存器间接寻址时,默认段寄存器为DS 。BP 寄存器间接寻址时,默
认段寄存器为SS 。
8.BUFF 为字节类型变量,DATA 为常量,指出下列
MOV BX,DX
MOV BYTE PTR[BX],'$'
40.编写程序段,在屏幕上依次显示1、2、3、A、B、C。
解:
LEA BX,STR ;STR 为6 个字符的存放区域首地址
MOV CX,6
LPP: MOV AH,2
MOV DL,[BX]
INC BX
INT 21H ;利用2 号功能调用依次显示6 个字符
LOOP LPP
41.编写程序段,把内存中首地址为MEM1的200B送到首地址为MEM2的区域。
解:
MOV AX,SEG MEM1
MOV DS,AX ;设定源串段地址
MOV AX,SEG MEM2
MOV ES,AX ;设定目的串段地址
MOV SI,0 ;设定源串偏移地址
第3 章 8086/8088 指令系统 25
MOV DI,0 ;设定目的串偏移地址
MOV CX,200 ;串长度送CX
CLD ;(DF)=0,使地址指针按增量方向修改
REP MOVSB ;每次传送1B,并自动
HLT
42.编写程序段,以4000H 为起始地址的32个单元中存有32个有符号数,统计其中
负数的个数,并将统计结果保存在BUFFER单元中。
解:
START: MOV DI,OFFSET BUFFER
XOR AL,AL
MOV [DI],AL
MOV SI,4000H
MOV CX,32
AA: MOV AL,[SI]
OR AL,AL
JNS X1
INC [DI]
X1: INC SI
NEXT: LOOP AA
HLT
3.3 Debug使用实验
Debug是DOS、WindowsXP都提供的程序调试工具,在64位机上需要安装DOSbox
虚拟一个DOS环境使用。使用Debug可以查看CPU 内各寄存器、内存单元的内容,或
进行机器代码级跟踪调试程序。
汇编程序中的错误一般分为两类,一类是语法错误,另一类是逻辑错误。汇编语言源
程序在编译时,编译工具会指出语法错误;如果编译通过但是执行结果不正确,说明程序
中含有逻辑错误。要确定逻辑错误的位置,常用的办法是逐行检查程序,逐条执行指令,
查看变量和寄存器的值是否与预期的值一致,这需要借助调试工具完成。Debug是最常
用的可执行程序调试工具,熟练掌握Debug将使以后的程序调试直指问题核心。
1.启动Debug
如图3-1所示,在命令提示符窗口中输入debug,并按Enter键。
在Debug程序调入后,出现提示符“-”,此时可输入debug命令。
Debug有两种调用方式:
. 格式:debug
Debug后面没有参数,用于调试短小的程序。在Debug内即时输入可执行的汇编指
令,并调试。
. 格式:debug xx.exe
图3-1 启动Debug
启动Debg并把指定文件装入内存。xx.xe为Dbg要调试的可执行程序名。xx.x
ueeuee
在内存中存放位置的段基址为CS的值,偏移地址为0。
2.Debug常用命令集
启动Debug后,在提示符后输入“?”,显示Debug中全部可用的命令及命令格式,如
图3-2所示。
图3-2 Debug中包含的命令
下面介绍几个常用的命令。
(1)汇编命令(Asemble):a。
26
微型计算机原理与接口技术习题及实验指导(第
2
版)
第3 章 8086/8088 指令系统 27
汇编命令有以下两种格式:
_a ;从上次结束的地方开始输入汇编指令
_a 开始地址 ;从指定地址开始输入汇编指令
图3-3表示从CS:0014处开始输入汇编指令。
如果启动Debug时没有附带可执行程序,则使用不带参数的A 命令,汇编指令的存
放地址为100H,如图3-4所示。
_a ;利用a 命令输入汇编指令,指令的起始存放地址为100H
图3-3 汇编命令
图3-4 汇编指令起始地址
(2)显示内存命令:d(Dump)。
格式:
d [address]或d [range] ;以十六进制数显示指定的内存信息
例如:
_d ;从上次结束的地方开始显示
_d 开始地址 ;从指定地址开始显示
_d 开始地址结束地址 ;显示指定区域
_d 开始地址 字节数 ;从指定地址开始显示指定的字节数
如图3-5所示,输入_d 0 ff命令,从13BF:0000开始显示256个内存单元的内容。
图3-5 显示内存命令
(3)修改内存命令:e(enter)。
格式:
e 开始地址或内存单元的地址清单 ;以字节为单位修改内存单元的值
28 微型计算机原理与接口技术习题及实验指导(第2 版)
如图3-6(a)所示,修改从DS:100开始的内存单元的值,共修改了7B。
图3-6 修改内存单元的值
(a)示例一;(b)示例二
如图3-6(b)所示,输入e DS:100 e2 "abc" f5命令,其中e2,"a","b","c"和f5
各占1B,用这5B代替原内存单元DS:0100到0104的内容,"a","b","c"分别按它们的
ASCII码值代入。
(4)执行程序命令:g(Go)。
格式:
g [= 开始地址] [结束地址]
如图3-7所示,从13D0:0000开始执行程序,到13D0:0014为止。
图3-7 执行程序命令
第3 章 8086/8088 指令系统 29
(5)显示和修改寄存器命令:r。
格式:
r ;显示所有寄存器的值并显示下一条将要执行的指令
r 寄存器名 ;修改特定寄存器的值
从图3-8中可以看出,r命令除了显示各寄存器的值外,还显示标志寄存器标志位的
状态。
图3-8 显示修改寄存器
CF:进位标志。CF在Debug中的表现形式为:当CF=1时,显示CF;当CF=0时,
显示NC。
PF:奇偶校验位,是否为偶数。PF在Debug中的表示为:当PF=1时,显示PE;当
PF=0时,显示PO。
AF:辅助进位标志符。AF在Debug中的表示为:当AF=1时,显示AC;当AF=0
时,显示NA。
ZF:0标志位,代表是否为0。ZF在Debug中的表示为:当ZF=1时,显示ZF;当
ZF=0时,显示NZ。
SF:符号位,代表是否为负数。SF在Debug中的表示为:当SF=1时,显示为NG;
当SF=0时,显示为PL。
IF:中断允许标志位,决定CPU 是否响应CPU 外部的可屏蔽中断发出的中断请求。
IF在Debug中的表示为:当IF=1时,显示DI;当IF=0时,显示EI。
DF:串传送方向标志位。DF在Debug中的表示为:当DF=0时,显示为DN;当
DF=1时,显示为UP。
OF:有符号数溢出标志位。OF在Debug中的表示为:当F=1时,显示为OV;当
OF=0时,显示为NV。
(6)跟踪执行命令:t。
格式:
t [=地址] ;逐条指令追踪。从指定地址起执行一条指令后暂停,显示寄
存器内容和状态值
t [=地址] [n] ;多条指令追踪。从指定地址起执行n 条命令后停
30 微型计算机原理与接口技术习题及实验指导(第2 版)
(7)退出Debug命令:q。
格式:
q ;退出Debug 程序,返回DOS,但该命令本身并不把在内存中的
文件存盘;如需存盘,应在执行q 命令前先执行写命令w
实验1 Debug的使用
一、实验目的
(1)熟悉Debug程序中的命令,学会在Debug下调试运行汇编语言源程序。
(2)掌握8086/8088CPU 的寻址方式及多字节数据的处理方法。
二、实验内容
1.利用Debug程序中的E命令,将2个多字节数12345678H 和FEDCBA98H 分别
送入起始地址为DS:0200H 和DS:0204H 的2个单元中。
2.分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元
和DS:0204H 单元中的数据相加,并将运算结果存放在DS:0208H 单元中。
三、实验要求
本实验的内容均在Debug下完成,实现数据的装入、修改、显示,汇编语言程序段的
编辑、汇编和反汇编,程序的运行和结果检查。
四、实验步骤
1.启动Debug。
2.用a命令编辑程序,如图3-9所示。
-a ↙
图3-9 编辑程序
3.用u命令反汇编验证源程序,如图3-10所示。
注意:
. 检查源程序是否有错误,若有则返回到第3步用a命令进行修改,直到程序无
第3 章 8086/8088 指令系统 31
图3-10 反汇编验证源程序
错误。
. Debug约定,在其命令或源程序中所涉及的数据均被看作十六进制数,其后不用
H 说明。
. 在Debug下,源程序中不能使用标号、变量和一些伪指令。
. 在Debug下,大小写不敏感。
4.程序未执行前,用R命令观察相关寄存器的内容。
-R↙
如:(AX)= ,(BX)= ,(SI)= ,(DI)= ,
(CS)= ,(IP)= 。
5.程序未执行前,用D 命令观察DS:0200H、DS:0204H、DS:0208H 单元的内
容。如:
-D DS:200 20↙
6.用G命令运行源程序。
-G =100 116↙
7.再用D命令观察DS:0200H~DS:020BH 字节单元中的内容。
-D DS:200 20↙
8.用T单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄存器内容的变化,
并与预计的结果相比较。
注意:
. D命令显示内存数据,注意观察多字节数据在内存中的存放方式。
. 注意观察IP寄存器随着指令执行的变化。
五、实验结果分析
1.程序运行结果:(AX)= ,(BX)= 。
DS:0208H4B单元的内容: 。
2.试用寄存器间接寻址方式编写程序段,完成上述程序段的功能(参考图3-11)。
图3-11 程序流程
实验
2
算术运算指令的应用
一、实验目的
观察指令的执行对FLAGS 的影响,掌握算术运算指令。
二、实验内容
求D9H 与6EH 的和,并注明标志位状态。
三、实验步骤
启动Debug后输入汇编指令并执行,如图3-12 所示,标志位的状态为OF=0,DF=
1,0,0,0,1,1,1。
IF=SF=ZF=AF=PF=CF=
图3-12 标志位的状态
32
微型计算机原理与接口技术习题及实验指导(第
2
版)指令中源操作数的寻址方式。
(1)MOVAX,1200;
14
微型计算机原理与接口技术习题及实验指导(第
2
版)
第3 章 8086/8088 指令系统 15
(2)MOVAL,BUFF;
(3)SUBBX,[2000H];
(4)MOVCX,[SI];
(5)MOVDX,DATA[SI];
(6)MOVBL,[SI][BX];
(7)MOV [DI],AX;
(8)ADDAX,DATA[DI+BP];
(9)PUSHF;
(10)MOVBX,ES:[SI];
解:
(1)MOVAX,1200 ;立即寻址
(2)MOVAL,BUFF ;直接寻址
(3)SUBBX,[2000H] ;直接寻址
(4)MOVCX,[SI] ;寄存器间接寻址
(5)MOVDX,DATA[SI] ;寄存器相对寻址
(6)MOVBL,[SI][BX] ;基址变址寻址
(7)MOV [DI],AX ;寄存器寻址
(8)ADDAX,DATA[DI+BP] ;基址变址相对寻址
(9)PUSHF ;隐含寻址
(10)MOVBX,ES:[SI] ;寄存器间接寻址
9.指出下列指令的错误并改正。
(1) MOV DS, 1200
(2) MOV AL, BX
(3) SUB 33H, AL
(4) PUSH AL
(5) INC [BX]
(6) MOV [BX], [SI]
(7) MOV [DI], 3
(8) ADD AX, ES:[CX]
(9) JMP BYTE PTR[SI]
(10) OUT 3F8H, AL
解:
(1)
MOV DS, 1200 ;不能用立即数给段基址寄存器赋值
可改为两条指令:
MOV AX, 1200
MOV DS, AX
16 微型计算机原理与接口技术习题及实验指导(第2 版)
(2)
MOV AL, BX ;操作数类型不一致
可根据实际问题改为:
MOV AL, BL 或 MOV AX, BX
(3)
SUB 33H, AL ;立即数不能作为目的操作数
可改为两条指令:
MOV AH, 33H
SUB AH, AL
(4)
PUSH AL ;压栈指令的操作数必须是字类型
可改为
PUSH AX
(5)
INC [BX] ;操作数存在二异性
可改为:
INC BYTE PTR [BX] 或者 INC WORD PTR[BX]
(6)
MOV [BX], [SI] ;源操作数和目的操作数不能同时为内存操作数
可改为两条指令:
MOV AX, [SI]
MOV [BX], AX
(7)
MOV [DI], 3 ;操作数存在二义性
可改为:
MOV BYTE PTR [DI], 3 或者 MOV WORD PTR [DI], 3
(8)
ADD AX, ES:[CX] ;CX 不能做间址寄存器使用
可改为:
第3 章 8086/8088 指令系统 17
ADD AX, ES:[SI]
(9)
JMP BYTE PTR[SI] ;操作数必须是字类型
可改为:
JMP WORD PTR[SI]
(10)
OUT 3F8H, AL ;16 位的端口地址不能直接在输入输出指令中
使用
可改为两指令:
MOV DX, 03F8H
OUT DX, AL
10.根据要求写出一条(或几条)汇编语言指令。
(1)将立即数12送入寄存器BL。
(2)将立即数4000H 送入段寄存器DS。
(3)将DI的内容存入数据段中偏移地址2000H 的存储单元。
(4)把数据段中2000H 存储单元的内容送段寄存器ES。
(5)将立即数3DH 与AL相加,结果送回AL。
(6)把BX与CX寄存器内容相加,结果送回BX。
(7)比较AL的内容与0FFH 是否相等,相等就转移到NEXT处执行。
(8)寄存器BL中的低4位内容保持不变,其他位按位取反,结果仍在BL中。
(9)实现AX与-128的乘积运算。
(10)实现AX中高、低8位内容的交换。
(11)将AL中D7 位置1,其余位保持不变。
(12)置位DF、IF、CF。
解:(1)将立即数12送入寄存器BL。
MOV BL, 12
(2)将立即数4000H 送入段寄存器DS。
MOV AX, 4000H
MOV DS, AX
(3)将DI的内容存入数据段中偏移地址2000H 的存储单元。
MOV [2000H], DI
(4)把数据段中2000H 存储单元的内容送段寄存器ES。
MOV AX,[2000H]
18 微型计算机原理与接口技术习题及实验指导(第2 版)
MOV ES,AX
(5)将立即数3DH 与AL相加,结果送回AL。
ADD AL,3DH
(6)把BX与CX寄存器内容相加,结果送回BX。
ADD BX,CX
(7)比较AL的内容与0FFH 是否相等,相等就转移到NEXT处执行。
CMP AL, 0FFH
JE NEXT
(8)寄存器BL中的低4位内容保持不变,其他位按位取反,结果仍在BL中。
MOV AL,BL
AND BL, 0FH
NOT AL
AND AL, 0F0H
OR BL,AL
(9)实现AX与-128的乘积运算。
MOV BX, -128
IMUL BX
(10)实现AX中高、低8位内容的交换。
MOV BX, AX
MOV AL, BH
MOV AH, BL
(11)将AL中D7 位置1,其余位保持不变。
0RAL, 80H
(12)置位DF、IF、CF。
STD
STI
STC
11.设SS=2000H,SP=1000H,SI=2300H,DI=7800H,BX=9A00H。说明执行下
列每条指令后,堆栈内容的变化和堆栈指针的值。
PUSH SI
PUSH DI
POP BX
第3 章 8086/8088 指令系统 19
解:
执行PUSH SI 后:
(0FFFH)=23H
(0FFEH)=00H
SP=0FFEH
执行PUSH DI 后:
(0FFDH)=78H
(0FFCH)=00H
SP=0FFCH
执行POP BX 后:
BX=7800H
SP=0FFEH
12.内存中18FC0H、18FC1H、18FC2H 单元的内容分别为23H、55H、5AH,
DS=1000H,BX=8FC0H,SI=1,执行下列两条指令后AX和DX的值是什么?
MOV AX, [BX+SI]
LEA DX, [BX+SI]
解:
AX=5A55H
DX=8FC1H
13.设AX=1001H,DX=20FFH,执行ADDAX,DX指令后,说明FLAGS中6个
状态标志位的值。
解:CF=0,PF=1,AF=1,ZF=0,SF=0,OF=0。
14.回答下列问题:
(1)设AL=7FH,执行CBW 指令后,AX=?
(2)设AX=8A9CH,执行CWD指令后,AX=? DX=?
解:
(1)设AL=7FH,执行CBW 指令后,AX=007FH。
(2)设AX=8A9CH,执行CWD指令后,AX=8A9CH,DX=FFFFH。
15.执行以下两条指令后,FLAGS的6个状态标志位的值是什么?
MOV AX, 847BH
ADD AX, 9438H
解:CF=1,PF=0,AF=1,ZF=0,SF=0,OF=1。
16.说明SUB与CMP指令的区别。
解:SUB执行减法运算,结果回送到目的操作数。CMP执行减法操作,但是结果不
回送,指令执行结束后,源操作数和目的操作数保持不变。
20 微型计算机原理与接口技术习题及实验指导(第2 版)
17.当两个8位数相乘时,乘积放在哪里?
解:乘积在AX中。
18.当两个16位数相乘时,乘积在哪里?
解:乘积在DX:AX中,AX是乘积的低16位,DX是乘积的高16位。
19.当除数是8位数时,商和余数存在哪里?
解:商在AL中,余数在AH 中。
20.当除数是16位数时,商和余数存在哪里?
解:商在AX中,余数在DX 中。
21.设计几条指令,累加AL、BL、CL、DL的内容,结果存入AH。
解:
ADD AL,BL
ADD AL,CL
ADD AL,DL
MOV AH,AL
22.设计几条指令,从DX中减去AX、BX、CX的内容。
解:
SUB DX,AX
SUB DX,BX
SUB DX,CX
23.设计几条指令,用AL除以BL,结果乘以2,存入DL中。
解:
MOV AH,0
DIV BL
SHL AL,1
MOV DL,AL
24.设计几条指令,将DL中高三位清0,其他位保持不变。
解:
AND DL, 00011111B
25.设计几条指令,将DH 中低三位置1,其他位保持不变。
解:
OR DH, 00000111B
26.说明AND与TEST指令的区别。
解:AND 执行与运算后,结果回送给目的操作数;TEST 执行与运算后,结果不
回送。
27.设计几条指令,测试BL的第2位,为1转WAIT,为0则顺序执行。
第3 章 8086/8088 指令系统 21
解:
TEST BL, 00000100B
JNZ WAIT
……
WAIT: ……
28.串操作指令中,SI指向哪个段? DI指向哪个段?
解:SI指向DS段中的数据串,DI指向ES段中的数据串。
29.下面程序段将03E8H 转换成十进制数,存放在2000H 开始的存储区中,每位十
进制数占用一字节。填写指令后的空格。
MOV AX 03E8H ;AH= 03 , AL= E8H
MOV CX, 1 ;十进制数位数
MOV DI, 2000H ;DI= 2000H
MOV BX, 10 ;BH= 0 , BL= 0AH
GO0: SUB DX, DX ;CF= 0 , ZF= 1
DIV BX ;AX= 64H, 0AH, 01H , DX= 0, 0, 0
MOV [DI], DL ;[DI]= 0, 0, 0
INC DI
INC CX ;十进制数的位数
CMP AX, 10
JNC GO0
MOV [DI], AL ;十进制数的最高位
30.用串操作指令替换以下程序段。
ABC: MOV AL, [SI]
MOV ES:[DI], AL
INC SI
INC DI
LOOP ABC
解:
REP MOVSB
31.设AL=AAH,顺序执行下列各条指令,填写空格。
(1)XOR AL, 0FFH ;AL=55H
(2)AND AL, 0A0H ;AL=A0H
(3)OR AL, C9H ;AX=EBH
(4)TEST AL, 04H ;AX=AAH
32.试写出执行下列3条指令后BX寄存器的内容。
MOV CL, 2
MOV BX, CO2DH
SHR BX, CL
22 微型计算机原理与接口技术习题及实验指导(第2 版)
解:
BX=300BH
33.数据块STR1与数据块STR2的数据相加,结果存入STR2中,请将程序补充完整。
MOV SI, OFFSET STR1
MOV DI, OFFSET STR2
MOV CX, 100
CLD
GO:
ADD AX, ES:[DI]
STOSW
LOOP GO
34.逐行解释下面的程序。
LEA SI, LIST;
MOV CX, 100;
MOV AL,07H;
CLD;
REPNE SCASB;
JCXZ NO;
STC;
NO: CLC;
解:
LEA SI, LIST ;为LIST 设置指针
MOV CX, 100 ;计数器CX 置初值
MOV AL,07H ;AL= 7
CLD ;DF= 0
REPNE SCASB ;在LIST 中查找7
JCXZ NO ;没找到,转NO
STC ;找到了,CF 置1
NO: CLC ;没找到,CF 置0
35.设计几条指令,累加BX、BP、SI、DI的内容,结果存入AX。
解:
ADD AX,BX
ADD AX,BP
ADD AX,SI
ADD AX,DI
36.编写程序段,实现下述要求:
(1)使AX寄存器的低4位清0,其余位不变。
(2)使BX寄存器的低4位置1,其余位不变。
第3 章 8086/8088 指令系统 23
(3)测试AX的第0位和第4位,两位都是1时将AL清0。
(4)测试AX的第0位和第4位,两位中有一个为1时将AL清0。
解:(1)使AX寄存器的低4位清0,其余位不变。
AND AX, 0FFF0H
(2)使BX寄存器的低4位置1,其余位不变。
OR AX, 0FH
(3)测试AX的第0位和第4位,两位都是1时将AL清0。
TEST AX,01H
JZ AA
TEST AX,10H
JZ AA
MOV AL,0
HLT
AA: ……
(4)测试AX的第0位和第4位,两位中有一个为1时将AL清0。
解:
TEST AX, 11H
JZ AA
MOV AL,0
AA: ……
37.编写程序段,完成把AX中的十六进制数转换为ASCII码,并将对应的ASCII码
依次存入MEM 开始的存储单元中。例如,当AX的内容为37B6H 时,MEM 开始的4个
单元的内容依次为33H,37H,42H,36H。
解:
MOV CX,4
LEA SI,MEM
ADD SI,3 ;SI 指向MEM+3
CC: MOV BX,AX ;保存原始数据
AND AX, 000FH ;取个位数
CMP AL, 9
JA AA ;在A~B 之间仅加37H
ADD AL,30H ;在0~9 之间仅加30H
JMP BB
AA: ADD AL,37H
BB: MOV [SI],AL ;保存ASCII 值
DEC SI
PUSH CX
MOV AX,BX
MOV CL,4
24 微型计算机原理与接口技术习题及实验指导(第2 版)
SHR AX,CL ;准备取下一个数
POP CX
LOOP CC
38.编写程序段,求从TABLE开始的10个无符号数的和,结果放在SUM 单元中。
解:
LEA SI,TABLE
MOV CX,10
XOR AX,AX
NEXT: ADD AL,[SI]
ADC AH,0
INC SI
LOOP NEXT
MOV SUM,AX
39.编写程序段,从键盘上输入字符串'HELLO',并在串尾加结束标志'$'。
解:
LEA DX,STRING ;设置字符串存放缓冲区首地址
MOV AH ,0AH ;调用10 号功能,输入字符串
INT 21H
MOV CL,STRING+l ;实际输入的字符个数送CL
XOR CH,CH
ADD DX,2
ADD DX,CX ;得到字符串尾地址