1 论述存储器芯片与CPU连接时片选信号的三种产生方式,并分析各种方式的特点及特定方式下存储器首末地址。其中全译码法需要详细论述,并举例说明(10分)。
答:片选可以理解成选片,很多芯片挂在总线上的时候,需要有一个信号来区别总线上的数据和地址由哪个芯片处理,这时就需要一个片选信号CS来帮助选择。片选信号时,CPU地址线分为两部分:低位地址线连接所有存储器芯片,实现片内寻址;余下的高位地址线作为存储器的片选,实现片内寻址。片间寻址主要有三种方式:线选方式(线选法)、局部译码选择方式(部分译码法)和全局译码选择方式(全译码法)。
线选法是将余下的高位地址线直接作为各个存储器的片选控制信号。特点是简单明了,且不需要其它逻辑电路,缺点是地址易产生重叠,存储地址的空间不连续,不利于存储系统的扩展。适用于小规模单片机系统的存储器扩展。当8088接一片6264芯片时,A13直接接入片选端,存储器的首地址为0000H,末地址为1FFFH;当8088接入两片6264芯片进行片选时,高位地址线A13经逻辑门电路接入片选端,当A13=0时,选中1#,此时首地址为00000H,末地址为01FFFH;当A13=1时,选中2#,此时首地址为02000H,末地址为03FFFH。
部分译码法是将高位地址线中的某几位(而不是全部高位)经译码器译码,作为存储器的片选信号。特点是电路简单,缺点是地址易产生重叠,存储地址的空间不连续,地址空间利用率低。用8088片选4片6264芯片时,使用部分译码法,用A13、A14两根高位地址线进行片选,其余高位地址线悬空(可置为0),此时存储器可寻址32KB,可寻址地址为0000H-1FFFH,2000-3FFFH,4000H-5FFFH,6000H-7FFFH,即首地址为0000H,末地址为7FFFH。
全译码法是将余下的高位地址总线全部参与译码,译码器的输出作为存储器的片选信号。特点是所有的地址线皆参与片内或片外的地址译码,产生的地址是连续的,唯一的;全译码法可以提供对全部存储空间的寻址能力。但是全译码法对译码电路的要求较高。
全译码法与部分译码法的区别是:部分译码法除参加片选的高位地址线外,其它高位地址线呈x态,既可为高电平也可为低电平,地址不连续,寻址空间容易叠在一起。而全译码法的高位地址线全部用于片选,每根高位地址线的状态电平确定,地址唯一。
例:CPU为8086,将2KBROM存储芯片2716扩展为8KB,如图1所示,利用74LS138芯片进行地址全译码,指出每片存储器芯片的地址范围。
图1 电路图
该电路采用全译码法进行片选,2716有11条地址线和8条数据线,每个2716芯片可寻址空间为2^11=2KB,8086中A0~A10与2716的11根地址线相连,A11~A13连入74LS138芯片,固定A14~A18为0,A19为1进行片选。其中用A11~A13控制片选芯片。
第一个芯片的地址范围:80000H~807FFH
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
第二个芯片的地址范围: 80800H~80FFFH
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
第三个芯片的地址范围: 81000H~817FFH
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1
第四个芯片的地址范围: 81800H~81FFFH
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
如果CPU为16条地址线,8条数据线呢?
方法类似:A0~A10与2716的地址线相连,我们固定A16~A14为0,以A11~A13作为主要控制信号进行片选。
芯片范围如下:
第一个芯片的地址范围:0000H~07FFH
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
第二个芯片的地址范围:0800H~0FFFH
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
第三个芯片的地址范围:1000H~17FFH
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1
第四个芯片的地址范围:1800H~1FFFH
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
2 论述\BHE/S7引脚的功能并举例(10分)。
答:\BHE/S7引脚是高8位数据允许引脚/状态复用引脚,输出、三态,低电平有效。在T1状态,此引脚输出/BHE信号,表示高8位数据线D15~D8上的数据是否有效,在T2T3T4状态,此引脚输出状态信号S7。
8086CPU低8位数据线总是和偶地址的存储器或I/O端口相连接,高8位的数据线与奇地址的存储器或I/O端口相连。\BHE与地址码最低位A0配合起来表示当前总线的使用情况。当\BHE有效时,表示CPU正在使用高8位的数据线对奇地址的存储单元访问。
/BHE与A0的配合使用,如图2所示
图2 \BHE与A0信号的意义
例:连续的存储单元中连续存放着10H,20H,30H,40H,存储单元的起始偏移地址为3000H。
则从偶地址开始读一个字得到的数据为1020H,花费一个总线周期;
从偶地址读开始一个字节得到的数据为12H,花费一个总线周期;
从奇地址读开始一个字节得到的数据为30H,花费一个总线周期;
从奇地址读开始一个字得到的数据为3020H,花费两个总线周期。
3 论述标志寄存器中CF和OF的特点,并分别用8位、16位二进制补码运算下列各式,各式中的数皆为十进制数,并回答标志寄存器中CF和OF的值(10分)。(1)85+70;(2)85+(-70);(3)85-(-70)。
答:条件标志CF为进位标志,反映运算结果的最高位有无借位或进位,进行两个无符号数加法或者减法后,如果CF=1,则表示运算的结果超出了该字长能够表示的数据范围。CF多用于BCD码的调整,条件的判定。
条件标志OF为溢出标志,反映运算是否超出了带符号数的表述范围。OF=1表示运算结果超出了该字长能够表示的范围,即产生了溢出;否则OF=0,多用于条件判定。
85=55H,70=46H,-70=BAH 则
8位二进制补码运算为
(1)85+70=55H+46H=1001 1011=155,CF=0,OF=1;
(2)85+(-70)=55H+BAH=0000 1111=15,CF=1,OF=0;
(3)85-(-70)=55H-BAH=1001 1011=155,CF=1,OF=1;
16位二进制补码运算为
(1)85+70=0055H+0046H=0000 0000 1001 1011=155,CF=0,OF=0;
(2)85+(-70)=0055H+0FFBAH=0000 0000 0000 1111=15,CF=1,OF=0;
(3)85-(-70)=0055H-0FFBAH=0000 0000 1001 1011=155,CF=1,OF=0。
4 论述DOS系统的功能调用,并设计一个满足以下条件的程序:给定3个范围在0~255之间的数,在3个数中找出最小的数并在屏幕上显示出来(10分)。
答:DOS的中文名称是磁盘操作系统,一种面向磁盘的系统软件,简单来说,DOS系统就是人与机械的一座桥梁,有了DOS系统,我们可以不必死记硬背那些生硬的机械指令。
DOS系统中常用的软中断有8条,系统规定它们的中断类型码为20H~27H。我们主要学习的中断就是INT21.INT21中断本身包含很多子程序,每个子程序对应一个功能。调用这些子程序的格式如下:
传送入口参数到指定寄存器中;
功能号送入AH寄存器;
INT21。
DOS系统降低了我们编写汇编程序的难度,在微型计算机的发展过程中起到了重要作用。
设计程序:
DATA SEGMENT
BUF DB ?;//预留存储空间
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA;
START:MOV AL,x;
MOV BL,y;
MOV CL,z;
CMP AL,BL;
JL L1;
XCHG AL,BL;
L1:CMP AL,CL;
JLE L2;
XCHG AL,CL;
L2:RET; //找到最小的数并存入AL
MOV BUF,AL;
MOV DX,OFFEST BUF;
MOV AH,9;
INT 21H;//屏幕显示
MOV AH,4CH;
INT 21H;
CODE:ENDS;
END START
5 请总结列出第一章所学主要内容(10分)。
第一章主要学习了微型计算机系统的组成及特点和微机的运算基础,包括原码、反码、补码,数制转换、数制计算的学习。具体如下:
1.1 微型计算机系统的组成及特点
CPU(中央处理器)是计算机中执行运算和控制功能的区域,主要由算术逻辑部件(ALU)和控制部件组成。
内部总线:用于连接微处理器内部的算术逻辑部件、控制器及各种寄存器。
系统总线:用于微处理器、内存、I/O接口及各插板之间连接和传输信号。总线默认指系统总线。
系统三总线:数据总线(DB)、地址总线(AB)、控制总线(CB)。
微型计算机系统可分为三个层次:微处理器、微型计算机和微型计算机系统
1.1.1 微处理器
微处理器是指用一片或少数几片大规模集成电路组成的中央处理器,含有系统总线能完成取指令、执行指令,以及与外界存储器和逻辑部件交换信息等操作,是微型计算机的运算控制部分。
微处理器不等于CPU。
1.1.2 微型计算机
以微处理器为核心,配上由大规模集成电路制作的只读存储器(ROM)、读写存储器(RAM)、输入/输出接口电路及系统总线等所组成的计算机。如:单片机、单板机。
1.1.3 微型计算机系统
以微型计算机为中心,配以相应的外围设备以及控制微型计算机工作的软件
1.2运算基础
1.2.1 进位计数制
(1)R进数特点:
具有R个不同数字符号:0,1……R-2,R-1,特点是逢R进一,如十进制逢十进一,二进制逢二进一,十六进制逢十六进一,R进制数可以用多项式(即按权展开式)展开。
(2)数制转换:
二进制、十六进制转换成十六进制采用按权展开式计算求和的方法;
十进制转换成二进制、十六进制整数部分采用除基求余法,小数部分采用除基取整法;
二进制转换成十六进制的相互转换:每一位数对应四位二进制数。
(3)算术运算:
二进制数可以进行简单的加法、减法、乘法、除法和逻辑运算(包含或、与、非、异或)
1.2.2 二进制编码
(1)常用的二进制编码方式有ASCII(美国标准信号交换码)、汉字编码
1.2.3 BCD码
BCD码是十进制数,有10个不同的数字符号,且是逢十进进位;但它的每一位是用4位二进制编码来表示的,因此被称为二进制编码的十进制数。与二进制编码相比,BCD码看起来更加直观。如十进制数65转换成BCD码为:01100101。
BCD码与二进制之间不能直接转换,要用十进制作为中间桥梁,即先将BCD码转换成十进制数,然后再转换为二进制数;反之亦然。
1.2.4 带符号数的表示
二进制有符号数最高位为符号位,正数的符号位用0表示,负数的符号位用1表示,数值位(二进制)保持不变。
(1)原码
定义:正数的原码等于正数本身;负数的原码=2n-1-负数,其中n为原码的位数。
(2)反码
定义:正数的反码与原码相同;负数的反码为原码除符号位外其余各位取反。
特点:“0”有两种表示方式:00000000(+0的反码)和11111111(-0的反码);8位二进制数反码真值范围为-127~+127;16位反码真值范围为-32767~+32767。
(3)补码
定义:正数的补码与原码相同,负数的补码符号位不变,其余各位取反后加1。
特点:[+0]补=[-0]补=00000000;8位二进制补码真值范围为-128~+127;16位补码真值范围为-32768~+32767。
补码符号位扩展:有符号数:符号位为“0”全补“0”,符号位为“1”全补“1”;无符号数全补“0”。
(4)补码运算的溢出及其判断方法
溢出:指运算结果超出了规定长度数据的表数范围,在此特指带符号数的补码运算溢出。如:对于8位字长的二进制补码数其表数范围为-2^7~+2^7-1。如果运算结果超出了此范围,就会产生溢出。
判断溢出:根据加法运算中最高位和次高位的两个进位来判断,如果最高位和次高位的进位相同,则运算结果无溢出;如果最高位和次高位的进位不同,则说明运算结果有溢出。
6 请总结列出第二章所学主要内容(10分)。
第二章主要学习了8086微处理器及其系统,包含8086系统的存储器组织及I/O组织、工作模式、操作时序等内容。
8086微处理器是16位微处理器,它有16位数据总线和20位地址总线,数据总线和地址总线分时复用,可寻址地址空间为2^20=1MB。
2.1 微处理器简介
8086微处理器由执行部件(EU)和总线接口部件(BIU)组成,其中,EU部分主要完成计算机内的算术逻辑运算;BIU主要完成CPU与存储器、I/O设备之间传送数据、地址、状态和控制信息。
EU由内部寄存器组、算术逻辑运算单元(ALU)与标志寄存器(FR)、内部控制逻辑电路3部分组成
BIU负责CPU与存储器、I/O设备之间传送数据、地址、状态及控制信息,它由段寄存器(CS、DS、SS、ES)、指令指针寄存器(IP)、地址加法器、内部暂存器、指令队列缓存器及I/O控制逻辑等部分组成。
内部控制逻辑电路:从指令队列缓冲器中取出指令,对指令进行译码,并产生各种控制信号,控制各部件的协同工作以完成指令的执行过程。
地址加法器:用于产生20位的物理地址。即进行一次地址加法,将段寄存器的内容左移4位与偏移地址相加,得到20位的物理地址,从而可寻址1MB的存储空间。一个加数来自段寄存器左移4位,另一个加数来自IP或内部寄存器。
指令队列缓冲器——6字节:是一个与CPU速度相匹配的高速缓冲寄存器。
输入/输出控制电路(总线控制逻辑):是CPU外部三总线(AB、DB、CB)的控制电路,控制CPU与其它部件交换数据、地址、状态及控制信息。
总线接口部件和执行部件的管理:总线接口部件和执行部件并不是同步工作的,也不是完全无关,而是互相配合工作的。
2.2 8086微处理器内部寄存器
8086微处理器含14个16位寄存器,按功能可分为三类:8个通用寄存器,4个段寄存器,2个控制寄存器。
2.2.1 通用寄存器
数据寄存器:8086含4个16位数据寄存器,它们又可分为8个8位寄存器,即:
AX——AH,AL:累加器,所以I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中;
BX——BH,BL:基址寄存器,在间接寻址中用于存放基址地址;
CX——CH,CL:计数寄存器,用于在循环或串操作指令中存放计数值;
DX——DH,DL:数据寄存器,在间接寻址的I/O指令中存放I/O端口地址,在32位乘除法运算时,存放高16位数。
地址指针寄存器
SP:堆栈指针寄存器,其内容为栈顶的偏移地址;
BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。
变址寄存器
SI:源变址寄存器;
DI:目标变址寄存器;
变址寄存器在指令中常用于存放数据在内存中的地址。
BX与BP的区别:作为通用寄存器,二者均可用于存放数据;作为基址寄存器,用BX表示所寻找的数据在数据段;用BP则表示数据在堆栈段。
2.2.2段寄存器
作用:段寄存器用于存放相应逻辑段的段基地址(起始地址)。
段可分为:代码段、数据段、附加段、堆栈段。
段寄存器可分为:代码段寄存器CS,数据段寄存器DS,堆栈段寄存器SS,附加段寄存器ES。
CS:代码段是存放程序代码的存储区域,CS存放代码段的段基地址;
DS:数据段用于存放程序中所使用的数据,DS存放数据段的段基地址;
SS:堆栈段是按照先进后出原则组织的一段特殊存储区域,SS存放堆栈段的段基地址;
ES:附加段是某些字符操作指令存放目的操作数而设置的一个附加的数据段,ES存放附加段的段基地址。
段寄存器的值表面相应逻辑段在内存中的位置。
2.2.3 控制寄存器
指令指针控制寄存器IP:用来存放当前将要执行的指令(下一条)的有效地址。在程序运行过程中,每取出一条指令IP自动增量(BIU自动修改IP中的内容),使它始终指向将要执行的下一条指令。
状态标志寄存器(FR)
标志寄存器是一个16位寄存器,使用其中的9位作为条件标志和控制标志。
状态标志位:
CF:进位标志位。加减法运算时,若最高位有进(借)位则CF=1;
OF:溢出标志位。当算术运算的结果超出了有符号数的可表达范围时,OF=1,否则OF=0;
ZF:零标志位。当运算结果为0时ZF=1,否则ZF=0;
SF:符号标志位。当运算结果的最高位为1时,SF=1,最高位为0时,SF=0;
PF:奇偶标志位。运算结果的低8位中“1”的个数为偶数时PF=1,为奇数时PF=0;
AF:辅助进位标志位。加减操作中,若Bit3(D3)向Bit4(D4)有进位(借位),AF=1,无进位(借位),则AF=0;
控制标志位:
TF:单步陷阱标志位,也叫跟踪标志位。TF=1时,使CPU处于单步执行指令的工作方式;
IF:中断允许标志位。IF=1时,CPU可以响应中断请求;
DF:方向标志位。在数据串操作时确定操作的方向。
2.3 存储器寻址
存储地址表示及其内容表示:若X表示某个单元的地址,则[X]表示X单元的内容。如:[0001H]=10H表示10存放在1号单元,[0001H]=1011H表示11放在1号单元,10放在2号单元,遵循高高低低原则。
段地址:段的起始地址的高十六位,偏移地址:段内相对于段的起始地址的偏移量。2.3.1 存储器的分段
8086将1MB的空间划分成16个逻辑段(0~15),每一个逻辑段的可寻址空间为64KB,在段内寻址仍采用传统的16位地址寻址方法。规定各个逻辑段的段首地址低四位应该是“0”(二进制),段首地址的高16位存放在段寄存器DS或CS或SS或ES中。如:第一段地址空间为00000H~0FFFFH,第二段地址空间为10000H~1FFFFH……第15段地址空间为F0000H~FFFFFH。
逻辑段特点:由于偏移地址从0000H~FFFFH,最大可达64KB,每个段空间最大可达64KB;逻辑段与逻辑段之间可以重叠;对于任何一个物理地址,可以唯一地包含在一个逻辑段中,也可以包含在多个相互重叠的逻辑段中,只要有段地址和段内偏移地址就可以访问到这个物理地址所对应的存储空间。
存放段基址的段寄存器和存放段内偏移地址的寄存器:代码段的段基址存放在CS中,偏移地址存放在IP中;数据段或附加段的段基址存放在DS或ES中,偏移地址存放在SI、DI或BX中,堆栈段的段基址存放在SS中,偏移地址存放在SP或BP中。
采用段地址解决了16位寄存器访问大于64KB内存空间的问题,为运行多道程序提供方便。
2.3.2 物理地址
物理地址=段寄存器的内容*16(即左移4位)+偏移地址
程序中使用逻辑段地址来表示存储器单元的地址,即使用段地址和偏移地址来表示。如逻辑地址2345H:0000H对应的物理地址为:23450H+0000H=23450H。
一个存储单元的物理地址是唯一的,而它对应的逻辑地址是不唯一的。如:物理地址24550H,它对应的逻辑地址可以是2455H:0000H,也可以是2400H:0550H。
2.4 8086的引脚及其功能
8086采用双列直插式封装,共有40条引脚。
2.4.1 8086总线周期
时钟周期:CPU的一切操作都是在系统主时钟CLK的控制下按节拍有序地进行的。系统主时钟一个周期信号所持续的时间称为时钟周期(T),大小等于晶振频率的倒数,是CPU的基本时间计量单位。
总线周期:CPU通过外部总线对存储器或I/O端口进行一次读/写操作的过程。一个总线周期一般包括4个T状态,若外设来不及和总线交换数据,需要插入TW。一个总线周期由若干个时钟周期组成。
指令周期:执行一条指令所需要的时间。一个指令周期由若干个时钟周期组成。
T1状态:CPU向多路复用总线上发送地址信息,指出要寻址的内存单元地址或I/O端口地址。这期间CPU还要送出地址锁存器信号ALE,在ALE的下降沿将内存单元地址或I/O端口地址存入地址锁存器。
T2状态:CPU从总线上撤销地址,使总线低16位呈高阻状态(特指总线读周期),为数据传送做准备。总线高4位输出总线周期的状态信息。
T3状态:A19~A16上状态信息不变,总线低16位上出现CPU要写出的数据或准备读入的数据。若外设来不及响应,需在T3的下降沿之前插入等待状态TW,直到READY线为高电平结束等待状态。
T4状态:总线周期结束,若为总线读周期则在T4前将数据读入CPU。
2.4.2 8086微处理器的引脚
GND和VCC:VCC引脚接+5V电源,GND接地引脚。
AD15~AD0:地址/数据复用引脚,双向、三态,该引脚为复用引脚,在总线周期的T1状态用来输出要访问的存储器或I/O端口地址。T2T3状态,读周期T2状态总线浮空,T3状态接收从内存或外设读入的数据,写周期,则总线上为写出的数据。
A19/S6~A16/S3:地址/状态复用引脚,输出,三态;
S6:为0表示8086CPU占用总线;
S5:表明中断允许标志IF的设置情况:IF=1,为允许可屏蔽中断,则S5=1;IF=0,则为禁止可屏蔽中断,S5=0。
S4、S3:指明正在使用的段寄存器
\BHE/S7:高8位数据线允许/状态复用引脚,输出、三态,低电平有效,此引脚通常与A0搭配使用。在T1状态,此引脚输出/BHE信号,表示高8位数据线D15~D8上的数据是否有效,在T2T3T4状态,此引脚输出状态信号S7.
NMI:非屏蔽中断请求引脚,由外部输入,边沿触发,上升沿有效,不受IF影响。
INTR:可屏蔽中断请求引脚,由外部输入,电平触发,高电平有效,受IF影响,当检测到中断请求且IF=1时系统才会响应中断请求。
\RD:读信号,输出,三态,在T2、T3、TW期间低电平有效;M/\IO为高电平则读存储器,反之则读I/O端口。
CLK:时钟输入引脚,CPU的所以操作均是在时钟的同步下进行的。
RESET:复位引脚,输出、高电平有效,8086要求复位信号至少维持4个时钟的高电平才有效。执行复位操作后,标志寄存器、IP、DS、SS、ES清0,指令队列清空,CS置为FFFFH。
REDAY:准备好引脚,输入,高电平有效;
\TEST:测试引脚,输入、低电平有效,通常和WAIT指令配合使用。
MN/\MX:最小/最大模式控制引脚,输入,该引脚接+5V,8086工作在最小模式,该引脚接地,8086工作在最大模式。
2.5 8086系统的存储器组织及I/O组织
2.5.1 8086系统的存储器结构
(1)存储器的结构
8086存储器运用了字节交叉编址方式,分为偶地址存储体(A0=0)和奇地址存储体(A0=1)。
(2)关于读情况
从偶地址读一个字节(\BHE A0=10),AD15~AD8上的数据被忽略,字节内容通过AD7~AD0传送。
从偶地址读一个字(\BHE A0=00),在AD15~AD8、AD7~AD0上传送的数据同时有效。从奇地址读一个字节(\BHE A0=01),在AD15~AD8上传送的数据有效,AD7~AD0上数据被忽略。
以上三种读操作都是在一个总线周期中完成的。
从奇地址读一个字(\BHE A0=先01再10),这种操作要占用两个总线周期。
(3)8086系统内存地址的一些专用区域
00000~003FFH:1KB空间用于存放中断向量表,可存放256个中断服务地址的入口地址,每个地址占4字节。
B0000~B0FFFH:4KB为单色显示器显示缓冲区,存放屏幕当前显示字符的ASCII码。
B8000~BBFFFH:16KB为彩色显示器显示缓冲区,存放屏幕当前像素代码。
FFFF0H:启动地址。一般用来存放一条无条件转移指令,转到系统初始化程序。
2.5.2 8086系统的I/O组织
8086系统有专用的输入(IN)、输出(OUT)令,用于外设端口(即外设接口中的内部寄存器)的寻址。
I/O端口与内存分别独立编址。I/O端口使用16位地址A15~A0,I/O端口地址范围为0000H~FFFFH,可寻址空间为64KB。
2.6 8086系统的工作模式
2.6.1 最小模式和最大模式的概念
最小模式:如果系统中只有一个微处理器8086,所有总线控制信号都由它产生,则系统中总线控制逻辑信号可先减到最小,因此这种系统称为最小模式系统。
最大模式:如果系统中包括两个以上的微处理器,其中一个为8086/8088作为主处理器,其它处理器作为协处理器,这样的系统称为最大模式系统。
2.6.2 最小模式系统
8086最小模式中硬件连接特点:MN/\MX引脚接5V;有一片8284A作为时钟发生器;有三片8282或74LS373用来作为地址锁存器;需要增加系统数据总线的驱动能力可以选用两片8286或74LS245作为总线驱动器。
8086CPU必须加上必要的支持芯片,才能形成系统及通信总线,构成完整的微型计算机系统。
(1)8284时钟发生器
8284时钟发生器可以为CPU提供时钟、准备就绪(READY)、复位(RESET)信号,还可以向外提供晶体振荡信号(OSC)、外围芯片所需时钟PCLK等其它信号。
8284的主要引脚:
CLK:输出,系统时钟,频率为晶体频率或外接输入端EFI信号频率1/3。
F/\C:输入,频率/晶振选择。若为0,选择CLK为晶体产生,为1,则由外接输入频率产生。
X1、X2、TNK:晶体输入,直接接晶体的两个引线,晶体的频率(14.7456MHz)为CPU所需时钟频率的3倍,TNK为晶振选择引脚。
PCLK:输出,外部设备时钟。
EFI:外接输入频率。
OSC:向外提供晶体振荡信号。
\AEN1、\AEN2:输入,地址允许信号,其状态分布控制RDY1和RDY2。
RDY1、RDY2:输入,总线准备好信号。
REDAY:输出,准备好信号,由RDY1或RDY2形成。高电平表示准备好,低电平时,使CPU产生等待周期。
\RES:输入,外部复位信号。
RESET:输出,复位信号。
(2)8282地址锁存器
8086的AD15~AD0既作为低16位地址线,又作为16位数据线,为了把地址信息分离出来保存,为外接存储器或外设提供16位地址信息,一般需外加三态锁存器,并由CPU产生的地址锁存允许信号ALE的下沿将地址信息锁存入8282锁存器中。
8282八位三态输出锁存器引脚功能:
STB:输入,选通信号,高电平有效。当STB为高电平时,输出DO7~DO0随DI7~DI0而变,起传输作用;当STB由高电平变到低电平时,将输入信号锁存。
\OE:输出允许,低电平有效。\OE低电平时,将被锁存的信号输出;\OE高电平时,8282输出呈高阻态。在系统中,\OE接地,保证总是允许输出状态。
(3)8286总线驱动器
8286是8位并行双向总线驱动器用来将数据总线上的数据接收到CPU或把CPU的数据发送到数据总线上,另一方面用以增加数据总线的负载能力。
8286总线驱动器的引脚功能:
T:输入,传输方向控制端。T高电平时,数据由A朝B发送,T低电平时,数据由B朝A发送。
\OE:输出,允许输出端。\OE低电平时,允许输出;\OE高电平时,输出呈高阻态。
(4)其他控制信号——最小模式下的8个专用控制信号引脚:
M/\IO及\WR信号:输出、三态。M/\IO存储器\输入输出控制信号,高电平表示访问存储器,低电平表示访问I/O;\WR为写信号,有效表示处理器正在向存储器或I/O写数据。这两个信号与\RD信号结合起来决定系统中数据传出的方向。
HOLD:总线保持请求信号,输入、高电平有效。
HLDA:总线请求响应信号,输出、高电平有效。
\INTA:中断响应信号,输出、三态、低电平有效。
ALE:地址锁存器允许信号,输出、高电平有效。此信号在T1状态送出。
\DEN:数据允许信号,输出、三态、低电平有效。
DT/\R:数据收发控制信号,输出、三态。
2.7 8086的操作时序
2.7.1 复位操作时序
8086的复位和启动是通过RESET引脚上高电平信号。
8086复位操作的内容包括:
所有内部寄存器、标志寄存器、段寄存器ES、DS、SS清0,CS被置为FFFFH,指令缓冲队列清空,指令指针寄存器(IP)清0,程序从CS*16+IP即FFFF0H地址开始执行。
复位时,所以三态输出总线变为高阻状态,包括:AD15~AD0、A19/S6~A16/S3、\BHE/S7、(\S2)M/\IO、(\S1)DT/\R、(\S0)\DEN、(\LOCK)\WR、\RD、\INTA。
ALE、HLDA、QS0、QS1等信号降为低电平。
2.7.2 最小模式下的总线读周期
T1状态:在T1状态,地址锁存允许信号ALE有效,输出一个正脉冲。在其下降时,将地址锁入8282地址锁存器。
T2状态:在T2状态,地址信号消失,地址/数据复用总线进入高阻状态,为总线读操作作准备。
T3状态:在T3状态,内存或I/O端口将数据送上数据总线。
T4状态:在T4前沿CPU将数据读入,总线周期完成。
2.7.3 最小模式下的总线写周期
T1状态:T1状态的操作与总线读相同,即M/\IO应在T1前沿之前有效。
T2状态:A19/S6~A16/S3引脚输出状态信息S6~S3,AD15~AD0复用总线上输出要写出的数据,并一直保持到T4中部。
T3状态:在T3状态中,T2状态有效的信号继保持有效,继续向外部写数据。
T4状态:总线写状态结束,所有控制信号变为无效状态,所有三态总线变为高阻态。
2.7.4 对总线响应周期的进一步说明
(1)总线申请模块使HOLD变为高电平后,在其后的时钟脉冲上升沿CPU才能查到,且要等当前总线周期结束后,即在T4或TI之后才能发出HLDA信号,让出总线,这期间会有几个时钟的延迟。
(2)HOLD信号直接影响总线接口部件BIU的工作,对执行部件EU的影响是最间接的。即CPU让出总线后,EU照样从指令队列中取出指令执行,直到需要总线操作或指令队列已空时才停下来。
(3)其它总线部件完成工作交回总线控制权后,CPU接管总线,但并不一定马上控制总线,直到程序中需要总线操作时才恢复对总线的控制。
(4)为防止总线切换过程中没有任何模块控制总线导致控制线上电平过低,控制线上应接上拉电阻。
7 请总结列出第四章所学主要内容(10分)。
第四章主要学习了8086的指令系统,包括数据传送指令、算术运算指令、串指令等指令的学习。
7.1 指令系统概述
指令:计算机用于控制各个部件协调动作的命令。
指令系统:一台机器所能执行的全部指令的集合称为机器的指令系统。
指令中应包含的信息:执行的运算,运算结果的去向,运算数据的来源。
7.1.1 8086指令系统
指令格式:操作码 [目的操作数],[源操作数]
源操作数:指令加工之前的数据。
目的操作数:指令加工后形成的数据。
操作数类型(根据操作数所存储位置不同划分):
立即数操作数:表示参加操作的数据本身,可以是8位或16位,可以是无符号数或有符号数,其数值应在可取值范围内,目标操作数不能使用立即数操作数。
寄存器操作数:表示参加运算的数存放在指令给出的寄存器中,可为16位或8位。
存储器操作数:表示当前参加运算的数存放在存储器的某一个或某两个单元。
7.1.2 寻址方式
操作数可能的来源或运算结果可能的去处:由指令直接给出,寄存器,内存单元。
寻找操作数所在地址的方法可以有三种大类型:指令直接给出的方式,存放于寄存器中的寻址方式,存放于存储器中的寻址方式。
10种寻址方式:
(1)立即寻址
指令中直接给出操作数的偏移地址。
立即寻址方式只能用于源操作数,主要用于给寄存器赋值。
立即数寻址方式不执行总线周期,执行速度快。
(2)寄存器寻址
指令直接给出某个寄存器的名字,以寄存器的内容作为操作数。
寄存器寻址方式的指令操作在CPU内部执行,不需要执行总线周期,执行速度快。
寄存器寻址既适用于目的操作数,也适用于源操作数,并且可同时用于源操作数和目的操作数。
(3)直接寻址
操作数的有效地址(EA,段内偏移地址)直接包含在指令中,它与操作码一起存放在代码段CS中。
操作数存放的物理地址=DS*16+16位地址偏移量。
例:MOV AX,[2100H];将DS段中2100H单元的内容送给AL,2101H单元的内容送给AH。
直接寻址方式的操作数所在存储单元的段地址一般在数据段寄存器DS中。
如果超出其它段,则需要在指令中用段超越前缀指出相应的段寄存器名。
(4)寄存器间接寻址
操作数在存储器中,指令中寄存器的内容作为操作数所在存储单元的有效地址EA(偏移地址)。
寄存器间接寻址仅限于BX、BP、SI、DI。
寄存器间接寻址又分两类情况:以SI、DI、BX间接寻址,以BP间接寻址。
以SI、DI、BX间接寻址:操作数通常在现行数据段中,即DS中的值左移四位加上SI、DI或BX中的有效地址即为操作数的物理地址。若操作数所在存储单元不在数据段DS中,需要在指令中用段超越前缀表明其所在段的段明。
以BP间接寻址:则操作数在堆栈段中,即操作数的物理地址位是SS中的值左移四位与BP相加。
(5)基址寻址
操作数在存储器中,指令中寄存器(BX或BP)的内容与指令指定的位移量之和作为操作数所在存储单元的有效地址EA。
使用BX时,段地址为DS的内容;使用BP时,段地址为SS的内容。
(6)变址寻址
操作数在存储器中,指令将变址寄存器SI、DI的内存与指令指定的位移量之和作为操作数所在存储单元的有效地址EA(偏移地址)。段地址为DS的内容。
(7)基址加变址寻址
操作数在存储器中,指令将基址寄存器BX、BP与变址寄存器SI、DI的内容之和再加上指令指定的偏移量作为操作数所在存储单元的有效地址EA(偏移地址)。此种寻址方式也可以不加偏移量。
使用BX时,段寄存器为DS;使用BP时,段寄存器为SS。
(8)字符串寻址
规定变址寄存器SI中的内容是源数据串的段内偏移地址,而变址寄存器DI中的内容是目标数据串的段内偏移地址。
源数据串的段地址规定是数据段DS,目标数据串的段地址规定是附加段ES。
(9)I/O端口寻址
直接端口寻址:由指令提供一个8位端数(0-255)。
间接端口寻址:由DX寄存器给出,寻址64KB。
(10)隐含寻址
指令中隐含了一个两个操作数的地址,即操作数在默认的地址中。
7.2 8086指令系统
8086指令系统按功能可分为九大类:
数据传送、算术运算、逻辑运算、移位、串操作、转移、处理器控制、输入输出、中断。
7.2.1 数据传送指令
(1)MOV指令
指令格式:MOV OP目,OP源
指令功能:将源操作数送到目的操作数中。
要求:OP目可以是寄存器(除CS外)、存储器OP源可以是寄存器、存储器和立即数。
注意:两操作数字长必须相同;两操作数不允许同时为存储器操作数;两操作数不允许同时为段寄存器;在源操作数是立即数时,目标操作数不能是段寄存器;IP和CS不作为目标操作数。
(2)堆栈操作指令
先进后出,以字为单位。
堆栈段寄存器SS存放段地址,SP存放偏移地址。
压栈指令PUSH
指令格式:PUSH OP
指令功能:将寄存器或存储单元的内容送入堆栈。
要求:OP为16位的寄存器或存储器操作数。
出栈指令POP
指令格式:POP OP
指令功能:将SP所指向的堆栈栈顶的一个字弹到寄存器或存储单元中。
要求:OP为16位操作,可以是寄存器或存储器操作数。
(3)数据交换指令XCHG
指令格式:XCHG OP1,OP2
指令功能:实现OP1和OP2内容的相互交换。
要求:操作数为通用寄存器或存储器。
注意:两操作数必须有一个是寄存器操作数;不允许使用段寄存器。
(4)查表转换指令XLAT
指令格式:XLAT
指令功能:将BX的内容和AL的内容相加作为有效地址EA,在一个表格中找出此单元中的内容并传送至AL中。
目标地址传送指令
此类指令的功能:将源操作数所在存储单元的地址送入目的操作数。
OP源必须是存储器操作数,OP目必须是16位的通用寄存器。
地址传送指令不影响状态标志位。
(5)LEA指令
指令格式:LEA OP目,OP源
指令功能:将源操作数的EA送到目的操作数。
注意:本指令处理的是变量的地址(偏移量),不是变量的值。它等效于传送有效地址的MOV指令,但MOV指令必须在变量名前使用OFFSET操作符。
(6)LDS指令
指令格式:LDS OP目,OP源
指令功能:把4个字节指针地址(包括一个段地址和一个偏移地址)从源操作数指定的4个存储单元取出,低地址的两字节送目的操作数,高地址的两字节送DS段寄存器。
(7)LES指令
指令格式:LES OP目,OP源
指令功能:本指令与LDS指令的操作基本相同,所不同的是将源操作数4个字节中高地址的两字节传送到ES段寄存器而不是DS段寄存器。
标志寄存器传送指令
(8)读标志指令
指令格式:LAHF
指令功能:将标志寄存器低8位传送到AH。
(9)设置标志指令
指令格式:SAHF
指令功能:将AH的值传送到标志寄存器低8位。
(10)PUSHF指令
指令格式:PUSHF
指令功能:将16位标志寄存器入栈,同时修改栈指针SP。
(11)POPF指令
指令格式:POPF
指令功能:将栈顶的一个字送标志寄存器,同时修改栈指针SP。
7.2.2 算术运算指令
8086的算术运算类指令能够对二进制或十进制(BCD)数进行加、减、乘、除运算,操作数的数据形式可以是8位或16位的无符号数或带符号数。源操作数为8位或16位通用寄存器、存储器和立即数。
目的操作数不允许是立即数,其余同源操作数。
双操作数指令中两个操作数不能同时为存储器操作数。此限制适用于指令系统中所以的双操作数指令。
加法指令
- 不带进位的加法指令ADD
格式:ADD OP目,OP源
功能:把OP源加OP目的值赋给OP目,置标志位。
注意:两操作数的类型相同,类型明确,不能同为存储器操作数。
- 带进位的加法指令ADC
格式:ADC OP目,OP源
功能:把OP源加OP目的值赋给OP目,置标志位。
说明,主要用于多字节运算,多字节运算时低位字节产生的进位应加到高位。
(3)加1指令INC
格式:INC OP
功能:把OP+1的值赋给OP
注意:INC指令不影响CF位,影响标志位AF、OF、PF、SF、ZF。操作数视为无符号数。
以上三条指令运算结果影响状态标志位,但INC不影响CF。
减法指令
(4)不带借位的减法指令SUB
格式:SUB OP目,OP源
功能:把OP目减OP源的值赋给OP目,置标志位。
(5)带进位的减法指令SBB
格式:SBB OP目,OP源
功能:把OP目减去OP源和CF的值赋给OP目,置标志位。
(6)减1指令DEC
格式:DEC OP
功能:把OP-1的值赋给OP,置标志位,不影响CF。
(7)取补指令NEG
格式:NEG OP
功能:将操作数取补后送回源操作数。得到操作数相反数的补码。
要求:操作数可以是8位/16位通用寄存器或存储器操作作数,不能为立即数。
(8)比较指令CMP
格式:CMP OP目,OP源
功能:OP目-OP源,不回送结果,只根据结果置标志位。
乘法指令
(9)无符号数乘法MUL
格式:MUL OP
功能:完成两个不带符号位的8位/16位二进制数的乘法运算。影响标志位CF、OF。
要求:指令中给出的操作数是乘数,它可以是8位/16位通用寄存器及存储器;另一操作数被乘数隐含在AL/AX中,乘积存放在AH:AL或DX:AX中。
(10)带符号数乘法指令IMUL
格式:IMUL OP
功能:完成两个带符号的8位/16位二进制数的乘法运算。有关IMUL的其它约定与MUL相同。
除法指令
(11)无符号数除法指令DIV
格式:DIV OP
功能:完成两个不带符号的二进制数的除法运算。
要求:指令中给出的操作数是除数,它可以是8位/16位通用寄存器及存储器;被除数隐含在AX(字节)或DX、AX(字除法)中。若商超出字节或字节的表述范围,将产生一个类型0的中断。
(12)带符号数除法指令IDIV
格式:IDIV OP
功能:完成两个带符号的二进制数的除法运算。
要求:商的符号根据代数规则确定,余数的符号与被除数相同。操作数的规定同DIV指令。操作数的规定同DIV指令。
(13)符号扩展指令
字节扩展指令:
格式:CBW
功能:将AL中的单字节数的符号扩展到AH中。若AL<80H,则将0赋给AH;若AL>=80H,则把0FFH的值赋给AH。
字扩展指令:
格式:CWD
功能:将AX中的数的符号扩展到DX中。若AX<8000H,则把0赋给DX;若AX>=8000H,则将0FFFFH赋给DX。
符号扩展指令对标志位没有影响。
7.2.3 十进制运算调整指令
BCD码:一位十进制数用4位二进制数表示,这个4位二进制数称为该十进制数的二进制编码,简称BCD码。
分类:
非组合式BCD码:用一个字节表示一位十进制数。
组合式BCD码:用一个字节表示两位十进制数。
注意:8086系统的加、减、乘、除指令只能进行二进制运算,若用这些指令实现BCD码的运算,则必须对运算结果进行调整。
(1)非组合BCD码的加法调整指令
格式:AAA。
功能:对AL中的由两个非组合BCD码相加所得的结果进行调整,并将调整后的结果(非组合BCD码)存于AX中。
调整过程:如果AL的低四位表示的数大于9或者AF=1,则将AL加6的值赋给AL,AL的高四位清0,AH加1的值赋给AH,将AF和CF置1;否则清除AL的高4位及AF和CF标志位。
注意:该指令必须紧跟在ADD或ADC指令之后。
(2)组合BCD码的加法调整指令
格式:DAA
功能:对AL中的由两个组合BCD码相加所得的结果进行调整,并将调整后的结果(组合BCD码)存放AL中。
调整过程:如果AL的低四位大于9或者AF=1,则把AL+6的值赋给AL,并置AF=1;
如果AL的高4位大于9或者CF=1,则把AL+60H的值赋给AL,并置CF=1.
注意:该指令必须紧跟在ADD或ADC指令之后。
(3)非组合BCD码的减法调整指令
格式:AAS
功能:对AL中的由两个非组合BCD码相减所得的结果进行调整,并将调整后的结果(非组合BCD码)存于AL中。
调整过程:如果AL的低四位表示的数大于9或者AF=1,则将AL减6的值赋给AL,AL的高四位清0,把AH减1的值赋给AH,将AF和CF置1;否则清除AL的高4位及AF和CF标志位。
注意:该指令必须紧跟在SUB或SBB指令之后。
(4)组合BCD码的减法调整指令
格式:DAS
功能:对AL中的由两个组合BCD码相减所得的结果进行调整,并将调整后的结果(组合BCD码)存于AL中。
调整过程:若AL的低4位大于9或者AF=1,则将AL-6的值赋给AL,并置AF=1;若AL的高4位大于9或者CF=1,则将AL-60H的值赋给AL,并置CF=1。
注意:该指令必须紧跟在SUB或SBB指令之后。
(5)非组合BCD码的乘法调整指令
格式:AAM
功能:对AX中的由两个非组合BCD码相乘所得的结果进行调整,并将调整后的结果(非组合BCD码)存于AX中。
调整过程:将AL中的内容除以10,并将除得的商和余数分布送AH和AL。
注意:必须紧跟在MUL指令之后;该指令只能对AX中的结果进行调整。
(6)非组合BCD码的除法调整指令
格式:AAD
功能:把AX中的由两个非组合BCD码进行调整,然后可按DIV指令实现两个非组合BCD码的除法运算。
调整过程:将AH中的内容乘以10与AL中的内容相加,结果送AL中,再将AH清零。
注意:DIV指令之前用此指令,DIV之后用AAM指令。
7.2.4 逻辑运算指令
OP源:8/16位通用寄存器、存储器操作数或立即数。
OP目:通用寄存器和存储器操作数。
对标志位的影响:“非”运算不影响标志位。
(1)“与”指令
格式:AND OP目,OP源
功能:对两个操作数按位进行与操作,结果送OP目。
任何数AND1,不变;任何数AND0,为0。
(2)“或”指令
格式:OR OP目,OP源
功能:对两个操作数进行或运算,结果回送OP目。
任何数OR1,为1;任何数OR0,不变。
(3)“异或”指令
格式:XOR OP目,OP源
功能:用于对某个二进制数按位取反或对寄存器清0
(4)“非”指令
格式:NOT OP
功能:对操作数逐位取反后送回远处。
(5)测试指令
格式:TEST OP目,OP源
功能:将目标操作数与源操作数进行逻辑与运算,不回送结果,只根据结果置标志位。
7.2.5 移位指令
移位操作分为一般移位和循环移位。
一般移位指令
(1)逻辑左移指令
格式:SHL OP目,计数值
功能:将操作数的内容左移,每移一次,最低位补0,最高位的值赋给CF。
- 逻辑右移指令
格式:SHR OP目,计数值
格式:将操作数的内容右移,每移一次,最高位补0,最低位的值赋给CF。
(3)算术左移指令
格式:SAL OP目,计数值
功能:同SHL。
(4)算术右移指令
格式:SAR OP目,计数值
功能:将操作数的内容,每移一次,最高位的值不变,最低位的值赋给CF。
循环移位指令
(5)循环左移指令
格式:ROL OP目,计数值
功能:将操作数的内容循环左移,每一次,最高位移入CF,同时移入最低位。
(6)循环右移指令
格式:ROR OP目,计数值
功能:将操作数的内容循环右移,每移一次,最低位移入CF,同时移入最高位。
(7)带进位的循环左移指令
格式:RCL OP目,计数值
功能:包括进位位在内,一起循环左移,每移一次,最高位移入CF,原CF移入最低位。
(8)带进位的循环右移指令
格式:RCR OP目,计数值
功能:包括进位位在内,一起循环右移,每移一次,最低位移入CF,原CF移入最高位。
7.2.6 字符串操作指令
字符串操作指令可分为两大类,一类为重复前缀指令,另一类为基本字符串指令。
重复前缀指令
功能:基本串操作指令每执行一次只能处理一个数据,与重复前缀指令结合可以处理一串数据。
分类:
无条件重复REP:若CX不等于0,则将CX-1的值赋给CX,继续重复操作,直到CX=0为止。
条件重复:
相等/为0重复 REPE/REPZ:若CX不等于0且ZF=1,则将CX-1的值赋给CX,继续重复操作,直到CX=0或ZF=0为止。
不相等/不为0重复 REPNE/REPNZ:若CX不等于0且ZF=0,则将CX-1的值赋给CX,继续重复操作,直到CX=0或ZF=1为止。
注意:重复前缀指令不能单独使用,其后必须紧跟基本字符串指令,控制基本字符串指令重复执行。其执行过程相当于一个循环程序的运行。在每次重复后,地址指针SI和DI都被修改。执行该类指令不影响标志位。
基本串操作指令
(1)字符串传送指令
格式:MOVS(MOVSB,MOVSW) OP目,OP源
功能:从源串中取一个字节/字,传送到目标串中,并自动修改SI/DI,使之指向下一元素。字符串传送指令前可以加无条件重复前缀REP,表示每传送完一个元素使CX减1,直到CX=0。
注意:使用MOVS指令时,必须说明操作数的数据类型,这样才能确定是字节传送,还是字传送。即操作数类型必须明确。
(2)字符串比较指令
格式:CMPS(CMPSB,CMPSW) OP目,OP源
功能:取源串一个字节/字,与目标串的一个字节/字相加减,不回送结果,根据结果置标志位,并修改串地址指针,使之指向下一个字节/字单元。
(3)字符串搜索指令
格式:SCAS(SCASB,SCASW) OP
功能:将AL/AX寄存器中的关键字,减去由DI所指向的目标串中的元素,不回送结果,根据结果置标志位,并修改DI寄存器内容,指向下一元素。
转移指令中的循环控制指令
(4)计数循环LOOP
格式:LOOP 目标标号
功能:把CX-1的值赋给CX,若CX不等于0,循环转移至目标标号,直到CX=0退出循环。
- 结果为0循环/相等循环
格式:LOOPZ/LOOPE 目标标号
功能:将CX-1的值赋给CX,若CX不等于0且ZF=0(结果不为0/不相等)时,循环转移到目标标号,直到CX=0或ZF=1时退出循环。
- 结果不为0循环/不相等循环
格式:LOOPNZ/LOOPNE 目标标号
功能:将CX-1的值赋给CX,若CX不等于0且ZF=0(结果不为0/不相等)时,循环转移到目标标号,直到CX=0或ZF=1时退出循环。
(6)计数为0转移
格式:JCXZ 标号
功能:若CX=0时,则控制转向目标标号,否则按顺序执行。
取字符串和存字符串指令
(7)取字符串指令
格式:LODS(LODSB,LODSW) OP
功能:将源串中SI所指向的存储单元中的一个字节/字取到AL/AX寄存器中,并修改SI的内容,指向下一字节/字单元。
注意:LODS指令一般不使用重复前缀。
(8)存字符串指令
格式:STOS(STOSB,STOSW) OP
功能:将AL/AX中的一个字节/字,存到由DI所指向的目标串的存储单元,并修改DI的内容,指向下一个字节/字的存放单元。
7.2.7 转移指令
转移指令分为无条件转移指令,条件转移指令,循环控制指令。
无条件转移指令
程序的寻址由CS和IP两部分组成。改变地址能使程序转移到一个新的地址去执行。
段间转移:同时改变CS和IP的值。
段内转移:只改变IP的值。
短/近转移:短/近距离的段内转移。
直接转移:转移的地址信息直接出现在指令的机器码中。
间接转移:转移的地址信息存于某寄存器或某存储器单元。
(1)JMP指令
段内直接转移
格式:JMP SHORT OP;OP:8位偏移量/标号
操作:IP(下一条指令首地址)+8位偏移量代替原来的IP。
例:JMP SHORT NEXT
段内直接近转移
格式:JMP NEAR PTR OP;OP:16位偏移量/标号;NEAR PTR可省略。
操作:IP(下一条指令首地址)+16位偏移量代替原来的IP。
段内间接转移
格式:JMP WORD PTR OP或JMP OP
注意:第一种情况,OP为存储器操作数,IP由指令中指定的字单元的内容代替;第二种情况,OP为16位通用寄存器,IP取自指令中指令的寄存器。
段间直接转移
格式:JMP FAR PTR OP
操作:目标地址在其它代码段,由包含在指令中的段地址和偏移地址替代CS和IP。
段间间接转移
格式:JMP DWORD PTR OP
操作:转移的目标地址和偏移地址存放在指令中指定的连续4个单元之内,前两个单元为偏移地址,后两个为段地址,即高地址送CS,低地址送IP。
总结:直接转移类(段内或段间)的OP都可以直接用标号指出。
调用和返回指令
(2)调用指令
格式:CALL OP
将CALL指令的下一条指令的地址IP或IP与CS压栈,新的目标地址装入IP与CS中,控制程序转移到由OP指明入口的程序。
段内调用:被调用的子程序在当前代码段中,称段内调用,相应的过程称近过程,用NEAR表示。
段间作用:被调用的子程序不在当前代码段中,称段间调用,相应的过程称远过程,用FAR表示。
CALL得到目标地址的方法:
直接调用:目标地址在CALL指令中。
间接调用:目标地址在由CALL指令指定的寄存器或存储单元中。高字送CS,低字送IP。
(3)返回指令
格式:RET
功能:通常作为一个子程序的最后一条指令,用以返回到调用子程序的断点处(相应CALL指令的下一条指令),即从堆栈弹出断点送IP和CS。
条件转移指令
转移范围:段内转移,相对转移,范围在-128~+127之间。
操作:执行此类指令时,首先测试条件,条件满足则转移至目标标号,否则顺序执行下一条指令。
条件转移指令可分为:对无符号数的条件转移指令,对有符号数的条件转移指令,对标志位的条件转移指令。此类指令对标志无影响。
(4)对无符号数的条件转移指令
高于/不低于也不等于转移 JA/JNBE 目标标号
高于或等于/不低于转移 JAE/JNB 目标标号
低于/不高于也不等于转移 JB/JNAE 目标标号
低于或等于/不高于转移 JBE/JNA 目标标号
注意:A表示高于,B表示低于,N表示不,E表示等于
(5)对有符号数的条件转移指令
大于/不小于也不等于转移 JG/JNLE 目标标号
大于或等于/不小于转移 JGE/JNL 目标标号
小于/不大于也不等于转移 JL/JNGE 目标标号
小于或等于/不大于转移 JLE/JNG 目标标号
其中,G表示大于,L表示小于,N表示不,E表示等于
(6)对标志位的条件转移指令
进位为1转移 JC 目标标号
进位为0转移 JNC 目标标号
等于/结果为0转移 JZ/JE 目标标号
不等于/结果不为0转移 JNZ/JNE 目标标号
溢出转移 JO 目标标号
不溢出转移 JNO 目标标号
奇偶位为1/奇偶性为偶转移 JP/JPE 目标标号
奇偶位为0/奇偶性为奇转移 JNP/JPO 目标标号
符号标志位为1转移 JS 目标标号
符号标志位为0转移 JNS 目标标号
7.2.8 处理器控制指令
(1)标志操作指令
指令格式:
CLC;置CF=0
STC;置CF=1
CMC;CF取反
CLD;置DF=0
STD;置DF=1
CLI;置IF=0
STI;置IF=1
这些指令只影响标志位。
CPU控制指令
(2)处理器暂停指令HLT
格式:HLT
操作:使处理处于暂时停机状态。HLT引起的暂停,只有RESET,NMI,INTR信号可使CPU退出暂停状态。
(3)处理器等待指令
格式:WAIT
操作:执行WAIT指令后,处理器处于等待状态,直到检测到\TEST引脚信号有效后,才退出等待状态,继续执行后续指令。
(4)处理器交权指令
格式:ESC EXTOPCD,OP源
用来为协处理器提供一个操作码和操作数,以便完成主机对协处理器的某种操作要求。
(5)空操作指令
格式:NOP(一个字节)
操作:在执行本指令期0间,CPU不完成任何操作,只是每执行一条NOP指令,耗费3个时钟周期的时间。
作用:通过NOP指令的填充,使指令按字对齐,从而减少取指令时的内存访问次数。还可以用来调整时间和时序:通过NOP指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟;I/O传输,也会用一下NOP,等待缓冲区域清空,总线恢复。
制作软件陷阱:在程序中有意识的插入一些NOP或NOP块,防止程序挑飞。
(6)总线封锁前缀
格式:LOCK
操作:当CPU执行带有LOCK前缀的指令时,不允许其它设备对总线进行访问。LOCK可作为任意指令前缀使用。
注意,控制类指令不影响标志位。
7.2.9 输入输出指令
8086用专用输入/输出指令通过累加AX或AL完成CPU与外设交换数据,查询外设状态或传送控制命令等操作。
所有的外设地址采用独立于存储器的编址方式,外设地址称为端口号。
CPU对外设端口的两种寻址方式:
直接寻址:由指令直接给出端口地址,规定为8位,可寻址256个端口。
间接寻址:由DX作为给出端口地址,且只能用DX作为间址寄存器,可寻址64K个端口。
(1)输入指令
格式:IN 累加器,端口
功能:把一个字节/字由输入端口传送到AL/AX中。
(2)输出指令
格式:OUT 端口,累加器
功能:把AX中的16位数或AL中的8位数输出到指定端口。
7.3.10 中断指令
(1)溢出中断指令
格式:INTO
功能:检测OF标志位。当OF=1时产生一个中断类型4的中断;当OF=0时,本指令不起作用。
(2)软中断指令
格式:INT n(n为中断类型号,取值为00H-0FFH)
指令功能:产生一个软件中断,把控制转向一个类型号为n的软中断。影响标志位IF、TF。
(3)中断返回指令
格式:IRET
功能:CPU执行完中断服务程序后,用此指令使控制正确返回原程序的断点处。影响所有标志位。
8 请总结列出第五章所学主要内容(10分)。
第五章主要学习了宏指令、伪指令、DOS系统的调用等内容。
8.1 基本语法
常数、变量和标号是汇编语言能识别的数据项,也是指令和伪指令语句中操作数的基本组成部分。
指令语句的一般格式:[标号:] 操作码 [操作数] [操作数] [;注释]
将常数、变量和标号形式的数据用运算符连接起来就形成了表达式,可用作汇编语言的数据。
运算符可分为以下6类:包
算术运算符:加、减、乘、除、求余、左移、右移。
逻辑运算符:按位与、按位或、按位异或、按位非。
关系运算符:相等、不相等、小于、大于、小于或大于等。
分析操作符(数值返回运算符):
取地址的偏移量 格式: OFFSET 变量名或标号 ;功能:取变量名或标号所在段的段内偏移量。
取段基址 格式 :SEG 变量名或标号 ;功能:取变量名或标号所在段的段地址。
求变量名或标号的类型 格式: TYPE 变量名或标号;功能:返回一个数字值。若TYPE运算符加在变量名前,返回的数值是该变量的类型属性;若TYPE运算符加在标号前,返回的数值则是该变量的距离属性。
求长度 格式:LENGTH 变量名;功能:返回一个变量名所占的存储单元(字节、字或双字)的数目。如果变量使用重复定义句子句说明的,则返回DUP前面的数值;若没有DUP明,则返回值总是1。
求大小 格式:SIZE 变量;功能:返回变量名所在存储单元的字节数,它等于LENGTH和TYPE两个运算符返回值的乘积。
综合运算符:
PTR运算符 格式:类型 PTR 表达式;功能:用于指出变量、标号或地址表达式的类型属性,新的类型只在当前指令有效。
THIS运算符 格式:THIS 类型;功能:把它后面指定的类型或距离属性赋给当前的变量、标号或地址表达式。
注意:THIS运算符使下面的“原标号或变量”另有新的名字和类型,但并不分配新的存储单元。
其它运算符
HIGH和LOW运算符 格式:HIGH 表达式(LOW 表达式);功能:从运算对象中分离出高字节或低字节。
SHORT运算符 格式:SHORT 标号;功能:使转移的目标地址与本指令的下一条指令之间的字节距离在-128~+127范围。
运算符与运算符之间是有优先级的,括号中的表达示最高,其它由高到低分为1到10级:
第1级:LENGTH,SIZE,WIDTH,MASK
第2级:PTR,OFFSET,SEG,TYPE,THIS,段前缀
第3级:HIGH,LOW
第4级:*,/,MOD,SHL,SHR
第5级:+,-
第6级:EQ,NE,LT,LE,GT,GE
第7级:NOT
第8级:AND
第9级:OR,XOR
第10级:SHORT
8.3 伪指令
功能:为汇编程序提供信息,使汇编程序在汇编过程中完成某些程序。
格式:符号名 定义符 操作数;注释
8.3.1 常用伪指令
(1)符号定义伪指令
等值伪指令
格式:符号名 EQU 表达式
功能:将表达式的值赋给符号名
注意:在同一个程序模块,EQU不允许对同一个符号名重复定义。
等号伪指令
格式:符号名=表达式
功能:将表达式的值赋给符号名。
定义符号名伪指令
格式:符号名 LABEL 类型
功能:定义一个标号或变量,并指定其类型。
(2)数据定义伪指令
格式:
[变量名] DB 表达式;定义字节
[变量名] DW 表达式;定义字
[变量名] DD 表达式;定义双字
[变量名] DQ 表达式;定义8个字节
[变量名] DT 表达式;定义10个字节
功能:定义变量类型,为变量分配存储单元,也可以给存储器赋初值。
注意:表达式可以不止一个,若有多个,用逗号隔开;数据按高高低低原则存放。
(3)表达式类型
数值表达式,如20H,30H。
ASCII字符串,如‘ABCD’。
?表达式:不预置确定的值,常用来预留存储单元。
重复定义句子句DUP:利用重复定义子句DUP可以为若干个重复数据分配存储单元。带DUP的表达格式:n DUP (表达式),其中n为重复次数,表达式为重复的内容。
(4)段定义伪指令
格式:段名 SEGMENT [定位类型] [‘类别名’]
段名 ENDS
定义段至少需要一个代码段,其它段可有可无。
SEGMENT后的3个参数
定位类型:对段起始边界的要求。
组合类型:用来在多模块连接时告诉连接程序本段和其它段的组合关系。
类别:任何合法的自定义符
(5)段寄存器说明伪指令
格式:ASSUME 段寄存器:段名 [,段寄存器:段名…]
功能:向汇编程序指示当前段所用的段寄存器,设定段寄存器与段的关系,装填段寄存器。
- 过程定义伪指令
格式:过程名 PROC [NEAR/FAR] {过程体} 过程名 ENDP
功能:定义过程,在过程体实现过程的操作功能。
- 模块定义指令
模块开始指令
格式:NAME 模块名
功能:指明模块的开始。
模块结束指令
格式:END 启动标号或过程名
功能:结束一个模块,并给出出口。
定义公共符号名伪指令
格式:PUBLIC 符号名
功能:定义一个可以被外部引用的公共符号名。
定义外部符号名伪指令
格式:EXTERN 符号名:类型
功能:定义本模块中将要引用的外部模块中的符号名。
8.4宏指令
宏:源程序中由汇编程序识别的具有独立功能的一段程序代码。
当前源程序中需要多次使用同一个程序段时,可以将该程序段定义一个宏。
一般格式:宏指令名 MACRO [形参,形参,…] 宏体 ENDM
主要的宏操作伪指令
取消宏指令名伪指令
格式:PURGE 宏指令名,[,…]
重复伪指令
格式:REPT (表达式) 宏体 ENDP
8.5 汇编语言程序结构
汇编语言源程序由语句序列组成,该语句序列应该包括指令语句和伪指令语句。
汇编语言源程序中通常含有数据段,代码段和堆栈段。
例:
DATA SEGMENT;
数据段内容
DATA ENDS;
STACK SEGMENT PARA STACK‘STACK’;
堆栈段内容
STACK ENDS;
CODE SEGMENT;
代码段内容
CODE ENDS
8.6 DOS系统
DOS:磁盘操作系统
DOS功能调用是调用子程序系统内核子程序,通过中断方式调用,DOS功能调用影响AX位。
DOS中常用的软中断有8条,系统规定它们的中断类型码为20H~27H。
INT中断本身包含很多子程序,每个子程序对应一个功能。调用他们采用统一的格式如下:
传送入口参数到指令寄存器中;功能号送入AH寄存器;INT21H。
8.6.1 常用的系统功能的调用
(1)键盘输入单字符——1号系统功能调用
格式:MOV AH,1
INT 21H
执行时系统首先等待键盘输入,键盘输入后先检查是否是Ctrl-Break键,并将键入的字符的ASCII码置入AL寄存器,并在屏幕上显示该字符。
(2)无回显键盘输入单字符——8号系统功能调用
格式:MOV AH,8
INT 21H
8号系统的功能与1号功能调用基本相同,唯一的差别是键入的字符不送屏幕显示。
(3)无回显直接控制台输入单字符——7号系统功能调用
格式:MOV AH,7
INT 21H
和1号调用相比,一是不回显字符,二是不做针对Ctrl-Break键的检查。
(4)键盘输入字符串——0AH号系统功能调用
功能:将键盘输入的字符串(回车键表示输入结束)写入内存缓冲区。
(5)输出单字符——2号系统调用
格式:MOV DL,‘A’
MOV AH,2
INT 21H
将置入DL中的字符A送屏幕显示。
(6)输出字符串——9号系统功能调用
功能:将指定内存缓冲区中的字符串在屏幕上显示出来,缓冲区的字符串以“$”为结束标志,但不显示该字符,用DX存放有字符串的首地址。
(7)直接控制台输入/输出字符——6号系统功能调用
功能:如果DL=0FFH,则表示是从键盘输入单字符送AL寄存器;如果DL不等于0,则表示将DL寄存器中的内容送屏幕输出。
(8)返回操作系统——4CH号系统功能调用
功能:结束正在执行的程序,并返回DOS系统。
8.7 汇编语言程序设计
设计目标:结构清晰,可读性强,占用存储空间少,运行速度快。
9 请总结列出第六章所学主要内容(10分)。
第六章主要学习存储系统的结构,半导体读写存储器,存储器与CPU的连接。
9.1 存储系统
由存储器,外存储器,高速缓冲存储器,虚拟存储技术组成。
9.1.1存储器的分类
按存取方式分:随机存储器,只读存储器,顺序存储器。
按存储载体分:磁介质存储器,半导体存储器,光存储器。
按内存的外观分:双列直插式,内存条(内存模块)
9.2.2 存储器的容量
通过允许存放的字数*位数来表示存储容量。
9.3.1 存储器的基本组成
存储体,地址译码器,写入和读出电路,输入/输出缓冲器
9.2 随机读写存储器RAM(用来存数据和运行的程序)
特点:可以读出和写入信息,系统掉电后,信息消失。
静态RAM:SRAM
基本存储电路是双稳态电路。
特点:速度快,集成度低,价格高。
动态RAM:DRAM
基本存储电路是一个晶体管加一电容。
特点:速度低,集成度高,价格低,需要刷新。
9.3 半导体只读存储器
存不运行的程序
Masked ROM:掩膜只读存储器,程序在生产时固化,再不能被擦除。
PROM:一次性可编程的ROM。
EPROM:可擦除可编程ROM
快速擦写存储器Flash Memory:又称快闪存储器,高存储密度,可重复编程。
9.4 CPU与存储器的连接
存储器与CPU连接需要考虑多个因素,如CPU总线的带负载能力,CPU的时序与存储器的存取速度之间的配合,存储器的电平信号与CPU的电平匹配,存储器的地址是否合理分配,控制信号的连接。
片选:选择存储芯片
片选信号的产生方式(片间寻址):线选法,部分译码法,全译码法。
线选法:余下的高位地址线直接作为各个存储器的片选控制信号。
特点:简单明了,不用外加逻辑电路。但是地址不连续,易重叠。
部分译码法:高位地址线中的某几位(非全部位)经译码器译码,作为存储器的片选信号。
特点:简单。缺点是地址不连续,存储空间利用率低。
全译码法:将余下的高位地址总线全部参与译码,译码器的输出作为存储器的片选信号。
特点:产生的地址是连续和唯一的,可以提供对全部存储空间的寻址能力。