《微机原理与接口技术》
习题与实验指导
目 录
第一章 微型计算机基础知识 ..............................................................................................................1 1.1 知识要点 ...................................................................................................................................... 1.2 习题解答 ...................................................................................................................................... 第二章 8088/8086微处理器 ............................................................................................................ 15
2.1 知识要点 .................................................................................................................................. 15 2.2 习题解答 .................................................................................................................................. 18
........................................................................................................... 第三章 8086/8088 指令系统37
3.1 知识要点 .................................................................................................................................. 37 3.2 习题解答 .................................................................................................................................. 38
.......................................................... 3.3 debug应用实验 43
................................................. 实验1 算术运算指令的应用 49
................................................... 实验2 串操作指令的应用 58 ..................................................... 实验3 转移指令的应用61
第四章 汇编语言及其程序设计.................................................... 81
4.1 知识要点 ................................................................ 81
4.2 习题解答 ................................................................................................................................. 83 4.3 汇编语言程序设计实验 ...................................................................................................... 89
实验1 显示字符 .................................................................................................................. 97
................................................................................................ 实验2 BCD到ASCII码转换98
实验3 计算N! ........................................................................................................................ 99
.......................................................................................... 实验4 两个多位十进制数相减 97 .............................................................................................. 实验5 从键盘输入数据并显示98
...................................................................................................................... 实验6 响铃程序99
.......................................................................................... 实验7 接收年月日信息并显示 97
.............................................................................................................................. 实验8 排序 98
.......................................................................................................... 实验9 学生成绩名次表99
................................................................................................................... 第五章 存储器 122
5.1 知识要点 ............................................................................................................ 122 5.2 习题解答 ............................................................................................................ 125 第六章 输入/输出与中断技术 ......................................................................................................... 146
6.1 知识要点 ................................................................................................................................ 146 6.2 习题解答 ................................................................................................................................ 149 6.3 简单接口的数据输入输出实验 ....................................................................................... 152
实验1 用74HC245读入数据 ................................................................................................ 152
实验2 用74HC273输出数据
实验3 9259外部中断实验 ................................................................................................... 152
第七章 可编程接口芯片 ................................................................................................................... 185
7.1 知识要点 ................................................................................................................................ 185
实验1 8253计数器实验
实验2 8253定时器实验 ....................................................................................................... 198 实验3 8255输入输出实验 ................................................................................................... 205
........................................................................................................ 实验4 八段码显示实验198 .................................................................................................... 实验5 键盘扫描显示实验205 .............................................................................................. 第八章 模/数转换及数/模转换技术222
8.1 知识要点 ................................................................................................................................ 222
7.2 习题解答 ................................................................................................................................ 191 7.3 可编程中断控制器Intel8259A........................................................................................ 196
实验1 D/A数模转换实验 .................................................................................................... 233
实验2 A/D模数转换实验 .................................................................................................... 234
........................................................................................................ 实验3 压力传感器实验234
第九章 总线技术 ................................................................................................................................. 244
9.1知识要点.................................................................................................................................... 244
8.2 习题解答 ................................................................................................................................ 227 8.3 数/模转换和模/数转换实验 ............................................................................................. 233
9.2 习题解答 ................................................................................................................................ 249
第1章 微型计算机基础知识
1.1 知识要点
1. 根据组成计算机基本电路的元器件的发展,计算机的发展过程大致分成四个阶段。
第一代:电子管计算机 第二代:晶体管计算机 第三代:集成电路计算机
第四代:大规模集成电路计算机
2. 冯·诺依曼计算机体系结构包含运算器、控制器、存储器、输入设备、输出设备五大部件。 3. 计算机按其性能、体积和价格等的不同,可分为巨型机、大型机、中型机、小型机、微型
机和单片机六大类。
4. CPU的内部结构一般包含运算器、控制器和寄存器组。
5. 按工作方式不同,内存可分为两大类:随机存储器RAM(Random Access Memory)和只读存
储器ROM(Read Only Memory)。RAM可以被CPU随机地读和写,当机器断电后,所存信息消失。ROM中的信息只能被CPU随机读取,而不能由CPU写入。机器断电后,信息并不丢失。
6. 总线由一组导线和相关控制电路组成,是各种公共信号线的集合,用作微机系统各大部件
之间的信息传送。在CPU、存储器、I/O接口之间传送信息的总线称为系统总线。根据所传送信息的类别的不同,总线又分为三种类型(俗称系统三总线)。它们分别是地址总线、数据总线和控制总线。 7. 各种数制之间的转换方法
? 非十进制数到十进制数的转换。
任何一个非十进制数,按其权表达式展开后计算所得结果即为十进制数。
十进制数转换为二进制数。 整数部分的转换方法是“除2取余”,小数部分采用“乘2取整”的方法 ? 十进制数转换为十六进制数 方法1:整数部分用“除16取余”,小数部分则“乘16取整”。
方法2:先把十进制数转换为二进制数,之后再转换为十六进制数。 ? 二进制数与十六进制数之间的转换
将二进制数转换为十六进制数的方法是:从小数点开始分别向左和向右把整数部分和小数部分每四位分成一组。若整数部分的最高的一组不够四位,则在其左边补零来构成四位;同样若小数部分最后一组不够四位,则在其右补零来构成四位。之后将每组二进制数用相应的十六进制数替换,则得到转换结果。 8. BCD码与十进制数、二进制数的转换。 按BCD码与十进制数对应关系把4位BCD码与1位十进制数相互转换 9. 无符号数的表示范围及运算溢出判断。
?
一个n位无符号二进制数X,其表示数的范围为:0?X?2?1 无符号数加减运算的溢出判断的准则是如果运算结果的最高位向更高位产生进位(加法)或借位(减法),则运算结果产生溢出。
10. 带符号数在计算机中的原码、反码和补码表示方法。 11. 补码运算规则
?
n?
?X?Y?补??X?补??Y?补。
?X?Y?补??X?补??Y?补??X?补???Y?补。
补码的减法规则:
补码的加法规则:
12. 带符号数的溢出判断
即对于一个n位的带符号二进制数,如果运算过程中Cn?1?Cn?2?1,则运算结果产生溢出;如果Cn?1?Cn?2?0,则运算结果没有产生溢出。 13. 基本逻辑门及常用逻辑部件
1) 与门
与门是实现“与”运算的电路。若输入的逻辑变量为A和B,则通过与门输出的结果F可表示为: F=A∧B
2) 或门
或门是实现“或”运算的电路。若输入的逻辑变量为A和B,则通过或门输出的结果F可表示为: F=A∨B
3) 非门
非门是实现“非”运算的电路,又称反相器。它只有一个输入端和一个输出端。若输入的逻辑变量为A,则通过非门输出的结果F可表示为: __ F=A
4) 与非门
与非门是实现先“与”运算再“非”运算的电路。若输入的逻辑变量为A和B,则通过与非门输出的结果F可表示为: F=A∧B
5) 或非门
或非门是实现先“或”运算再“非”运算的电路。若输入的逻辑变量为A和B,则通过或非门输出的结果F可表示为: F=A∨B
6) 74LS138的逻辑关系
1.2 习题解答
1. 微处理器内部包含哪三大部分?
解:运算器、控制器和寄存器组。
2. 完成下列数制的转换
①10101101B=( )D=( )H
解:10101101B=173D=ADH。
②0.11B=( )D
解:0.11B=0.75D。
③211.25=( )B =( )H
解:211.25=11010011.01B=D3.4H。
④10111.0101B=( )H=( )BCD
解:10111.0101B=17.5H=(0001 0111.0101)BCD
3. 已知X=+1011010B,Y=–0011011B,设机器数为8位,分别写出X、Y的原码、反码和补码。 解:
?X?原?01011010B?Y?原?10011011B ?X?反?01011010B ?Y?反?11100100B
?X?补?01011010B?Y?补?11100101B4. 已知X的真值为32,Y的真值为–19,求?X?Y?补?? 解:?X?Y?补?00001101B
5. 已知X=51,Y=–86,用补码完成下列运算,并判断是否产生溢出(设字长为8位)。
① X+Y ② X-Y ③ –X+Y ④ –X-Y 解:
① 10100011B,因为C6?C7?0,所以未产生溢出。 ② 11110111B,因为C6?C7?1,所以产生溢出。
③ 01110111B,因为C6?C7?1,所以产生溢出。 ④ 00100011B,因为C6?C7?0,所以未产生溢出。
6. 若使与门的输出端输出高电平,则各输入端的状态是什么?
解:各输入端为高电平。
7. 若使与非门的输出端输出低电平,则各输入端的状态是什么?
解:各输入端为高电平。
8. 如果74LS138译码器的Y4端输出低电平,则C、B、A三个输入端的状态分别是什么?
解:C、B、A三个输入端的状态分别是‘1’,‘0’,‘0’。
第2章 8088/8086微处理器
2.1 知识要点
1. 8088与8086在硬件结构上的主要区别:
8086的外部数据总线宽度为16位,而8088的外部数据总线宽度为8位;另外8086的指令预取队列长度为6字节,而8088的指令预取队列长度为4字节。
2. 8088包含两大功能部件,即执行单元(EU,Execution Unit)和总线接口单元(BIU,Bus
Interface Unit)。
1) 执行单元EU主要完成指令的译码和执行。执行单元通过EU控制电路从BIU中取出
指令,经过指令译码形成各种定时控制信号,向EU内各功能部件发出相应的控制命令,以完成指令所规定的操作。
2) 总线接口单元是8086/8088同外部联系的接口。它负责所有涉及外部总线的操作,包
括取指令、读操作数、写操作数、地址转换和总线控制等。BIU内部设置指令预取队列,每当指令队列有两个或两个以上的字节空间,且执行单元未向BIU申请读/写存储器操作数时,BIU顺序地预取后续指令的代码,并填入指令队列中。当EU执行的是转移指令时,则BIU清除当前的指令预取队列的内容,从新的地址取回指令,并立即送到EU去执行,然后,从后续的指令序列中取回指令填满队列。
3. 8088地址线的宽度为20位,可寻址的最大内存空间为220=1MB。
4. 8088CPU对内存的管理:8088CPU内部的寄存器的宽度只有16位,如何把16位的二进制
数转换成20位物理地址?8088CPU采用将内存储器分段的方法来解决这一问题,即将1MB的地址空间分为16个64KB的段,然后用段基址加上段内偏移地址来访问存储器。
分段的具体方法是在分段时,要求段的起始单元的物理地址是16的整数倍,即XXXX0H。其中,把前16位(XXXXH)称为段基址,段内各存储单元地址相对于该段起始存储单元地址
的位移增量称为段内偏移量。
段基地址和段内偏移量称为逻辑地址,逻辑地址通常写成XXXXH :YYYYH的形式,其中XXXXH为段基址;YYYYH为段内偏移地址。物理地址与逻辑地址的关系如下: 物理地址=段基址×16+段内偏移
例如,逻辑地址A562H :9236H对应的物理地址是AE856H。
物理地址是机器硬件操作时所使用的地址;逻辑地址是应用人员在编程时所使用的地址。由逻辑地址形成物理地址是由总线接口部件中的电路实现的。 5. 8086/8088CPU内部的各寄存器的作用
AX、BX、CX和DX通用寄存器一般用于存放参与运算的数据或运算的结果。 SP:用于存放堆栈栈顶的段内偏移量。 BP:用于存放访问内存时的偏移地址。
SP和BP也可以用来存放数据,它们的默认段寄存器都是SS。
SI和DI通常在间接寻址方式中存放操作数的偏移地址。在串操作指令中,DI的默认段寄存器是ES。SI和DI也可以用来存放数据。
CS:代码段寄存器,用于存放代码段的段基址。 DS:数据段寄存器,用于存放数据段的段基址。 SS:堆栈段寄存器,用于存放堆栈段的段基址。 ES:附加段寄存器,用于存放附加段的段基址。
IP:指令指针寄存器,用于存放CPU即将执行的下一条指令在代码段中的段内偏移地址。 FLAGS:标志寄存器,用于存放指令执行结果的特征。 6. 8088CPU管脚在两种工作模式下的功能。 7. 8088CPU的读、写时序。
8. 8088有两种工作模式:最小模式和最大模式。如图2-1和图2-2所示。
+5VMN/MX8088CPU8284时钟发生器RES+5VCLKREADYRESETIO/MRDWRALESTB8282OESTB8282A15~A8OESTB8282A15~A8A19~A16A19~A16AD7~AD0OEA7~A0D0~D7DT/RDEN8286TOE图2-18088最大模式总线
MN/MXS0S1S28284时钟发生器+5VRES8088CPUA19~A8AD7~AD0CLKREADYRESET8288总线控制器CLKS0S1S2INTAMEMRMEMWIORIOWDENDT/RALESTB8282OE地址总线存储器I/O接口8286TOE数据总线
图2-2 8088最大模式下的总线
2.2 习题解答
1. 8086/8088CPU由哪两大功能部分所组成?简述它们的主要功能?
解:8086/8088CPU由EU和BIU两大功能部分组成。
执行单元EU主要完成指令的译码和执行。执行单元通过EU控制电路从BIU中取出指令,经过指令译码形成各种定时控制信号,向EU内各功能部件发出相应的控制命令,以完成指令所规定的操作。
总线接口单元是8086/8088同外部联系的接口。它负责所有涉及外部总线的操作,包括取指令、读操作数、写操作数、地址转换和总线控制等。BIU内部设置指令预取队列,每当指令队列有两个或两个以上的字节空间,且执行单元未向BIU申请读/写存储器操作数时,BIU顺序地预取后续指令的代码,并填入指令队列中。当EU执行的是转移指令时,则BIU清除当前的指令预取队列的内容,从新的地址取回指令,并立即送到EU去执行,然后,从后续的指令序列中取回指令填满队列。
2. 什么是指令流水线?指令流水线需要哪些硬件支持?
解:指令流水线是指8086/8088CPU内部的执行单元EU和总线接口单元BIU通过指令预取队列协同工作从而实现指令的并行执行。指令流水线最主要的硬件支持是BIU内部的指令预取队列。
3. 逻辑地址如何转换成物理地址?已知逻辑地址为2D1EH:35B8H,对应的物理地址是什么? 解:逻辑地址是段基址和段内偏移地址形式的地址。 物理地址=段基址×16+段内偏移
已知逻辑地址为2D1EH:35B8H,则对应的物理地址?2D1EH?16?35B8H?30798H 4. 8088和8086的指令预取队列的长度分别是多少?
解:8088的指令预取队列的长度为4字节;8086的指令预取队列的长度为6字节。
5. 简述8086/8088CPU内部的各寄存器的作用。
解:AX、BX、CX和DX通用寄存器一般用于存放参与运算的数据或运算的结果。 SP:用于存放堆栈栈顶的段内偏移量。 BP:用于存放访问内存时的偏移地址。 SP和BP也可以用来存放数据,它们的默认段寄存器都是SS。
SI和DI通常在间接寻址方式中存放操作数的偏移地址。在串操作指令中,DI的默认段寄存器是ES。SI和DI也可以用来存放数据。
CS:代码段寄存器,用于存放代码段的段基址。 DS:数据段寄存器,用于存放数据段的段基址。 SS:堆栈段寄存器,用于存放堆栈段的段基址。 ES:附加段寄存器,用于存放附加段的段基址。
IP:指令指针寄存器,用于存放CPU即将执行的下一条指令在代码段中的段内偏移地址。 FLAGS:标志寄存器,用于存放指令执行结果的特征。
6. 8086/8088CPU内部的状态标志寄存器共有几位标志位?各位的含义是什么?
解:状态标志寄存器共有9位标志位,其中包含6个状态标志位和3个控制标志位。
状态标志位: CF(Carry Flag):进位标志。当算术运算结果使最高位产生进位或借位时,则CF=1;否则CF=0。
PF(Parity Flag):奇偶标志。若运算结果中的低8位含有偶数个1,则PF=1;否则PF=0。 AF(Auxiliary carry Flag):辅助进位标志。运算过程中若D3位向D4有进位或借位时,AF=1;否则AF=0。 ZF(Zero Flag):零标志。若运算结果为0,则ZF=1;否则ZF=0。 SF(Sign Flag):符号标志。若运算结果为负,则SF=1;否则SF=0。 OF(Overflow Flag):溢出标志。当带符号数的补码运算结果超出机器所能表达的范围时,就会产生溢出,这时OF=1;否则OF=0。 控制标志位:
DF(Direction Flag):方向标志。控制串操作指令的地址变化的方向。当DF=0时,串操作指令的地址指针按增量变化;当DF=1时,串操作指令的地址指针按减量变化。 IF(Interrupt Flag):中断允许标志。控制微处理器是否允许响应可屏蔽中断请求。若IF=1,则允许响应;否则禁止响应。 TF(Trap Flag):单步标志。TF=1时,CPU工作在单步方式。
7. 8086/8088系统中存储器的分段原则是什么?
解:分段原则是要求段的起始单元的物理地址是16的整数倍,每段的物理长度为64KB。
8. 当ALE有效时,8088的地址/数据总线上将出现什么信息?
解:当ALE有效时,8088的地址/数据总线上将出现地址信息。
9. READY管脚的作用是什么?
解:READY用于微处理器时序中插入等待状态。若该引脚被置为低电平,则微处理器进入等待状态并保持空闲;若该引脚被置为高电平,则它对微处理器的操作不产生影响。 CPU在读、写操作时序中的T3时钟周期开始处,通过检测READY管脚的状态来决定是否插入TW等待时钟周期,以解决CPU与存储器或I/O接口之间速度不匹配的矛盾。
10. 为什么在基于8086/8088的系统中经常需要使用缓冲器?
解:由于基于8086/8088的系统驱动能力的不足,需要使用缓冲器。
11. 8088工作在最小模式下包含哪些控制信号?
解:最小模式下包含的控制信号有: RD、WR、IO/M、ALE、DT/R、DEN和INTA等信号。
12. 若CS=4000H,则当前代码段可寻址的存储空间范围是多少?
解:CS=4000H时,当前代码段可寻址的存储空间范围为40000H~4FFFFH。
第3章 8088/8086指令系统
3.1 知识要点
汇编语言是一种符号语言。用汇编语言编制的程序称为汇编语言源程序,计算机不能直接识别执行,必须翻译成机器语言程序。
一条指令一般由操作码和操作数两部分组成。操作码详细地说明指令要执行的操作,操作数是指令执行时需要的数据。8086CPU指令的操作数有三种类型:立即数、寄存器操作数和存储器操作数
1. 8086CPU寻址方式
寻址方式,即获得地址的方法,主要指获得指令中操作数地址的方法,即段内偏移地址的方法。
1) 2) 3) 4) 5)
立即寻址:操作数是立即数
直接寻址:操作数在内存中,指令中直接给出操作数所在的内存单元的偏移地址。 寄存器寻址:操作数在CPU内部的寄存器中。
寄存器间接寻址:操作数在内存中,内存单元的偏移地址存放在寄存器中。
寄存器相对寻址:操作数在内存中,内存单元的偏移地址一部分由间接寻址寄存器提供,一部分是指令给定的8位或16位地址位移量,二者相加形成操作数的有效地址。
6) 基址变址寻址:操作数在内存中,基址寄存器和变址寄存器相加作为操作数的偏移地址。 7) 基址变址相对寻址:操作数在内存中,操作数的地址由基址寄存器加上变址寄存器再加上
地址位移量构成。
8) 隐含寻址:操作码隐含地指明操作数的地址 2. 8086指令系统 指令类型 一般数据传送 数 输入输出指令 据 传 地址传送指令 送 标志传送指令 加法指令 算 减法指令 术 乘法指令 运 除法指令 算 十进制调整指令 逻辑运算和移位指令 串操作 控制转移指令 处理器控制指令
助记符 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 LOOK NOP 3.2 习题解答
1.
什么叫寻址方式?8086指令系统中有哪几种寻址方式?
解:寻址方式,即获得地址的方法,主要指获得段内偏移地址的方法。寻址方式共有8种:立即寻址、直接寻址、 寄存器寻址、 寄存器间接寻址、 寄存器相对寻址、 基址变址寻址、 基址变址相对寻址、 隐含寻址。
2. 下列指令中BUFF为字节类型变量,DATA为常量,指出下列指令中源操作数的寻址方式:
(1)MOV AX, 1200 (6)MOV BL, [SI][BX] (2)MOV AL, BUFF (7)MOV [DI], AX (3)SUB BX, [2000H] (8)ADD AX, DATA[DI+BP] (4)MOV CX, [SI] (9)PUSHF (5)MOV DX, DATA[SI] (10)MOV BX, ES:[SI]
解:(1)MOV AX, 1200 ;立即寻址 (2)MOV AL, BUFF ;直接寻址 (3)SUB BX, [2000H] ;直接寻址 (4)MOV CX, [SI] ;寄存器间接寻址 (5)MOV DX, DATA[SI] ;寄存器相对寻址 (6)MOV BL, [SI][BX] ;基址变址寻址 (7)MOV [DI], AX ;寄存器寻址 (8)ADD AX, DATA[DI+BP] ;基址变址相对寻址 (9)PUSHF ;隐含寻址 (10)MOV BX, ES:[SI] ;寄存器间接寻址
3. 指出下列指令的错误并改正。
(1)MOV DS, 1200 (2)MOV AL, BX (3)SUB 33H, AL (4)PUSH AL (5)MUL 45H
(6)MOV [BX], [SI]
(7)MOVS BYTE PTRDS:[DI], BYTE PTR DS:[SI] (8)ADD DATA[DI+BP], ES:[CX] (9)JMP BYTE PTR[SI] (10)OUT 3F8H, AL
解:(1)MOV DS, 1200 ;不能用立即数给段基址寄存器赋值 可改为两条指令:MOV AX, 1200 MOV DS, AX (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)MUL 45H ;乘法指令中的操作数不能是立即数 可改为两条指令:MOV BL, 45H
MUL BL
(6)MOV [BX], [SI] ;源和目的操作数不能同时为内存操作数 可改为两条指令:MOV AX, [SI]
MOV [BX], AX
(7)MOVS BYTE PTRDS:[DI], BYTE PTR DS:[SI] ;目的操作数应该在ES段。 可改为:MOVS BYTE PTR ES:[DI], BYTE PTR DS:[SI]
(8)ADD DATA[DI+BP], ES:[CX] ;CX不能做间址寄存器使用 可改为:ADD DATA[DI+BP], CX (9)JMP BYTE PTR[SI] ;操作数必须是字类型 可改为:JMP WORD PTR[SI] (10)OUT 3F8H, AL ;16位的端口地址不能直接在输入输出指令中使用。 可改为两条指令:MOV DX, 3F8H OUT DX, AL 4.
根据要求写出一条(或几条)汇编语言指令。 (1)将立即数4000H送入寄存器BX。 (2)将立即数4000H送入段寄存器DS。
(3)将变址寄存器DI的内容送入数据段中2000H的存储单元。 (4)把数据段中2000H存储单元的内容送段寄存器ES。 (5)将立即数3DH与AL相加,结果送回AL。 (6)把BX与CX寄存器内容相加,结果送入BX。
(7)寄存器BX中的低4位内容保持不变,其他位按位取反,结果仍在BX中。 (8)实现AX与-128的乘积运算。
(9)实现CX中高、低8位内容的交换。
(10)将DX中D0、D4、D8位置1,其余位保持不变。 解:(1)将立即数4000H送入寄存器BX。
MOV BX,4000H
(2)将立即数4000H送入段寄存器DS。
MOV AX, 4000H MOV DS, AX
(3)将变址寄存器DI的内容送入数据段中2000H的存储单元。
MOV [2000H],DI
(4)把数据段中2000H存储单元的内容送段寄存器ES。
MOV AX,[2000H] MOV ES,AX
(5)将立即数3DH与AL相加,结果送回AL。
ADD AL,3DH
(6)把BX与CX寄存器内容相加,结果送入BX。
ADD BX,CX
(7)寄存器BX中的低4位内容保持不变,其他位按位取反,结果仍在BX中。
MOV AX, BX, NOT AX
AND AX,0FFF0H AND BX,000FH OR BX,AX
(8)实现AX与-128的乘积运算。
MOV BX,-128 IMUL AX,BX
(9)实现CX中高、低8位内容的交换。
MOV AL,8 ROL CX AL
(10)将DX中D0、D4、D8位置1,其余位保持不变。
0R DX,0111H
5. 设SS=2000H,SP=1000H,SI=2300,DI=7800,BX=9A00H。说明执行下面每条指令时,堆栈内容的变化和堆栈指针的值。
PUSH SI PUSH DI POP BX
解:PUSH SI之后:
(0FFFH)=23H (0FFEH)=00H SP=0FFEH
PUSH DI 之后: (0FFDH)=78H (0FFCH)=00H SP=0FFCH
POP BX 之后: BX=7800H SP=0FFEH
6. 内存中18FC0H、18FC1H、18FC2H单元的内容分别为23H、55、5AH,DS=1000H,BX=8FC0H,SI=1,执行下面两条指令后AX=?DX=?
MOV AX, [BX+SI]
LEA DX, [BX+SI]
解:AX=5A55H
DX=8FC1H
7. 回答下列问题:
(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
8. 执行以下两条指令后,FLAGS的6个状态标志位的值是什么?
MOV AX, 847BH ADD AX, 9438H
解:CF=1 PF=0 AF=1 ZF=0 SF=0 OF=1
9. 下面程序段将03E8H转换成十进制数并显示,填写指令后的空格。
MOV AX, 03E8H ;AH= 03H , AL= E8H MOV CX, 4
MOV DI, 2000H ;DI= 2000H MOV BX, 10 ;BH= 00 , BL= 0AH GO0: SUB DX, DX ;CF= 0 , ZF= 1
DIV BX ;AX= 64H , DX= 0 MOV [DI], DL ;[DI]= 0 INC DI
LOOP GO0 ;CX= 3 MOV CX, 4 GO1: DEC DI ;DI= 2003H
MOV DL, [DI] ;DL=01 OR DL, 30H ;DL= 31H
MOV AH, 02 ;显示1位十进制数1 INT 21H
LOOP GO1
10. 用串操作指令替换以下程序段:
ABC:MOV AL, [SI] MOV ES:[DI], AL INC SI INC DI LOOP ABC 解:REP MOVSB
11. 设AX=AAH,顺序执行下列各条指令,填写空格。
(1)XOR AX, 0FFFFH ;AX= (2)AND AX, 13A0H ;AX= (3)OR AX, 25C9H ;AX= (4)TEST AX, 0004H ;AX= 解:(1)XOR AX, 0FFFFH ;AX= FF55H (2)AND AX, 13A0H ;AX= 00A0H (3)OR AX, 25C9H ;AX= 25EBH (4)TEST AX, 0004H ;AX= 00AAH
12. 试写出执行下列3条指令后BX寄存器的内容。
MOV CL,2H
MOV BX,CO2DH SHR BX,CL
解: BX=300BH
13. 执行下列程序段后,AX、BX的内容各是什么?
(1)MOV AX,0001H
MOV BX,8000H NEG AX MOV CX,4 AA:SHL AX,1 RCL BX,1 LOOP AA HLT
解:AX=FFF0H BX=000FH
(2)MOV AX,0 MOV BX,1 MOV CX,100 A: ADD AX,BX
INC BX LOOP A HLT
解:AX=8080H BX=0101H
14. 编写程序段,实现下述要求:
(1) 使AX寄存器的低4位清0,其余位不变。 (2) 使BX寄存器的低4位置1,其余位不变。
(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: .......
15. 编写程序段,完成把AX中的16进制数转换为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
SHR AX,CL ;准备取下一个数 POP CX LOOP CC
16. 编写程序段,求从TABLE开始的10个无符号数的和,结果放在SUM单元中。
解:
NEXT:
LEA SI,TABLE
MOV CX,10 XOR AX,AX ADD AL,[SI] ADC AH,0 INC SI
LOOP NEXT MOV SUM,AX
17. 编写程序段,从键盘上输入字符串‘HELLO’,并在串尾加结束标志‘$’。
解:LEA DX,STRING ;设置字符串存放缓冲区首地址 MOV AH ,0AH ;调用10号功能,输入字符串 INT 21H
MOV CL,STRING+l ;实际键入的字符个数送CL XOR CH,CH
ADD DX, 2
ADD DX,CX ;得到字符串尾地址 MOV BX,DX MOV BYTE PTR[BX],'$'
18. 编写程序段,在屏幕上依次显示1、2、3、A、B、C。
解: LEA BX,STR MOV CX,6 LPP: MOV AH,2 MOV DL,[BX] INC BX INT 21H LOOP LPP
;STR为6个字符的存放区域首地址
;利用2号功能调用依次先生6个字符
19. 编写程序段,在屏幕上显示字符串“Hello World”。
解: LEA DX,STRING ; STRING字符的存放区域首地址 MOV AH,09H INT 21H ; 利用9号功能调用显示字符串
20. 编写程序段,把内存中首地址为MEM1的200个字节送到首地址为MEM2的区域。
解:MOV AX,SEG MEM1
MOV DS,AX ;设定源串段地址 MOV AX,SEG MEM2 MOV ES,AX ;设定目标串段地址 MOV SI,0 ;设定源串偏移地址 MOV DI,0 ;设定目标串偏移地址
MOV CX,200 ;串长度送CX CLD ;(DF)=0,使地址指针按增量方向修改 REP MOVSB ;每次传送一个字节,并自动 HLT
21. 编写程序段,以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
第4章 汇编语言及其程序设计
4.1 知识要点
用汇编语言编写的程序称为汇编语言源程序。汇编语言源程序必须经过具有“翻译”功能的系统程序的处理。汇编程序(Assembler)就是处理汇编语言源程序的系统程序,处理的过程称为汇编。源程序经过汇编生成机器语言目标程序,简称目标程序。目标程序经过连接程序连接,就得到可执行文件。
汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。一个程序一般定义三个段:数据段、堆栈段和代码段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代码段。
源程序中的语句有两种:指示性语句和指令性语句。指令性语句是可执行语句,是8088/8086CPU可以执行的的指令。
汇编语言语句中的操作数可以是寄存器、存储器单元、常量、变量、名字、标号和表达式。
1. 伪指令
汇编语言中的指示性语句也称为伪指令。伪指令的作用是告诉汇编程序如何对汇编语言源程序进行汇编,比如如何分段、程序处理的数据在哪里,子程序在哪等等。伪指令由汇编程序处理,不生成目标代码,不参与程序的执行。
1) 段定义伪指令SEGMENT和ENDS 2) ASSUME伪指令
3) 数据定义伪指令也称为变量定义伪指令,或存储单元分配伪指令。它用来定义
变量、确定变量的类型、给变量赋初值、为变量分配存储空间等。 4) 符号定义伪指令也称为赋值伪指令。在程序中有时会多次出现同一个数值或表
达式,通常可以用赋值伪指令将其赋给一个符号,程序中凡是用到该数值或表达式的地方都用这个符号代替,这样既提高了程序的可读性又使程序易于修改。有2条符号定义伪指令:EQU和= 5) 过程定义伪指令也称为子程序定义伪指令。在程序中常常有一些功能相对独立
的程序段重复出现,通常将它定义为过程或称为子程序,在程序中需要这种功能时只要使用调用命令CALL调用它就可以了。
6) 程序结束伪指令告诉汇编程序MASM源程序到此结束,并附带说明程序从哪
开始执行。
2. DOS系统功能调用
DOS操作系统为用户提供的系统功能调用有两种,一种称为BIOS功能调用,也叫低级调用,调用它们可以驱动磁盘、控制显示器输出、驱动打印机和管理时钟;另一种称为DOS功能调用,也叫高级调用,调用它们可以管理内存、管理设备、管理文件和目录。8088/8086微机系统中21H号中断被称为DOS系统功能调用,它的内部提供了八十多个功能子程序,可以实现字符输入、字符显示和打印、磁盘读写、文件建立打开关闭、文件读写等功能,基本上满足了普通程序员的编程需要。为了调用方便,系统对这些功能子程序顺序编号,称为功能号。调用的步骤如下:
① 把要调用的功能号送AH寄存器 ② 根据调用要求设置入口参数 ③ INT 21H
3. 汇编语言程序设计基础 顺序结构是最基本、最简单的程序结构。程序中的指令从开始到结束一条接一条顺序执行,没有分支也没有循环,指令的存储顺序与执行顺序一致。顺序程序只能实现相对简单的功能。
分支程序:根据条件是否成立执行不同程序段的程序结构称为分支程序。分支程序结构又分为简单分支结构和多分支结构两种形式。
一般用条件转移指令实现简单分支程序设计。汇编语言语句功能简单,多分支程序是简单分支的嵌套。
循环程序设计:循环程序结构由循环初始化、循环体和循环控制三部分组成。程序在循环控制下重复执行循环体,使计算机完成一系列的重复操作。循环程序结构有两种:先执行后判断和先判断后执行。
① 循环初始化,用来设置循环初始值,包括设置循环计数器初值、设置地址指针首地址和初始数据等。
② 循环体,是循环的主体,包括循环要完成的具体操作和修改循环参数,如地址指针修改、计数值的修改。
③循环控制,测试循环条件,判断是否继续循环,使循环能在有限的次数后结束。在循环次数确定的情况下,可用循环次数作为控制条件,这时常用LOOP指令实现控制循环。
过程又称为子程序。子程序使程序结构模块化,程序更加清晰、易读易懂。如果在一个
程序的多个地方或多个程序中都用到相同功能的程序段,这时常采用子程序设计方法。
4.2 习题解答
1. 什么叫汇编?汇编语言源程序的处理过程是什么?
解:任何CPU都只能执行机器语言程序。汇编语言不是机器语言,汇编语言程序必须通过具有“翻译”功能的系统程序的处理,处理的过程称为汇编。
汇编语言源程序经过汇编生成机器语言目标程序,简称目标程序。目标程序经过连接程序连接,就得到可执行的机器语言程序文件。
2. 汇编语言的语句类型有哪些?各有什么特点?
解:汇编语言的语句类型有两种:指示性语句和指令性语句。指示性语句可以位于任何段中,指令性语句必须位于代码段内。
? 指示性语句
又称为伪操作语句,它不是8088/8086CPU的指令,它与汇编程序(assembler)有关。指示性语句的功能主要是变量定义、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。源程序汇编后指示性语句不生成目标代码,所以常被称为伪指令。
? 指令性语句
指令性语句是可执行语句,是8088/8086CPU的指令。源程序汇编后指令性语句生成目标代码。第3章中介绍的所有指令都是指令性语句的主体,其操作数最多只能有两个。
3. 汇编语言源程序的基本结构是什么?
解:汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。一个程序一般定义三个段:数据段、堆栈段和代码段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代码段。
4. 写出完成下述要求的变量定义的语句:
(1) 为缓冲区BUFF保留200个字节的内存空间 (2) 将字符串’BYTE’,’WORD’存放于某数据区
(3) 在数据区中存入下列5个数据:2040H,0300H,10H,0020H,1048H
解:
(1)为缓冲区BUFF保留200个字节的内存空间
BUFF DB 200DUP(?)
(2)将字符串’BYTE’,’WORD’存放于某数据区
DB ‘BYTE’,’WORD’
(3)在数据区中存入下列5个数据:2040H,0300H,10H,0020H,1048H
DW 2040H,0300H,10H,0020H,1048H
5. 画出下面数据段汇编后的内存图,并标出变量的位置。
DATA SEGMENT AA EQU 78H
AA0 DB 09H,-2,45H,2 DUP(01H, ?),’AB’ AA1 DW -2,34H+AA AA2 DD 12H DATA ENDS
解:如图4-1所示。
6. 设程序中的数据定义如下:
NAME DB 30 DUP(?) LIST DB 1,7,8,3,2
ADDR DW 30 DUP(?)
(1) 取NAME的偏移地址放入SI (2) 取LIST的前两个字节存入AX (3) 取LIST实际长度
解:(1)取NAME的偏移地址放入SI
MOV SI,OFFSET NAME
(2)取LIST的前两个字节存入AX
MOV AX,WORD PTR [LIST]
(3)取LIST实际长度
MOV AX,SIZE LIST
AA009HFEH45H01H?01H?41H42HAA1FEHFFHACH00HAA012H00H00H00H图4-1
7. 依据下列指示性语句,求表达式的值。 SHOW0 EQU 200 SHOW1 EQU 15 SHOW2 EQU 2 ⑴ SHOW0X100+55 ⑵ SHOW0 AND SHOW1-15 ⑶ (SHOW0/SHOW2)MODSHOW1 ⑷ SHOW1OR SHOW0 解:(1)SHOW0X100+55=200X100+55
⑵ SHOW0 AND SHOW1-15=C8AND0F-0F=-7
⑶ (SHOW0/SHOW2)MODSHOW1=100MOD15=10 ⑷ SHOW1OR SHOW0=0FORC8=CF
8. 编写程序,统计寄存器BX中二进制位“1”的个数,结果存在AL中。
DATA SEGMENT NUM X DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX
MOV AL,0
MOV BX,NUM ;把数X传送给BX MOV CX,16
NEXT: SHL AX,1
JNC NEXT1 INC AL
NEXT1: LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
9. 某数据块存放在BUFFER开始的100个字节单元中,试编写程序统计数据块
中正数(不包括0)的个数,并将统计的结果存放到NUMBER单元中。
解:DATA SEGMENT
BUFFER DB 100(?) DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX XOR DX, DX
MOV CX,100 MOV SI,OFFSET BUFFER NEXT: MOV AL,[SI] INC SI TEST AL,80H ;是正数吗? JNZ GOON ;否,转移到GOON CMP AL,0 JZ GOON
INC DX
GOON: LOOP NEXT MOV NUMBER,DX
MOV AH,4CH INT 21H
CODE ENDS
END START
10. 阅读下面程序段,指出它的功能。 DATA SEGMENT
ASCII DB 30H, 31H, 32H, 33H ,34H ,35H, 36H, 37H, 38H, 39H HEX DB 04H DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA
解:这是一个查表程序,查表取出HEX中的ASCII。
11. 某数据区中有100个小写字母,编程把它们转换成大写字母,并在屏幕上显示。
解:DATA SEGMENT
BUFFER DB 100(?) DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX
MOV CX,100 MOV SI,OFFSET BUFFER NEXT: MOV AL,[SI] INC SI CMP AL,61H ;是小写字母吗? JB GOON ;否,转移到GOON SUB AL,20H MOV DL,AL MOV AH,2 INT 21H
GOON: LOOP NEXT MOV AH,4CH
INT 21H
CODE ENDS END START
12. 子程序的参数传递有哪些方法?
解:
主程序在调用子程序时,要为子程序预置数据,在子程序返回时给出数据处理的结果,这称为数据传送或变量传送。方法主要有以下几种:
START: MOV AX, DATA
MOV DS, AX
MOV BX,OFFSET ASCII MOV AL,HEX AND AL,0FH ADD BX,AL MOV AL,[BX] MOV DL,AL MOV AH,2 INT 21H
MOV AH,4CH INT 21H
CODE ENDS END START
① 寄存器传送。 ② 地址表传送,需要传送的参数较多时可以利用存储单元传送。在调用子程序前,把所有参数依次送入地址表,然后将地址表的首地址作为子程序入口参数传递给子程序。
③ 堆栈传送,这种方式要审慎注意堆栈的变化情况。
13. 过程定义的一般格式是什么?子程序开始处为什么常用PUSH指令?返回前
用POP指令?
解:过程定义的一般格式请参照《微机原理与接口技术》中的第100页的“4.4.5过程设计”一节。
如果一个子程序被多次调用,保护与恢复(主程序)现场就非常重要。主程序每次调用子程序时,主程序的现场不会相同,保护与恢复现场的工作就只能在子程序中进行。原则上,在子程序中,首先把子程序中要用到的寄存器、存储单元、状态标志等压入堆栈或存入特定空间中,然后子程序才可以使用它们,使用完后再将它们弹出堆栈或从特定空间中取出,恢复它们原来的值,即恢复主程序现场。保护和恢复现场常使用PUSH和POP指令。
14. 阅读下面程序段,指出它的功能。右图说明程序执行过程中堆栈的变化情况。
DATA SEGMENT
STRING DB ‘Exxperience?’ LENG DW 100 KEY DB ‘x’ DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA MAIN PROC FAR
START:MOV AX, DATA MOV DS, AX MOV ES, AX LEA BX, STRING LEA CX, LENG PUSH BX DI- PUSH CX DI+ MOV AL, KEY SI+ CALL DELCHAR SP->BP BP- MOV AH, 4CH BP+ INT21H IP- MAIN ENDP
IP+ DELCHAR PROC
[BP+4]->SI CL PUSH BP
CH MOV BP, SP
[BP+6]->DI BL PUSH SI
BH PUSH DI CLD MOV SI, [BP+4] MOV CX, [SI] MOV DI, [BP+6]
REPNE SCASB JNE DONE MOV SI, [BP+4] DEC WORD PTR[SI] MOV SI, DI DEC DI REP MOVSB DONE: POP DI POP SI POP BP RET DELCHAR ENDP CODE ENDS END START
解:从字符串中删去多余的X字符。
15. 显示两位压缩BCD码值(0~99),要求不显示前导0。
解:DATA SEGMENT
BUF DB ? ; 内存中的两位压缩BCD码 DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX
MOV AL, BUF MOV BL,AL NEXT: MOV CL,4
SHR AL, CL AND AL,0FH CMP AL,0 JZ GOON ADD AL,30H ;显示高位BCD码 MOV DL,AL
MOV AH,2 INT 21H GOON: MOV AL,BL AND AL,0FH
ADD AL,30H ;显示低位BCD码 MOV DL,AL
MOV AH,2 INT 21H
MOV AH,4CH INT 21H
CODE ENDS
END START
16. 某数据区中连续存放着100个整数,要求将其中为0的元素删除,并将保留的
数据连续存放。
解:
DATA SEGMENT STRING DB 100(?) LENG DW 100 KEY DB 0 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA MAIN PROC FAR
START:MOV AX, DATA MOV DS, AX MOV ES, AX LEA BX, STRING LEA CX, LENG PUSH BX PUSH CX MOV AL, KEY CALL DELCHAR MOV AH, 4CH INT21H MAIN ENDP
DELCHAR PROC PUSH BP MOV BP, SP PUSH SI PUSH DI CLD MOV SI, [BP+4] MOV CX, [SI] MOV DI, [BP+6] REPNE SCASB JNE DONE
MOV SI, [BP+4] DEC WORD PTR[SI] MOV SI, DI DEC DI REP MOVSB DONE: POP DI POP SI POP BP RET
DELCHAR ENDP CODE ENDS END START
17. 编程,把以DATA为首址的两个连续单元中的16位无符号数乘以10。
解:DATA SEGMENT
BUFFER DB A3H,27H DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX LEA SI,BUFFER
MOV AX,[SI] SHL AX,1 MOV BX,AX MOV CL,3 MOV AX,[SI] SHL AX,CL ADD AX,BX MOV BUFFER,AL MOV BUFFER+1,AH
MOV AH,4CH INT 21H
CODE ENDS
END START
18. 编程,比较两个字串是否相同,并找出其中第一个不相等字符的地址,将该地
址送BX,不相等的字符送AL。两个字符串的长度均为200个字节,M1为源串首地址,M2为目标串首地址。
解:DATA SEGMENT
M1 DB 100DUP(?) DATA ENDS
EDATA SEGMENT
M2 DB 100DUP(?) EDATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ,ES:EDATA START: MOV AX,DATA
MOV DS,AX
MOV AX,EDATA MOV ES,AX LEA SI,M1 ;(SI)←源串首地址
LEA DI,M2 ;(DI)←目标串首地址
STOP:
MOV CX,200 ;(CX)←串长度 CLD ;(DF)=0,使地址指针按增量方向修改 REPE CMPSB ;若相等则重复比较 AND CX,0FFFFH ;检查(CX)是否等于零 JZ STOP ;(CX)=0则转STOP DEC SI ;(SI)-1,指向不相等单元 MOV BX,SI ;(BX)←不相等单元的地址 MOV AL,[SI] ;(AL)←不相等单元的内容 MOV AH,4CH INT 21H
CODE ENDS
END START 19. 编程,在内存的数据段中存放了100个8位带符号数,其首地址为TABLE,
试统计其中正元素、负元素、和零元素的个数,并分别将个数存入PLUS,MINUS,ZERO等3个单元中;
解:DATA SEGMENT
TABLE DB 100DUP(?) DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX XOR AL,AL
MOV PLUS,AL MOV MINUS,AL MOV ZERO,AL LEA SI,TABLE MOV CX,100 CLD CHECK:LODSB OR AL,AL JS X1 JZ X2 INC PLUS JMP NEXT
X1: INC MINUS JMP NEXT
X2: INC ZERO NEXT: LOOP CHECK
MOV AH,4CH INT 21H CODE ENDS
END START
20. 编程,在数据段DATA1开始的80个连续的存储单元中,存放80位同学某门
课程的考试成绩(0~100)。编写程序统计成绩≥90分的人数,80~89分的人数,70~79分的人数,60~69分以及<60分的人数。将结果存放到DATA2开始的存储单元中。
解:DATA SEGMENT
DATA1 DB 80 DUP(?) ;假定学生成绩已放入这80个单元中 DATA2 DB 5 DUP(0) ;统计结果的存放单元 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV CX,80 ;统计80个学生的成绩
LEA SI,DATA1 LEA DI,DATA2
AGAIN: MOV AL,[SI] CMP AL,90 ;与90比较
JC NEXT1 ;小于90分,转NEXT1 INC BYTE PTR [DI] ;否则90分以上的人数加1 JMP STO ;转循环控制处理 NEXT1: CMP AL,80 ;与80比较 JC NEXT2 ;小于80分,转NEXT2
INC BYTE PTR[DI+1] ;否则80分以上的人数加1 JMP STO
NEXT2: CMP AL,70 ;与70比较 JC NEXT3 ;小于70分,转NEXT3 INC BYTE PTR [DI+2] ;否则70分以上的人数加1
JMP STO
NEXT3: CMP AL,60 ;与60比较 JC NEXT4 ;小于60分,转NEXT4
INC BYTE PTR [DI+3] ;否则60分以上的人数加1 JMP STO ;转循环控制处理 NEXT4 NEXT4: INC BYTE PTR [DI+4] ;60分以下的人数加1 STO: INC SI ;指向下一个学生成绩 LOOP AGAIN ;循环,直到所有成绩都统计完 MOV AH,4CH ;返回DOS INT 21H CODE ENDS
END START
4.3 汇编语言程序设计实验
说明:本书介绍的所有实验都是在“LAB8000改进型伟福通用微控制器仿真实验系统”上完成的。
实验1 显示字符实验
一、实验目的
通过实验掌握下列知识:
1. 了解汇编语言程序的运行环境和所需的系统程序;
2. 熟悉在宏汇编程序MASM环境下,对源程序进行编辑、汇编、连接、运行。
3. 掌握常用的DEBUG命令。进一步熟练用DEBUG对源程序进行动态调试,掌握一些常用的调试命令和方法。
二、实验内容
在屏幕上显示一条'THIS IS A SAMPLE PROGRAM OF KEYBOARD AND DISPLAY'提示信息,如从键盘上输入ESC键,则结束程序,如输入的是小写字母,则在显示器上显示出来,如输入的是大写字母,则转换为小写字母输出。
三、实验步骤
实验软件环境: 编辑程序 EDIT或其它编辑程序
汇编程序 MASM.EXE 6.1X 连接程序 LINK.EXE 调试程序 DEBUG.COM 实验步骤:
1. 用文字编辑工具(常用EDIT或记事本)将源程序输入,保存时注意其扩展名应为.ASM,
文件应该存储在宏汇编程序MASM的路径下,文件名采用8.3结构,不能包含汉字。 2. 用宏汇编程序MASM对源文件进行汇编,产生.OBJ文件和.LST文件。若汇编时提示有错,
用文字编辑工具修改源程序后重新汇编,直至通过。设第一步中在磁盘上已建立了一个EXAMPLE.ASM源程序,操作如下所示: C:>MASM↙
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved. Source filename [.ASM]:EXAMPLE↙ Object filename [EXAMPLE.OBJ]: ↙ Source listing [NUL.LST]:EXAMPLE↙ Cross reference [NUL.CRF]:EXAMPLE↙ Warning Severe Errors Errors 0 0 C:>
汇编程序MASM需要和用户进行上述相关信息交互,以便进行汇编、生成相应的文件。包括:
? 提示用户输入需要汇编的源程序名;
? 提示用户输入要建立的目标文件名,若采用默认文件名,则可直接按回车; ? 询问用户是否要建立汇编列表文件,若要,则打入文件名,否则按回车; ? 询问用户是否要建立交叉索引文件,若要,则打入文件名,否则按回车。 注意:
仅当屏幕上显示无错误时(警告错误为“0”,严重错误为“0”),才可进行下一步操作,否则要根据提供源程序的错误行号和错误性质,重新对源程序进行修改、编辑和汇编。 3. 查看.LST文件。
4. 用LINK将.OBJ文件连接成可执行的.EXE文件。
在DOS提示符下,打入LINK命令,对目标文件进行连接,产生可执行的EXE文件。操作如下所示:
C:> LINK
Microsoft (R) Overlay Linker Version 3.60
Copyright (C) Microsoft Corp 1983-1987. All rights reserved. Object Modules [.OBJ]: EXAMPLE↙ Run File [EXAMPLE.EXE]: ↙ List File [NUL.MAP]: ↙ Libraries [.LIB]: ↙ Warning: No STACK segment There was 1 error detected. C:>
连接程序Link需要和用户进行上述相关信息交互,以便连接和生成相应的文件。包括:
? 提示用户输入需要连接的目标模块名;
? 提示用户输入要建立的可执行文件名,若采用默认文件名,则直接按回车; ? 询问用户是否要建立地址分配文件,若要,则打入文件名,否则按回车; ? 询问用户是否用到库文件,如果用户自己建立了库文件,则键入库文件名,
否则按回车。
连接程序在连接过程发现有错,则会显示出错信息,用户应重新调用编辑程序对源程序进行修改,然后重新汇编、连接、直至无错。但连接程序给出的无堆栈段的警告性错误并不影响程序的执行,所以,到此为止,连接过程已经结束,生成了有效的可执行程序。 5. 在命令窗口下运行.EXE文件。即在屏幕上显示标题并提示你按键。每按一键在屏幕上显
示二个相同的字符,但大写字母被改成小写。按ESC键可返回系统。若未出现预期结果,用DEBUG检查调试程序。
使用“LAB8000改进型伟福通用微控制器仿真实验系统”完成实验的步骤:
1. 打开伟福软件模拟器,如图4-2所示。
图4-2 伟福软件模拟器
2. 设置仿真器,如图4-3所示。
图4-3 设置仿真器
3. 编辑程序。在文件菜单中单击“新建”命令,输入源程序,保存。如图4-4所示
图4-4 编辑程序
4.
编译连接,如图4-5所示。利用“项目”菜单中的编译命令编译源程序,编译通过时,左下角的Message窗口中显示的编译信息都打上对号,如果有一个叉就说明编译没通过。编译没通过时,编译信息提示有哪些指令不合法,对其修改,然后再编译。
图4-5 编译通过
图4-6 和4-7查看机器码。
图4-6 设置显示CPU窗口
图4-7 查看机器码
5. 执行
可以全速执行也可以单步执行,即一条一条地执行,这样可以观察每条指令执行后寄存器以及相关内存单元的内容是否符合预期。通常用这种方式调试程序。如图4-8所示。
图4-8 执行方式
反复按F8键,程序一条一条地执行,左边的SFR窗口显示每条指令执行后CPU各寄存器的
值,注意观察看是否符合预期。如图4-9所示
图4-9 单步执行
图4-10 查看数据
通过查看数据窗口了解程序执行情况,获知程序执行结果。如图4-10、图4-11所示。
图4-11 DS数据窗口
四、实验报告
汇编,连接及调试时产生的错误,其原因及解决办法。
例程
DATA SEGMENT MESSAGE DB 0DH,0AH
DB 'THIS IS A SAMPLE PROGRAM OF KEYBOARD AND DISPLAY',0DH,0AH DB 'PLEASE STRIKE THE KEY!',0DH,0AH,'$' DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DW 50 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MAS: MOV DX,OFFSET MESSAGE
MOV AH,9 INT 21H
AGAIN: MOV AH,1
INT 21H CMP AL,1BH JE EXIT ;ESC 程序结束 CMP AL,61H JC ND CMP AL,7AH JC ND1 JMP MAS
ND: ADD AL,20H ND1: MOV DL,AL
MOV AH,2 INT 21H JMP AGAIN
EXIT: CODE
MOV INT ENDS END
AH,4CH 21H START
实验2 BCD到ASCII码转换
一、实验目的
1. 了解BCD值和ASCII值的区别 2. 了解如何将BCD值转换成ASCII值
3. 了解如何查表进行数值转换及快速计算。
二、实验内容
给出一个BCD数,将其转换成ASCII值。
三、实验步骤 (与实验1相同) 例程
给出要转换数BCD码 取出BCD码高四位
查表得到ASCII码
保存高位ASCII码 取出BCD码低四位 查表得到ASCII码
保存低位ASCII码
结束
DATA SEGMENT RESULT DB 2 DUP(?) ASCIITAB:
DB \ ; 定义数字对应的ASCII表 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA START PROC NEAR MOV AX, DATA MOV DS, AX MOV AX, 1AH MOV BL, AL SHR BL, 4 MOV BH, 0
MOV AH, BYTE PTR ASCIITAB[BX] MOV RESULT, AH AND AL, 0FH MOV BL,AL
MOV AH, BYTE PTR ASCIITAB[BX] MOV RESULT+1,AH JMP $ CODE ENDS END START
实验4 两个多位十进制数相减
一、实验目的
1、 学习数据传送和算术运算指令的用法。
2、 熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过程。
二、实验内容
将两个多位十进制数相减,要求被减数、减数均以ASCII码形式顺序存放在以DATAI和DATA2为首的5个内存单元中(低位在前),结果送DATA1处。
三、实验步骤(与实验1相同 )
清除最低进位位
带进位减 结果送被减数区 调整偏移量
开始 显示减数和被减数 减数和被减数转换成十六进制设置计数值 N 计数值-1=0?
例程:
DATA SEGMENT
DATA1 DB 33H,39H,31H,37H,34H DATA2 DB 36H,35H,30H,38H,32H DATA ENDS
STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX
MOV SI,OFFSET DATA2 MOV BX,05
CALL DISPL CALL CRLF
MOV SI,OFFSET DATA1 MOV BX,05 CALL DISPL CALL CRLF
MOV DI,OFFSET DATA2 CALL ADDA MOV SI,OFFSET DATA1 MOV BX,05 CALL DISPL
;第一个数据(作为被加数);第二个数据(作为加数) ;堆栈段
;显示被加数
;显示加数
;加法运算 ;显示结果
CALL CRLF
MOV AX,4C00H INT 21H
DISPL PROC NEAR ;显示子功能 DSI: MOV AH,02
MOV DL,[SI+BX-1] ;显示字符串中一字符 INT 21H
DEC BX ;修改偏移量 JNZ DSI RET DISPL ENDP
ADDA PROC NEAR MOV DX,SI MOV BP,DI MOV BX,05
AD1: SUB BYTE PTR[SI+BX-1],30H SUB BYTE PTR[DI+BX-1],30H ;将ASCII 码表示 DEC BX ;的数字串转化串 JNZ AD1 ;为十六进制的数字 MOV SI,DX MOV DI,BP
MOV CX,05 ;包括进位,共5位 CLC ;清进单位 AD2: MOV AL,[SI] MOV BL,[DI]
ADC AL,BL ;带进位相加 AAA ;非组合BCD码的加法调整 MOV [SI],AL ;结果送被加数区 INC SI
INC DI ;指向下一位 LOOP AD2 ;循环 MOV SI,DX MOV DI,BP MOV BX,05
AD3: ADD BYTE PTR [SI+BX-1],30H ADD BYTE PTR [DI+BX-1],30H DEC BX ;十六进制的数字串转 JNZ AD3 ;化ASCII码表示的数字串 RET ADDA ENDP
CRLF PROC NEAR ;建立宏指令 MOV DL,0DH MOV DL,02H INT 21H
MOV DL,0AH MOV AH,02H INT 21H RET CRLF ENDP CODE ENDS END START
实验9 学生成绩名次表
一、实验目的
进一步熟悉排序方法。
掌握多重循环程序设计的方法。
二、实验内容
根据提示将0~100之间的10个成绩存入首址为1000H的单元,1000H+i表示学号为i的学生成绩,编写程序能在2000H开始的区域排出名次表,2000H+i为学号i的学生的名次,并将其显示在屏幕上。
三、实验步骤同实验1
程序框图
开始初始化入口CX入栈保存显示提示信息学生数送CXSI指向成绩表首址AL送0分学生数送CXBX和SI指向成绩表首址调GETNUM,读成绩送[SI]AL>=[SI]SI+1NCX-1=0YSI+1学生数送CXDI指向名次表首址Y将本次扫描的最高成绩清0调SCAN子程序,扫描成绩表CX出栈计算名次,填入DX学号对应的名次单元NCX-1=0Y显示学生名次返回DOS返回NCX-1=0N[SI]送AL,DX记录对应学号Y
例程:
CRLF MACRO
MOV AH,02H MOV DL,0DH INT 21H
MOV AH,02H MOV DL,0AH INT 21H ENDM
DATA SEGMENT STUNUM EQU 10
MESS1 DB 'INPUT 10 STUDENTS SCORE',0DH,0AH,'$' ERROR DB 'INPUT ERROR!',0DH,0AH,'$' ORG 1000H
SCORE DB 30 DUP(?) ORG 2000H SEQU DB 30 DUP(?) DATA ENDS
STACK SEGMENT
STA DW 32 DUP(?) TOP DW ? STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX
MOV SP,TOP MOV AH,09H
MOV DX,OFFSET MESS1 INT 21H MOV SI,OFFSET SCORE MOV CX,STUNUM UUU: CALL GETNUM MOV [SI],DL INC SI LOOP UUU
MOV CX,STUNUM MOV DI,OFFSET SEQU VVV: CALL SCAN MOV AL,STUNUM SUB AL,CL
INC AL MOV BX,DX
MOV [DI+BX],AL LOOP VVV
MOV CX,STUNUM MOV SI,OFFSET SEQU WWW: MOV AL,[SI] CALL DISPI PUSH DX PUSH AX
MOV AH,02 MOV DL,20H INT 21H POP AX POP DX INC SI
;初始化
;显示提示信息 ;成绩表首址 ;学生数送CX
;读取键入数值送DX ;存入成绩表缓冲区 ;指向下一单元 ;学生数 ;名次表首址 ;扫描子程序 ;学生数 ;计算名次
;记DX学号对应名次;学生数 ;名次表首址
LOOP WWW ;显示排定的学生名次 MOV AX,4C00H INT 21H
SCAN PROC NEAR ;子程序,每扫描一遍成绩表缓冲区, 找出其 PUSH CX ;中成绩最高者(由DX指针指示对应学生),之 MOV CX,STUNUM ;后将该成绩清除以便下一次扫描学生数 MOV AL,00H MOV BX,OFFSET SCORE MOV SI,BX CCC: CMP AL,[SI] JAE JJJ MOV AL,[SI] MOV DX,SI SUB DX,BX JJJ: INC SI LOOP CCC ADD BX,DX
MOV BYTE PTR [BX],00H POP CX RET SCAN ENDP
DISPI PROC NEAR PUSH CX MOV BL,AL MOV DL,BL MOV CL,04 ROL DL,CL AND DL,0FH CALL DISPL MOV DL,BL AND DL,0FH CALL DISPL POP CX RET DISPI ENDP
DISPL PROC NEAR ADD DL,30H CMP DL,3AH JB DDD ADD DL,27H DDD: MOV AH,02H INT 21H RET
DISPL ENDP
;最低成绩 ;指向成绩表首址 ;AL中的成绩不低于成绩表指 ;针SI所指单元的成绩则转JJ ;AL存放较高的成绩 ;DX为对应学号 ;指向下一单元 ;本次扫描成绩最高者清0
GETNUM PROC NEAR PUSH CX XOR DX,DX GGG: MOV AH,01H INT 21H
CMP AL,0DH JZ PPP
SUB AL,30H JB KKK CMP AL,0AH JB GETS CMP AL,11H JB KKK SUB AL,07H CMP AL,0FH JBE GETS CMP AL,2AH JB KKK CMP AL,2FH JA KKK SUB AL,20H GETS: MOV CL,04 SHL DX,CL XOR AH,AH ADD DX,AX JMP GGG
KKK: MOV AH,09H
MOV DX,OFFSET ERROR INT 21H PPP: PUSH DX CRLF
POP DX POP CX RET
GETNUM ENDP CODE ENDS END START
第5章 存储器
5.1 知识要点
1.半导体存储器存贮器的分类,
半导体存储器存贮器的分类即随机读写存储器(RAM)和只读存储器(ROM)。对于随机读写存储器,有可分为静态随机读写存储器和动态随机读写存储器,静态随机读写存储器的存储原理是利用双稳态触发器存储信息,动态随机读写存储器的存储原理是利用电容来存储信息。对于动态随机读写存储器,由于电容泄漏电荷,存储单元的电荷需要定时补充,故动态随机读写存储器需要刷新。
2.常用的存储芯片,静态的RAM主要以6264为例,动态的RAM主要以2164为例。 6264芯片是一个容量为8K×8bit的MOS型SRAM芯片,含有8K个存储单元,每个存储单元存储8位二进制信息,共有28条引线,包括13根地址线、8根数据线和4根控制信号线。
2164含有64K个存储单元,每个单元存储1位信息。 2. 地址译码
地址译码的方法:全地址译码和部分地址译码。
全地址译码方法全地址译码就是把系统中全部地址线与芯片连接,其中高位地址线经过译码电路译码后作为芯片的片选信号;低位地址线与系统中的相应地址线一对一连接。全地址译码方式下,每个存储单元都有唯一的地址。
部分地址译码就是只使用系统地址总线中的一部分与芯片中的地址线相连。高位地址线只使用了一部分经过译码电路译码后作为芯片的片选信号;低位地址线与系统中的相应地址线一对一连接。采用部分地址译码时,存储单元的地址不唯一,存在地址重叠现象。
3. 介绍存储器的扩展
任何存储芯片的存储容量都是有限的。要构成一定容量的内存,往往单个芯片不能满足要求,可能是存储单元个数不够,也可能字长不符合要求,更可能字长、存储单元数都不能满足要求。这时就需要多个存储芯片组合,这种组合称为存储器的扩展。存储器扩展包括位扩展、字扩展和字位扩展三种方式。
当存储芯片每个单元的字长小于所需内存单元字长时,需要用多个芯片构成满足字长要求的存储模块,这就是位扩展。
当存储芯片的容量小于所需内存容量时,需要用多个芯片构成满足容量要求的存储器,这就是字扩展。
5. 只读存储器
只读存储器ROM一般用于存放固定的程序,如BIOS。常用的只读存储器类型有:掩膜式ROM、可编程ROM(PROM)、可擦除可编程ROM(EPROM)、电可擦除可编程ROM (E2PROM)和闪存(Flash Memry)。
6. 高速缓冲存储器
为了缓解CPU和内存之间存取速度的矛盾,在CPU和内存之间插入一小块SRAM,称为Cache,将当前正在执行的指令及相关联的后继指令集从内存读到Cache,使CPU执行下一条指令时,从Cache中读取。Cache的存在使CPU既可以以较快的速度读取指令和数据,又不至于使微机的价格大幅提高。
高速缓冲存储器的工作原理是基于程序和数据访问的局部性。
5.2 习题解答
1. 半导体存储器按照工作方式可分为哪两大类?它们的主要区别是什么? 答:(1)半导体存储器按照工作方式可分为ROM 和 RAM 。
(2)它们之间的主要区别是:
ROM在正常工作时只能读出,不能写入。RAM则可读可写。 断电后,ROM中的内容不会丢失,RAM中的内容会丢失。
2. 静态RAM和动态RAM的存储元的工作原理是什么? 动态RAM为什么需要定时刷
新?
答:(1)静态RAM的存储元的工作原理是利用双稳态触发器的工作原理保存信息; 动态RAM的存储元的工作原理是把电荷存储到电容中来实现信息存储。
(2)DRAM的存储元以电容来存储信息,由于存在漏电现象,电容中存储的电荷会逐渐泄漏,从而使信息丢失或出现错误。因此需要对这些电容定时进行“刷新”。
3. 存储器的地址译码方法有哪两种方式?
答:存储器的地址译码方法有:全地址译码和部分地址译码两种。 4. 什么是位扩展?什么是字扩展?
答: (1)当存储芯片每个单元的字长小于所需内存单元字长时,需要用多个芯片构成满足字长要求的存储模块,这就是位扩展。
(2)当存储芯片的容量小于所需内存容量时,需要用多个芯片构成满足容量要求的存储器,这就是字扩展。
5. 设计一个4KB ROM与4KB RAM组成的存储器系统,芯片分别选用2716(2K×8)和
6116(2K×8),其地址范围分别为4000H~4FFFH和6000H~6FFFH,CPU地址空间为64K,画出存储系统与CPU连接图。
答:分析:2716(2KX8) 11根地址线 A0~~A10
6116(2KX8) 11根地址线 A0~~A10 CPU:64K= 26X210 16根地址线 A0~~A15
分别需芯片个数:
2716: 4KX8/ 2KX8=2 6116: 4KX8/ 2KX8=2
将地址展开成二进制:① 4KB的ROM地址空间 4000H~4FFFH
A15 A14 A13 A12 A11 A10~ A0 0 1 0 0 0 0……0 0 1 0 0 0 1……1 0 1 0 0 1 0……0 0 1 0 0 1 1 ……1
2716(2KX8):2片
第一片 地址范围:4000~~47FFH 第二片 地址范围:4800H~~4FFFH ②4KB的RAM地址空间:6000H~6FFFH
A15 A14 A13 A12 A11 A10~ A0 0 1 1 0 0 0……0 0 1 1 0 0 1……1 0 1 1 0 1 0……0 0 1 1 0 1 1 ……1
6116(2KX8):2片
第一片 地址范围:6000~~67FFH 第二片 地址范围:6800H~~6FFFH
利用:CPU 的剩余地址线A15~A11,使用3:8译码器进行全地址译码,生成片选信号#Y0 、#Y1、#Y4、#Y5,为四个芯片使用。 C B A # Y A15 A14 A13 A12 A11
0 1 0 0 0 #Y0 0 1 0 0 1 #Y1 0 1 1 0 0 #Y4 0 1 1 0 1 #Y5
存储系统与CPU连接图如图5-1所示: