编译原理与接口技术复习总结-part1微处理器部分
- 8088/8086简述
- 通用寄存器
- 段寄存器
- 状态标志寄存器Flags
- 指令指针寄存器 IP
- 8088/8086的基本结构
- 存储器的结构
- 存储器的分段管理
- 逻辑段的使用
- 堆栈操作
- 入栈指令 PUSH
- 出栈指令POP
- 8088工作模式以及引脚信号
- 工作模式
- 基本引脚信号
- AD15~AD0
- A19/S6~A16/S3
- CLK
- RD ‾ \overline{\text{RD}} RD
- WD ‾ \overline{\text{WD}} WD
- READY
- INTR
- NMI
- RESET
- MN/ MX ‾ \overline{\text{MX}} MX
- Vcc
- GND
- INTA ‾ \overline{\text{INTA}} INTA
- ALE
- DNE ‾ \overline{\text{DNE}} DNE
- DT/ R ‾ \overline{\text{R}} R
- IO/ M ‾ \overline{\text{M}} M
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;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
部分重叠:
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;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
连续:
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;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
隔开://其中的代码段和代码段为隔开
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;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
地址 | 含义 |
---|---|
段地址 | 每个逻辑段的起始地址 |
偏移地址 | 也叫有效地址(EA),相对于段基地址的偏移量 |
逻辑地址 | 使用段地址:逻辑地址表示 |
逻辑地址计算 即xxxxH:yyyyH表示,表示有效地址为xxxx * 16+yyyyH
即物理地址=段地址x16+段内偏移地址
例:
1234H:0002H表示的物理地址为12342H
3A34H:0453H表示的物理地址为3A793H
物理地址与逻辑地址的区别:
- 物理地址为CPU访存使用的地址,逻辑地址为程序员编程使用的地址。
- 物理地址唯一,有效地址不唯一,不同的有效地址可以指向同一物理地址。
逻辑段的使用
- 代码必须在代码段
- 堆栈必须在堆栈段
- 数据默认在数据段,也可以在其他段。
- 堆栈段CS需配合SP堆栈指针一起使用
Mov AL,[BX] -> Mov AL,DS:[BX]
Mov AL,[SI] -> Mov AL,DS:[SI]
Mov AL,[BP] -> Mov AL,SS:[BP]
Mov AL,CS:[BP] -> Mov AL,CS:[BP] //段超越
- 1
- 2
- 3
- 4
段超越时只需要在间址前加段地址即可
堆栈操作
入栈指令 PUSH
Push AX的流程:
- sp = sp - 1
- [sp] = AH
- sp = sp - 1
- [sp] = AL
地址 | step1 | step2 | step3 | step4 | step5 |
---|---|---|---|---|---|
sp | xx <- SP | xx | xx | xx | xx |
sp-1 | ? | ? <-SP | AH<-SP | AH | AH |
sp-2 | ? | ? | ? | ? <-SP | AL <-SP |
出栈指令POP
Pop AX的流程:
- [sp] = AL
- sp = sp + 1
- [sp] = AH
- sp = sp + 1
地址 | step1 | step2 | step3 | step4 | step5 |
---|---|---|---|---|---|
sp | xx <- SP | xx | xx | xx | xx <- SP |
sp-1 | AH | AH | AH <- SP | ? <- SP | ? |
sp-2 | AL <- SP | ? <- SP | ? | ? | ? |
弹出之后数据应该保持不变,?就是直观一点,表示数据已经弹出。
8088工作模式以及引脚信号
工作模式
8088/8086两种工作模式:最大组态模式以及最小组态模式,由 MN /
MX
‾
\overline{\text{MX}}
MX 引脚控制,当高电平时选择最小组态模式,当低电平时选择最小组态模式。上课用的都是最小组态模式。
工作模式 | 含义 |
---|---|
最小组态模式 | 1.构成小规模的应用系统 2.8088本身提供所有系统总线信号 3.其高位对应高地址,低位对应低地址 |
最大组态模式 | 1.构成较大规模的应用程序 2.与总线控制器8288共同形成系统总线信号 3.其高位对应低地址,低位对应高地址 |
基本引脚信号
以下引脚信号以最小组态工作模式为主,不讲最大组态工作模式
AD15~AD0
<->
8088:AD0~AD7 数据总线与地址总线共用,AD8~AD15仅作为地址总线使用。
8086: AD0~AD15数据总线与地址总线共用。
A19/S6~A16/S3
<->
地址/状态分时公用引脚。当CPU进行读写操作时,先用于传输高四位地址。当地址锁存之后。在传送CPU的状态信息S3~S6
S6为0表示AD0~AD15作为数据线使用;为1表示作为地址线使用
S5为0表示CPU关中断;为1表示CPU开中断
S4、S3共同选择段寄存器
S4 | S3 | 段寄存器 |
---|---|---|
0 | 0 | ES |
0 | 1 | SS |
1 | 0 | CS |
1 | 1 | DS |
CLK
<- 时钟输入信号,提供了CPU和总线控制器的定时操作。
8088的标准工作时钟为5MHz
RD ‾ \overline{\text{RD}} RD
-> 读信号,用于内存储器或者I/O设备进行读操作。
WD ‾ \overline{\text{WD}} WD
-> 写信号,用于内存储器或者I/O设备进行写操作。
READY
<- 就绪信号,当其为高电平时,表示内存/外设准备就绪,可以读入数据或者写出数据。当其为低电平时,表示内存/外设还未准备好,此时CPU则会插入Tw等待周期,直到READY为高电平,才能完成数据的传输。
INTR
<- 可屏蔽中断请求信号。在每个指令周期的最后一个时钟周期通过该信号线查看是否有中断请求。如果有中断请求(该引脚为高电平)同时CPU处于开中断状态(IF=1),CPU则会执行完该条指令之后相应中断。通过总线控制器8288或CPU发出中断相应信号 INTA ‾ \overline{\text{INTA}} INTA,之后根据中断控制器提供的中断向量进入中断服务程序中处理中断。
NMI
<- 不可屏蔽中断请求信号。当CPU监测到改进叫输入一个上升沿时(低电平跳变成高电平),CPU在执行完当前指令后,进行中断处理,该引脚不受中断允许为(IF)影响。
RESET
<- 复位信号。当RESET至少维持四个时钟周期的高电平才有效。当检测到复位信号时,CPU将结束当前操作。并对标志寄存器、IP、DS、ES、SS以及指令队列清零,CS置为FFFFH,当复位信号变为低电平之后,CPU从FFFF0H开始执行程序。
MN/ MX ‾ \overline{\text{MX}} MX
<- 工作模式控制引脚。当输入为高电平时为最小组态工作模式,当输入为低电平时为最大组态模式
Vcc
<- 电源引脚 +5V
GND
<- 接地引脚
INTA ‾ \overline{\text{INTA}} INTA
-> 中断相应信号。CPU相应中断时,在两个连续总线周期内发两个 INTA ‾ \overline{\text{INTA}} INTA信号。第一个信号为通知外设中断请求被相应,并要求外设在第二个信号时向数据总线传输中断类型码。CPU在第二个信号获取中断类型号,中断相应结束之后CPU通过中断类型号,找到中断服务程序的入口地址,执行中断服务程序。
ALE
-> 地址锁存信号。由于CPU的地址线与数据线公用引脚,所以当总线周期的T1状态时发出,弥补地址信号在其余状态的丢失。
DNE ‾ \overline{\text{DNE}} DNE
-> 数据允许信号。从T2开始低电平有效,用作总线数据的驱动器,表示当前总线上正在传输数据。
DT/ R ‾ \overline{\text{R}} R
-> 数据收发信号。用于表示当前总线上数据的流向。
低电平时表示接收数据,即数据输入CPU。
高电平时表示发送数据,即数据从CPU输出。
IO/ M ‾ \overline{\text{M}} M
-> IO设备/存储器访问
当输出为高电平表示CPU即将访问I/O端口,此时地址总线提供16位I/O端口地址。
当输出为低电平表示CPu即将访问存储器,此时地址总线提供20位存储器地址。
该引脚视情况而定,有的为M/
IO
‾
\overline{\text{IO}}
IO,则高电平访问存储器,低电平访问I/O端口。