编译原理与接口技术复习总结-part1微处理器部分
8088/8086简述
芯片 | 结构 |
---|---|
8088 | 准16位处理器,地址总线20位,数据总线为16位,但与外部进行数据交换为8位。 |
8086 | 16位处理器,地址总线20位,数据总线为16位,与外部交换数据为16位。 |
8088/8086内部由总线控制接口部件(BIU,Bus Interface Unit)以及执行部件(EU,Execution Unit)组成
接口 | 组成 | 功能 |
---|---|---|
BIU | 段寄存器、ALU、指令队列缓冲器等 | 取指、CPU对外进行数据传输 |
EU | 通用寄存器、标志寄存器、ALU等 | 只负责执行指令 |
通用寄存器
通用寄存器为16为,都具有数据存储的功能,以下为不同寄存器所具有的特殊功能。
寄存器名称 | 功能 |
---|---|
AX | 累加寄存器;用于存放逻辑运算中的操作数以及通过I/O与外设传输信息//例如In/Out指令 等 |
BX | 基址寄存器;存放访问内存时的基址//例如 Xlat 指令 等 |
CX | 计数寄存器;在循环或者串操作时做计数器//例如 Loop 指令 等 |
DX | 数据寄存器;在寄存器间接寻址的I/O指令时存放端口地址//例如Out DX,AL等 |
SP | 堆栈指针寄存器;存放当前堆栈中栈顶的偏移地址//Pop Push指令会对其进行修改 |
BP | 基址指针寄存器;基址寻址操作时提供基址//初始化堆栈时对其进行操作 |
SI | 源变址寄存器;常用DS配合使用,提供源操作数的段内偏移地址; |
DI | 目的变址寄存器;存放目的操作数的便宜地址;//不可与SI混用,在串操作时SI、DI必须与DS、ES连用 |
段寄存器
存放段基址的存储器,均为16位。
寄存器名称 | 功能 |
---|---|
CS | 代码段寄存器;存储代码段的段首地址 |
DS | 数据段寄存器;存放数据段的段首地址 |
SS | 堆栈段寄存器;存放堆栈段的段首地址 |
ES | 附加段寄存器;常用于串操作存放目的串的首地址 |
状态标志寄存器Flags
状态标志寄存器是一个16位的寄存器,仅使用其中的9位作为状态位,其中包括6个状态标志位,3个状态控制位。
状态标志位:反映EU执行算术运算或者逻辑运算后结果的状态。
状态标志位 | 含义 |
---|---|
CF | 进位标志位;当CF=1时表示结果的最高位产生了进位或者借位 |
AF | 辅助进位标志位;在进行10进制运算时会用到,当AF=1时表示结果的第四位产生了进位或者借位 |
OF | 溢出标志位;当OF=1时表示有符号数运算时产生了算术溢出,无符号位运算时产生无意义 |
ZF | 零标志位;当ZF=1时表示运算结果为0 |
SF | 符号标志位;当SF=1时表示有符号数运算结果为负数,无符号数的结果最高位为1 |
PF | 奇偶位;当PF=1时表示运算结果中有偶数个1,为奇校验 |
状态控制位:用于控制CPU的操作。
状态控制位 | 含义 |
---|---|
DF | 方向标志;用于控制串操作时的方向,当DF=1时从高到低地址进行。使用CLD指令清除DF位,则从低到高地址进行 |
IF | 中断允许标志;用于控制CPU是否允许接收外部中断,使用指令STL,将IF置1,开中断,CPU可以接收到从INTR引脚的中断请求。使用指令CLI,将IF置0,关中断,此时CPU则不能接受从INTR发来的中断请求 |
TF | 陷阱标志;为便于调试,当TF=1时,在单步工作状态时会产生一次中断,以便检查程序 |
指令指针寄存器 IP
IP存放EU要执行的下一条指令的偏移地址,在执行中断程序、jump等跳转指令时,会对其进行修改,如果为长转移则会连同CS一同进行修改。
8088/8086的基本结构
存储器的结构
8088/8086均具有20根地址线,故其可寻址的最大物理内存为1MB(220);寻址范围为00000H~FFFFFH。
每个存储单元都具有一个地址,每个存储单元可以存储一个字节的数据。相邻的两个存储单元可以存储一个16位的字。其中小地址作为该字的地址。
例:如果
存储单元 | 数据 |
---|---|
1000H | 34H |
1001H | 56H |
1002H | 78H |
1003H | 90H |
1004H | 0ABH |
1005H | 0CDH |
从1000H单元中读一个字,该字位5634H。即高地址存放该字的高半部,低地址存放该字的低半部。
8086在进行存储器读写 不管进行字操作还是字节操作都是16位,如果是字节操作,则会将其未用到的8位忽略掉。在进行字操作时,其第一个字的地址一定为偶地址,对于奇地址的字进行读写操作时,CPU必须进行两次连续的偶地址操作,即忽略掉低地址的低半部以及高地址的高半部以此实现从奇地址读取一个字操作。所以8086在对存储器奇地址进行读写操作时,存在两次访存操作,需要两个总线周期,成为非规则字存放。而存放在偶地址的字只需要一个总线周期。
存储器的分段管理
由于CPU内部寄存器为16位,所以只能寻址64KB。所以程序把1MB存储空间划分出4个64KB逻辑段。每个逻辑段彼此独立,可以相连也可以重叠。
段间关系 | 含义 |
---|---|
完全重叠 | 两个段完全写在一起;比如将数据段完全写在代码段里 |
部分重叠 | 两个段有部分代码重叠在一起;比如将数据段一部分写在代码段里一部分写在代码段外面 |
连续 | 两个段为连续的;比如数据段下紧接着为代码段 |
隔开 | 两个段中间间隔其他段;比如在数据段和代码段中间加上一个堆栈段 |
看代码通俗易懂,直观👍
完全重叠:
Cseg segment;
Assume CS:Cseg,DS:Cseg;
DATA DB 20H,30H,40H;
Start:Mov AL,Cseg;
Mov CS,AL;
Mov DS,AL;
……
Cseg Ends;
End Start;
部分重叠:
Dseg segment;
DATA1 DB 20H,30H,40H;
Dseg Ends;
Cseg segment;
Assume CS:Cseg,DS:Dseg;
DATA2 DB 50H,60H,70H;
Start:Mov AL,Cseg;
Mov CS,AL;
Mov AL,Dseg;
Mov DS,AL;
……
Cseg Ends;
End Start;
连续:
Dseg segment;
DATA1 DB 20H,30H,40H;
Dseg Ends;
Cseg segment;
Assume CS:Cseg,DS:Dseg;
Start:Mov AL,Cseg;
Mov CS,AL;
Mov AL,Dseg;
Mov DS,AL;
……
Cseg Ends;
End Start;
隔开://其中的代码段和代码段为隔开
Dseg segment;
DATA1 DB 20H,30H,40H;
Dseg Ends;
SSeg segment stack;
stp db 100 dup(0);
Sseg Ends;
Cseg segment;
Assume CS:Cseg,DS:Dseg;
Start:Mov AL,Cseg;
Mov CS,AL;
Mov AL,Dseg;
Mov DS,AL;
……
Cseg Ends;
End Start;
地址 | 含义 |
---|---|
段地址 | 每个逻辑段的起始地址 |
偏移地址 | 也叫有效地址(EA),相对于段基地址的偏移量 |
逻辑地址 | 使用段地址:逻辑地址表示 |
逻辑地址计算 即xxxxH:yyyyH表示,表示有效地址为xxxx * 16+yyyyH
即物理地址=段地址x16+段内偏移地址
例:
1234H:0002H表示的物理地址为12342H
3A34H:0453H表示的物理地址为3A793H
物理地址与逻辑地址的区别:
- 物理地址为CPU访存使用的地址,逻辑地址为程序员编程使用的地址。
- 物理地址唯一,有效地址不唯一,不同的有效地址可以指向同一物理地址。
逻辑段的使用
- 代码必须在代码段
- 堆栈必须在堆栈段
- 数据