微型计算机的结构
微处理器的功能结构
CPU的基本结构:
ALU,寄存器,中断系统,CU
8086微处理器的内部功能结构:
在外部,MPU通过总线(地址总线AB,数据总线DB,控制总线CB)与外部设备相连,
如I/O接口,RAM,ROM等.其中I/O接口又与键盘,鼠标,显示屏等连接.
执行2+7
首先从右侧地址译码器开始,读入第一条代码,MOV AX, 2
(此处地址译码器在RAM等存储单元,20位)
此时数据总线将2存到数据暂存器里,进而存到AX寄存器里
然后执行下一个地址的命令,即ADD AX,7
此时将数据暂存器成为7,然后在运算器中与2相加,得到9
最终将AX值改为9
然后再执行下一个命令MOV BX,AX
将AX中数据给到BX.
此时BX就变成了9
指令的执行过程
-
取指令.CPU从存储器中读取一条指令并放入指令寄存器
-
指令译码:指令寄存器中的指令经过译码,决定该指令进行何种操作,操作数在哪里
-
执行指令:
- 存取操作数
- 进行运算
-
修改指令计数器
8086处理器的内部功能结构:执行单元(EU) + 总线接口单元(BIU)
指令流水线技术:
取指1 -> 译码1 -> 执行1 ->取指2 -> 译码2 ->执行2 ->…
五级流水线中一条指令的执行有5个基本步骤:
- IF 取指令
- ID 指令译码
- EX 执行
- MEM 内存访问
- WB 回写
优化技术
1.超标量技术:
1.每个时钟时间内,可以并发执行多条独立指令
2. 不能调整指令的执行顺序
2.超流水线技术
1. 在一个时钟周期内再分段
2. 再一格时钟周期内一个功能部件使用多次
3. 不能调整指令的执行顺序
8086处理器的内部寄存器
8086/8088内部共有14个16位寄存器,按照功能分成三类
-
通用寄存器:
- 数据寄存器AX,BX,CX,DX
- 指针寄存器SP,BP
- 变址寄存器SI,DI
-
控制寄存器:
- 指令指针寄存器IP -> 指向下一条指令的偏移地址
- 标志寄存器FLAGS
-
段寄存器:
- 代码段寄存器CS
- 数据段寄存器DS
- 堆栈寄存器SS
- 附加段寄存器ES
数据寄存器AX,BX,CX,DX:
可以按字访问(16位),也可以按字节访问(8位)
地址指针寄存器:
-
用来指示存取位于当前堆栈段中的数据所在的地址
-
堆栈指针寄存器SP指示当前堆栈的栈顶偏移位置
-
基址指针寄存器BP指示堆栈段中某一块数据区的首地址
变址寄存器:
-
用于存放当前数据串的偏移地址
-
源变址寄存器SI存放源数据串的偏移地址
-
目标变址寄存器DI存放目的数据串的偏移地址
指令指针寄存器IP:
- 在CPU正常运行时,IP中的BIU要取的下一条指令的偏移地址,
- IP在程序运行中能自动修正,使其始终指向下一条指令
标志寄存器FLAGS:
- FALGS只用了9位,即6个状态标志位和3个控制标志位
- 状态标志位反映算数或者逻辑运算后的结果的状态
- 控制标志位用来控制CPU的操作
FLAGS寄存器:
OF -> 溢出标志(倒数第二位和倒数第一位是否进位的异或值).或者说是结果超过范围(>32767 或 < -32768)为1,否则为0
DF -> 方向标志 -> DF=1 -> 自动减量指令 -> 从高地址到低地址来处理数据.反之从最低位到最高位.
IF -> 中断标志 -> IF=1时,允许CPU接收中断请求.
TF -> 跟踪标志 -> TF=1时,处理进入单步方式,便于调试.此时每条指令后CPU都会产生一个内部的中断.
SF -> 符号标志 -> SF与最高位相同,最高位为1则为1.
ZF -> 零标志 -> 结果为0则为1
AF -> 半进位标志 -> 低半字节(低4位)向高半字节有进位或者借位,AF=1,否则0.
PF -> 奇偶标志 -> 低8位的1为偶数,则为1.否则为0.
CF -> 进位标志 -> 无符号运算状态下最高有效位产生进位则CF=1,否则0
注意区别AF,CF和OF:AF是半字节的进位或者借位,要看4位处;
而CF是在最高位且是无符号状态下的进位,就是在无符号的情况下看结果是否大于等于100000…,(多一位);
而OF是有符号状态下的进位.即超出了-pow(2,n)-pow(2,n)-1的范围.求法是最高位运算的进位 ⊕ 次高位运算的进位
段寄存器:
CS代码段寄存器 -> 存放程序当前使用代码段的段地址
SS堆栈寄存器 -> 存放当前使用的堆栈段的段地址
DS数据段寄存器 -> 存放程序当前用到的数据段的段地址
ES附加段寄存器 -> 存放程序当前使用的附加段的段地址,也可以用来存放数据
8086的存储器组织
存储器的分段.
物理地址: CPU对存储器进行访问时实际寻址所用到的地址.
8086中物理地址位20位的二进制
逻辑地址:包括段地址和偏移地址两部分.
段地址左移4位 + 偏移地址
寻址方式
指令的两个要素:
要做什么? -> 助忆符
操作对象是什么? -> 操作数
操作数的种类
立即操作数
存储器操作数
寄存器操作数
I/O端口操作数
寻址方法
对于立即操作数(操作数在指令码里)
可以立即寻址 如MOV AH 4CH
对于寄存器操作数(操作数在寄存器里)
可以寄存器直接寻址,如MOV AH, BH
对于存储器操作数(操作数在存储器里)
-
存储器直接寻址(操作数含地址)
-
寄存器间接寻址(操作数含寄存器,寄存器含地址)
-
基址寻址(操作数含基址寄存器和偏移量,所以拿到寄存器写的地址再加上偏移量获得地址)
如 MOV AX, [BX + 10], BX通常存地址,此处可以默认它指向DS,那么BX+10 就是DS段偏移10 -
变址寻址(和4差不多,但是寄存器是SI或者DI,而这两个是变址寄存器)通常用于数组遍历,字符串等
如 MOV CX,[SI + 5],SI可以是数组开头,然后通过+5获得数组第五个数 -
基变址寻址(又变个花样,基址寄存器的基址 + 变址寄存器的变址 + 偏移量)用于多维数组访问
如 MOV DX, [BX + SI + 8]
当计算地址时: 首先找到DS地址,那么就是DS * 16 + BX + 偏移
如果是SS,那么就是 SS * 16 + BP + 偏移
记住BX指向了DS(数据段),而BP指向了SS(堆栈段)