数据段寄存器DS:数据段是存放程序中所使用的数据的存储区域,数据段寄存器用来存放程序的数据存储区的起始地址。
堆栈段寄存器SS:堆栈段寄存器用来存放堆栈存储区的起始地址。由堆栈段寄存器SS与堆栈指针寄存器SP来确定当前堆栈指令的操作地址。
附加段寄存器ES:附加段是为某些字符串操作指令存放目的操作数而设置的一个附加的数据段,附加段寄存器用来存放该附加数据段存储区域的起始地址。
指令指针寄存器(IP)。又称程序计数器,是16位寄存器。IP中存放当前将要执行的指令的有效地址,每取出一条指令IP自动增量,即指向了下一条指令。
指令队列缓冲器:是一个与CPU速度相匹配的高速缓冲寄存器。在EU执行指令的同时,BIU可以从内存中取出下一条或下几条指令放到指令缓冲器中,EU执行完一条指令后,可以立即从指令缓冲器中执行下一条指令。
4. 状态标志与控制标志有何不同,程序中是怎样利用这两类标志的?标志寄存器有哪些标志位,各在什么情况下置位?
【解】状态标志根据算术逻辑运算结果由硬件自动设定,它们反映运算结果的某些特征或状态,可作为后继操作(如条件转移)的判断依据。控制标志由用户通过指令来设定,它们可控制机器或程序的某些运行过程。
标志寄存器的内容如下: 15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
OF DF IF TF SF ZF -- AF -- PF -- CF CF(Carry Flag)进位标志,反映在运算结果的最高位有无进位或借位。如果运算结果的最高位产生了进位(加法)或借位(减法)则CF=1,否则CF=0。
PF(Parity Flag)奇偶标志,反映运算结果中“1”的个数的奇偶性,主要用于判断数据传送过程中是否出错。若结果的低8位中有偶数个“1”则PF=1,否则PF=0。
AF(Auxiliary Carry Flag)辅助进位标志,又称半进位标志。加减运算时,若D3向D4
产生了进位或借位则AF=1,否则AF=0。在BCD码运算时,该标志用于十进制调整。
ZF(Zero Flag)零标志,反映运算结果是否为0。 若结果为零则ZF=1,否则ZF=0。 SF(Sign Flag)符号标志,反映运算结果最高位即符号位的状态。如果运算结果的最高位为1则SF=1(对带符号数即为负数),否则SF=0(对带符号数即为正数)。
OF(Overflow Flag)溢出标志,反映运算结果是否超出了带符号数的表数范围。若超出了机器的表数的范围,即为产生溢出,则OF=1,否则OF=0。
DF(Direction Flag)方向标志,用于串处理指令中控制串处理的方向。当DF=1时,每次操作后变址寄存器SI、DI自动减量,因此处理方向是由高地址向低地址方向进行。当DF=0,则SI、DI自动增量,处理方向由低地址向高地址方向进行。该标志由方向控制指令STD或CLD设置或清除。
IF(Interrupt Flag)中断允许标志,用于控制CPU是否允许响应可屏蔽中断请求。IF=1为允许响应可屏蔽中断请求,IF=0则禁止响应可屏蔽中断请求。该标志可由中断控制指令STI或CLI设置或清除。
TF(Trap Flag)陷阱标志,用于单步操作。TF=1时,每执行一条用户程序指令后自动产生陷阱,进入系统的单步中断处理程序。TF=0时,用户程序会连续不断地执行,不会产生
6
单步中断。
5. 求出下列运算后各个标志的状态,并说明进位标志和溢出标志的区别。 (1) 1278H + 3469H (2) 54E3H - 27A0H (3) 3881H + 3597H (4) 01E3H - 01E3H
【解】CF进位标志,反映在运算结果的最高位有无进位或借位。OF溢出标志,反映运算结果是否超出了带符号数的表数范围。机器实际处理时判断是否溢出的方法是根据最高位的进位(CF)与次高位的进位是否相同来确定,若两者不相同则OF=1(表示有溢出),否则OF=0(表示无溢出)。 (1)
0001 0010 0111 1000 + 0011 0100 0110 1001
0100 0110 1110 0001
OF DF IF TF SF ZF -- AF -- PF -- CF 0 (2)
0101 0100 1110 0011 - 0010 0111 1010 0000
0010 1100 0100 0011
OF DF IF TF SF ZF -- AF -- PF -- CF 0 (3)
0011 1000 1000 0001
0110 1110 0001 1000
OF DF IF TF SF ZF -- AF -- PF -- CF 0 (4)
0000 0001 1110 0011
- 0000 0001 1110 0011 0000 0000 0000 0000 运算后各个标志的状态:
OF DF IF TF SF ZF -- AF -- PF -- CF 0 0 1 0 1 0 6. 8086 CPU 中存储器的逻辑地址和物理地址之间有什么关系,各有多少值?
【解】物理地址为某一个存储单元的实际地址,对于8086它是一个20位的地址。物理地址
0 0 0 1 0 + 0011 0101 1001 0111 运算后各个标志的状态:
0 0 0 0 0 运算后各个标志的状态:
0 0 1 1 0 运算后各个标志的状态:
7
从00000H~FFFFFH变化,对应1MB的空间。
逻辑地址,又称偏移地址或有效地址,即对段首的偏移量。偏移地址从0000H~FFFFH变化,对应64KB的空间。
物理地址的获得方法是:将段寄存器的内容左移4位(即×16),与逻辑地址相加,得到20位物理地址。根据寻址方式的不同,偏移地址可以来自程序计数器(IP)或其它寄存器。 7. 8086CPU使用的存储器为什么要分段,怎样分段?为什么要设置段寄存器,有几个段寄存器?各段寄存器有什么意义?
【解】8086 CPU内部数据结构是16位的,即所有的寄存器都是16位的,而外部寻址空间为1MB,即需要20位地址线。为了能用内部寄存器中的16位地址来寻址1MB空间,8086将1MB空间以16字节为一个内存节,共分成64K个节。节的起始地址分别为00000H、00010H、00020H、?、FFFF0H,称为段基址。节的起始地址的后4位二进制数为全0,称为节的段地址。
用于存放段地址的寄存器称为段寄存器,根据其主要用途,分为代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES。
代码段寄存器CS:用来存放代码段存储区域的起始地址。 数据段寄存器DS:数存放程序的数据存储区的起始地址。
堆栈段寄存器SS:用来存放堆栈存储区的起始地址。由堆栈段寄存器SS与堆栈指针寄存器SP来确定当前堆栈指令的操作地址。
附加段寄存器ES:附加段是为某些字符串操作指令存放目的操作数而设置的一个附加的数据段,附加段寄存器用来存放该附加数据段存储区域的起始地址。 8. 简述A0与BHE在8086系统中的应用。
【解】8086系统中将1MB存储空间分成两个512KB的物理存储体。一个存储体由偶数地址组成,另一个存储体由奇数地址组成。用A0位来区分两个存储体。
用BHE和A0的组合来选择存储体,其组合关系及操作情况如下:
(1) 从偶地址读写一个字节(BHE A0=10)。AD15~AD8上的数据被忽略,字节内容通过AD7~AD0传送。
(2) 从奇地址读写一个字节(BHE A0=01)。在AD15~AD8上传送的数据有效,AD7~AD0上数据被忽略。
(3) 从偶地址开始读写一个字(BHE A0=00)。在AD15~AD0上传送的数据同时有效。
(4) 从奇地址开始读写一个字。第一个总线周期BHE A0=01,从奇地址读写低字节,在AD15~AD8上传送的数据有效。第二个总线周期BHE A0=10,从偶地址读写高字节,在AD7~AD0上传送的数据有效。
11. 8086系统中的存储器采用什么结构?如何与地址、数据线连接?
【解】8086系统中将1MB存储空间分成两个512KB的物理存储体。一个存储体由偶数地址组成,另一个存储体由奇数地址组成。用A0位来区分两个存储体。
12. 8086的I/O端口寻址范围是多少?什么是I/O端口与内存分别独立编址?
【解】8086的I/O端口使用16位地址A15~A0,I/O端口地址范围为0000H~FFFFH,可寻址空间为64KB。
I/O端口与内存分别独立编址时,指令访问的是I/O端口还是内存,由地址信息无法区
8
分,由M/IO信号区分是I/O端口的寻址与内存寻址 。 14. 什么是基地址和位移量,它们之间有何联系?
【解】8086 CPU内部数据结构是16位的,而外部寻址空间为1MB。为了能用内部寄存器中的16位地址来寻址1MB空间,8086将1MB空间以16字节为一个内存节(Paragraph),共分成64K个节。节的起始地址称为段基址。偏移地址是存储地址对段首的偏移量。偏移地址从0000H~FFFFH变化,对应64KB的空间。
它们之间有何联系:物理地址=基地址×16+位移量。
15. 设CS=1200H,IP=0FF00H,此时指令的物理地址是多少?指向这一物理地址的CS和IP的值是惟一的吗?
【解】指令的物理地址:12000H+0FF00H=21F00H
指向这一物理地址的CS和IP的值不是惟一的。
16. 若CS=1000H,指出当前代码段可寻址的存储空间的大小和地址范围。 【解】当前代码段可寻址的存储空间的大小:64KB
当前代码段可寻址的存储空间的地址范围:10000H~1FFFFH 17. 简述8086单CPU和多CPU系统各自主要特点,并说明有何差别。
【解】单CPU系统中只有一个微处理器8086,所有总线控制信号由它产生,系统中总线控制逻辑信号可减少到最小。
多CPU系统中包括两个以上处理器,其中一个为8086作为主处理器,其它处理器作为协处理器,一般多用于复杂的大中型系统。与8086协同工作的协处理器有8087、8089两种,分别为数学协处理器和输入/输出协处理器。配置协处理器的系统,主处理器不用处理费时的复杂运算和I/O操作,因此可大大提高主处理器的运行效率。
18. 时钟周期、T状态、总线周期、指令周期的定义是什么,什么情况下会出现空闲周期? 【解】计算机是由一串脉冲控制进行工作的。这一串脉冲称为计算机的时钟,每个脉冲的时间称为一个时钟周期,每个脉冲称为一个时钟脉冲或一个T状态。若干个时钟脉冲完成一个基本操作。一种基本操作称为一个总线周期。执行一条指令所需要的时间称为指令周期 20. 8086 CPU 复位后,有哪些特征?8086 系统的起动程序如何去找??
【解】8086 CPU 复位后:所有内部寄存器、标志寄存器IR及ES、SS、DS段寄存器清0,指令队列缓冲器清空,指令指针寄存器(IP)清0,CS被置为FFFFH;复位时,所有三态输出总线变为高阻状态,这些三态总线包括:AD15~AD0,A19/S6~A16/S3,BHE/S7,S2(M/IO),S1(DT/R),S0(DEN),KCOL,WR,RD,INTA 等。ALE、HLDA、QS0、QS1等信号降为低电平,
RQ/GT 0 、RQ/GT 1等信号上升为高电平。
8086 系统的起动程序从CS×16+IP即FFFF0H地址开始执行。
21.8086 系统在最小模式时应该怎样配置?试画出这种配置并标出主要信号的连接关系。 【解】8086 系统在最小模式时的典型配置:一片8284A时钟发生器产生系统所需要的时钟信号CLK,同时对外部READY信号和系统复位信号RESET进行同步,其输出送向8086应相引脚。三片8282(或74LS373)地址锁存器用于20位地址和BHE信号锁存,使得整个总线读写周期期间地址信号始终有效,以支持8086CPU地址/数据总线分时复用的工作方式。两片8286总线驱动器(又称总线收发器或总线驱动器)。当系统所连存储器和外设较多时,为了提高数据总线的驱动能力,可以接入8286芯片。
9
该模式的配置图见教材图2-8。
22. 画出最小模式时读存储器或I/O设备的总线周期时序。 【解】8086 最小模式下的读周期时序见教材图2-15。
第4章 指令系统
教材习题解答
1. 若DS=3000H,BP=2000H,SI=1000H,[32000H]=00H,[32001H]=40H,SS=3000H,[31000H]=20H,[31001H]=60H,[33000H]=50H,[33001H]=60H,说明下列各条指令执行后,AX中的内容是什么?并说明各条指令中源操作数的寻址方式。
(1) MOV AX,DS (3) MOV AX,[SI] (5) MOV AX,[BP+SI]
【解】
(1) AX=3000H 寄存器寻址 (2) AX=4000H 直接寻址 (3) AX=6020H 寄存器间接寻址 (4) AX=4000H 寄存器间接寻址 (5) AX=6020H 基址加变址寻址 2. 指出下列指令中的非法指令。
(1) MOV BX,AL (3) PUSH 4567H (5) ADD AL,148H (7) MOV BH,SI
【解】非法指令: (1) MOV BX,AL (3) PUSH
BX和AL的长度不一致
CS段寄存器不能作目的操作数
只能将寄存器或存储单元的内容压入堆栈,不能是立即数 运算溢出
立即数不能直接传送给DS段寄存器 BH和SI的长度不一致 目的操作数不能是立即数
(2) MOV CS,2000H
4567H
(4) XCHG VAR1,VAR2 (5) ADD AL,148H (7) MOV BH,SI (8) SUB 38H,AL (1) PUSH
(6) MOV DS,2000H
(2) MOV CS,2000H (4) XCHG VAR1,VAR2 (6) MOV DS,2000H (8) SUB 38H,AL
(2) MOV AX,[2000H] (4) MOV AX,[BP]
两个存储单元之间不能直接交换数据
3. 若SP=2000H,AX=3355H,BX=4466H,试指出下列指令或程序段执行后有关寄存器的内容。
AX
执行后AX=?,SP=?
(2) PUSH AX
10