1.8086的编程结构(留个悬念)
8086具有16位的微处理器,16根数据线和20根地址线。因为可用20位地址,所以可寻址的地址空间可达到2^20字节即(1MB)
从功能上,8086分为两部分,即总线接口部件(BIU bus interface unit)和执行部件(EU execution unit )
在学习8086的编程结构的编程结构时先了解16/32位微处理器基本寄存器
2.16/32位微处理器基本寄存器
总体上分为3类:
- 通用寄存器(8个)
- 段寄存器 (4个)
- 指令指针和标志寄存器(2个)
2.1通用寄存器
通用寄存器功能: 可以存放逻辑操作和算术运算用的操作数和地址。
指针与变址寄存器功能: 参与地址运算的主要是指针与变址寄存器组中的4个寄存器SP/BP/SI/DI,一般用来存放地址的偏移量。
32位寄存器在16位寄存器名称前加E,如EAX,扩展了16~31位
通用寄存器为什么分为高8位和低8位?
比如数据存储是从低位开始的,而我们的计算只用到低8位时,高8位也可以参与计算,而不是闲置浪费,这样精细划分提高了内存利用率;这样一个16位的寄存器可以当成2个8位寄存器使用
(速记:ABCDX BSP SDI )
- AX称为累加器(Accumulator)
使用频度最高,用于算术、逻辑运算以及与外设传送信息等 - BX称为基址寄存器(Base address Register)
常用做存放地址的偏移地址,在间接寻址中用于存放基地址 - CX称为计数器(Counter)
作为循环和串操作等指令中的计数器,存放循环次数或重复次数 - DX称为数据寄存器(Data register)
常用来存放双字长数据的高16位,或在间接寻址的I/O指令中存放I/O端口地址。 - SP/ESP堆栈指针寄存器
用以指出在堆栈段中当前栈顶的地址。入栈(PUSH)和出栈(POP)指令由SP给出栈顶的偏移地址。因此要与堆栈段寄存器SS配合使用,以指向栈顶的存储单元。 - BP/EBP基址指针寄存器
指出要处理的数据在堆栈段中的基地址,故称为基址指针寄存器。也可以存放堆栈顶部地址的偏移量,此时的默认段为堆栈段SS。
SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址
- BX与BP在应用上的异同
作为通用寄存器,二者均可用于存放数据;
作为基址寄存器,BX通常用于寻址数据段DS;
BP则通常用于寻址堆栈段SS。 BX基址寄存器一般与DS或
- SI是源地址寄存器(Source Index)
指向源数据所在单元 - DI是目的地址寄存器(Destination Index)
可与SI/ESI(源变址寄存器)配合使用,指向目的数据所在单元;
除堆栈指针寄存器SP/ESP不能作为变址寄存器使用外,其余七个通用寄存器在进行地址计算时都可用来存放参与运算的操作数
2.2段寄存器
别名:段选择符,也有的称其为段选择子。
存放高位地址的寄存器叫段寄存器,低16位地址称为偏移量,放在通用寄存器,如基址寄存器BX
4个基本的段寄存器,用于把内存空间分成不同的段
其中ES,FS,GS,都称为附加数据段寄存器,FS,GS是32位微处理器中新增加的
为什么有了通用寄存器,还要设计段寄存器?
段寄存器的设计是为了方便CPU二次寻址,因为内存的空间很大,如果只有通用寄存器,当数据量很多时,CPU在存取数据时效率会下降,用段寄存器对空间分段,CPU在寻址时可以先找到段寄存器,再去找存放在通用寄存器中的数据
- 代码段CS(code segment)
用于存放当前正在运行的程序。存放当前执行程序所在段的段地址,将其内容左移4位再加上IP指针的内容即为下一条执行指令的地址。 - 数据段DS(data segment)
用于存放程序中用到的数据(如数值、字符、地址)。存放当前数据段的段地址,将其内容左移4为再加上计算所得的偏移地址即为对数据段指定单元进行读/写的地址。 - 堆栈段SS(stack segment)
是内存中开辟的专用存储区,用来暂时保存寄存器中的数据。存放当前堆栈段的段地址,将其内容左移4位再加上SP的内容即为栈顶地址 - 附加段ES(extra segment)
是附加的数据,在串操作指令中用于存放目的操作数
堆栈堆栈,堆和栈有什么区别???堆是运行时确定内存大小,而栈在编译时即可确定内存大小
段寄存器的使用规则:
2.3标志和指令指针寄存器
- EIP/IP指令指针寄存器
用于存放指令所在单元地址的偏移量,与代码段寄存器CS配合使用,以便得到指令所在单元地址。IP地址是不断变化的,直到程序运行结束。(cs和ip是好兄弟) - EFR/FR(EFLAGS/FLAGS)标志寄存器
16位只用了其中9位, 用于存放系统的状态标志和控制标志。
状态标志:是CPU在执行指令的过程中产生的。
1)符号标志SF(sign flag)值与运算结果的最高位相等
2)零标志ZF (zero flag) 运算结果为0,值为1;否则值为0
3)奇偶标志PF (parity flag) 运算结果低8位有偶数个1则值为1
4)进位标志CF (carry flag) 加法运算使最高位有进位或减法运算使最高位有借位,则值为1
5)辅助进位标志AF (auxiliary flag) 8位二进制加法运算使第3位向第4位有进位或减法运算使第3位向第4位有借位,则值为1;也叫半进位标志
6)溢出标志OF (overflow flag) 运算过程中有溢出,则值为1:使用双符号位异或求值
- 控制标志:用于控制微处理器的操作和系统所处的工作方式
1)方向标志DF (direction flag) :如果IF置“1”,则CPU可以接受可屏蔽中断请求;反之,则CPU不能接受可屏蔽中断请求。
2)中断允许标志IF (interrupt enable flag)
3)跟踪标志TF (trap flag) 也称陷阱标志
例题:这里可能会出考题,所以要识记各个符号位及含义
3.问答环节
段寄存器的使用规则?
8086CPU有20根地址线,最大可寻址内存空间为1MB。而8086的寄存器只有16位。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为24 ,即16个段,每段不超过64KB(2^16,16位数据线就可以寻址)。
不过段寄存器仍然是16位的,它的内容代表了段基址的高16位,这个16位的地址后面再加上4个0就构成20位的段基址。而原来的16位地址只是段内的偏移量。这样,一个完整的物理内存地址就由两部分组成,高16位的段基址和低16位的段内偏移量,当然它们有12位是重叠的,它们两部分相加在一起,才构成完整的物理地址。
4.温故知新
1.请说出计算机中三种总线及各自功能?
- 数据总线:数据总线是CPU与存储器、CPU与I/O接口设备之间传送 各种指令数据信息的总线,这些信号通过数据总线往返,因此,数据总线上的信息是双向传输的。
- 地址总线:地址总线上传送的是CPU向存储器、I/O接口设备发出的地址信息,寻址能力是CPU特有的功能,地址信息仅由CPU发出,因此,地址总线上的信息是单向传输的。
- 控制总线:控制总线传送的是各种控制信号,有CPU至存储器、I/O接口设备的控制信号,有I/O接口送向CPU的应答信号、请求信号,因此,控制总线是上的信息是双向传输的。
2.说出微处理器中寄存器的使用规则?
CS和IP搭配使用:CS用于存放当前正在运行的程序。存放当前执行程序所在段的段地址,IP用于存放指令所在单元地址的偏移量,将CS其内容左移4位再加上IP指针的内容即为下一条执行指令的地址。IP地址是不断变化的,直到程序运行结束。(cs和ip是好兄弟)
SS和SP搭配使用:SS是内存中开辟的专用存储区,用来暂时保存寄存器中的数据。存放当前堆栈段的段地址,SP给出栈顶的偏移地址,将SS内容左移4位再加上SP的内容即为栈顶地址
3.已知逻辑地址为1F02H:38A0H如何计算出其对应的物理地址?
1F020H
+ 38A0H
---------------
228C0H
4.请画出Pentium处理器的寄存器及名称(通用寄存器、段寄存器、指令指针和标志寄存器)