微机原理知识汇总
计算机组成
冯诺依曼计算机架构
- 以运算器为核心、以存储程序原理为基础
- 组成
- 运算器
- 控制器
- 存储器
- 输入设备
- 输出设备
- 采用二进制进行运算,数据与程序均以二进制形式存放在存储器中
- 将计算任务分解为若干步骤,每个步骤用指令实现,指令序列即为程序
- 在CPU的控制下自动进行运算
- 特点
- 程序存储,共享数据,顺序执行
- 属于顺序处理机,适合确定的算法和数值数据的处理
- 不足
- 与存储器间大量数据交互,对总线要求高
- 执行顺序由程序决定,对大型复杂任务较困难
- 以运算器为核心,处理效率较低
- 由PC(
Program Count
)控制执行顺序,难以实现真正的并行处理
微型计算机的工作过程
- 取一条指令的工作过程
- 指令所在地址赋给程序计数器PC并送到地址寄存器AR
- PC自动地址加1,AR的内容不变
- 将地址寄存器AR的内容放在地址总线上,并送至内存储器,经地址译码器译码,选中相应单元
- CPU控制器发出读指令
- 在读指令的控制下,把选中内存单元的内容读到数据总线DB
- 将读出的内容经过数据总线送到数据寄存器DR
- 指令译码,DR将指令送到指令寄存器IR,然后再送到指令译码器ID
微处理器
指令的执行过程
执行一条指令需要执行的步骤
- 从存储器中取出指令
- 指令译码
- 读操作数(如果需要)
- 执行指令
- 写结果(如果需要)
微处理器组成
- 运算器
- 组成
- 算术逻辑单元
- 通用或专用寄存器组(可单独看成一个组成部分)
- 内部总线
- 功能
- 实现数据的算术运算及逻辑运算
- 组成
- 控制器
- 组成
- 程序计数器
- 指令寄存器
- 指令译码器
- 时序控制部件
- 微操作控制部件
- 功能
- 指令控制
- 时序控制
- 操作控制
- 组成
8086/8088
- 16位CPU
- 20位地址线,可寻址1M空间
- 8086总线宽度
16
位,8088总线宽度8
位 - 采用+5V电源,频率位5MHz
- 采用并行流水线工作方式,通过设置指令预取队列实现(相当于有指令缓冲区)
- 对内存空间实行分段管理
- 支持多处理器系统
- 内部结构框图
8086/8088管脚及功能
- 管脚示意图
- : 地址、状态复用的引脚,三态输出
- : 中8位地址信号,三态输出
- $AD_0-AD_7$: 地址、数据分时复用的双向信号线,三态
- $IO/\overline{M}$: 输入输出/存储器控制信号,三态。低电平访问存储器,高电平访问$I/O$端口
- $\overline{WR}$: 写信号输出,三态。低电平为写操作
- $DT/\overline{R}$: 数据传送方向控制信号,三态。高电平CPU发送数据,低电平CPU接受数据
- $\overline{DEN}$: 数据允许输出,三态。低电平表示DB的数据有效
- $ALE$: 地址锁存信号,三态输出。高电平有效
- $\overline{RD}$: 读选通信号,三态输出,低电平有效
- $READY$: 外部同步控制输入信号,高电平有效
- $INTR$: 可屏蔽中断请求输出信号,高电平有效
- $NMI$: 非屏蔽中断请求输入信号,上升沿触发
- $\overline{INTA}$: 中断响应信号输出,低电平有效
- $HOLD$: 总线保持请求信号输入,高电平有效
- $HLDA$: 总线保持响应信号输入,高电平有效
- 工作模式
- 最小模式
系统中只有8086/8088一个处理器,所有的控制信号都由8086/8088CPU产生 - 最大模式
系统可包含一个以上的处理器
- 最小模式
当$MN/\overline{MX}$加上低电平时,CPU工作在最大模式,反之则在最小模式下
8086/8088寄存器
数据寄存器
为避免累赘,例如AL,AH类8位寄存器不列举
AX(Accumulator)
: 累加器,通常用作数据传输媒介BX(Base)
: 基址寄存器,通常用作存放内存的基地址,常与DS配合使用CX(Count)
: 计数寄存器,在循环和串操作指令中做计数器DX(Data)
: 数据寄存器,在寄存器间接寻址的I/O指令中存放I/O端口地址
地址指针寄存器
SP(Stack Pointer)
: 堆栈指针寄存器,它指向栈顶BP(Bace Pointer)
: 基址指针寄存器,常用来存放内存的基地址,常配合SS来使用
变址寄存器
SI(Source Index)
: 源变址寄存器,用作索引指针DI(Destination Index)
: 目的变址寄存器,用作索引指针
段寄存器
存放相应段的段地址
CS(Code Segment)
: 代码段寄存器SS(Stack Segment)
: 堆栈段寄存器DS(Data Segment)
: 数据段寄存器ES(Extra Segment)
: 附加段寄存器
控制寄存器
IP(Instructions Pointer)
: 指令指针寄存器FLAGS
: 标志寄存器
物理地址与逻辑地址的转换(存储器分段)
物理地址 = 段基址 * 16 + 段内偏移地址
如段地址为1000H
,偏移地址为1234H
,则
物理地址 = $1000H * 16 + 1234H = 10000H + 1234H = 11234H$
堆栈操作
- 每次压栈(PUSH)和退栈操作(POP)均以字(双字节)为单位
- 栈的增长方向是从高地址到低地址
如将82F0H
压栈,[SP] = F0H
,[SP+1] = 82H
,如下图所示
内存中的数据特点
- 数据再内存中从低地址到高地址顺序存放
- 数据位大于8位时,高字节放在高地址,低字节放在低地址
- 数据的地址指它的最低字节所在内存单元的地址
系统总线
- 按传输数据类型分类
- 数据总线
- 地址总线
- 控制总线
- 按相对CPU位置分类
- 片内总线
- 片外总线
按层次结构分
- CPU总线
- 系统总线
- 外部总线
总线结构
- 单总线结构:简单,但竞争严重
- 多总线结构:性能高,但组成复杂
性能指标
- 带宽
- 位宽
- 工作频率
$总线带宽 = (位宽/8)*(工作频率/每个存取周期的时钟数)$
8086/8088指令系统
寻址方式
- 立即寻址
eg.MOV AX, 1200H
- 直接寻址
eg.MOV AX, [8000H]
- 寄存器寻址
eg.MOV AX, BX
- 寄存器间接寻址
eg.MOV AX, [BX]
- 寄存器相对寻址
eg.MOV AX, [BX + 1]
- 基址-变址寻址
指令中不允许同时出现两个基址寄存器或者两个变址寄存器
eg.MOV AX, [BX][SI]
orMOV AX, [BX + SI]
- 基址-变址-相对寻址
eg.MOV AX, [BX][SI]5
数据传送指令
MOV
: 一般传输指令(源操作数和目标操作数不能同时为存储器操作数)PUSH/POP
: 堆栈操作指令PUSHF/POPF
: 将标志寄存器压栈或者从堆栈弹出XCHG
: 交换指令IN/OUT
: 输入输出指令LEA
: 取偏移地址指令
算术运算指令
加法指令
ADD
: 不考虑进位的加法指令ADC
: 带进位的加法指令INC
: 加一指令
减法指令
SUB
: 不考虑借位减法指令SBB
: 带借位的减法指令DEC
: 减一指令NEG
: 求补指令CMP
: 比较指令
乘法指令
MUL
: 乘法指令
除法指令
DIV
: 除法指令
逻辑运算与移位指令
逻辑指令
AND
: 逻辑‘与’指令OR
: 逻辑‘或’指令NOT
: 逻辑‘非’指令XOR
: 逻辑‘异或’指令TEST
: 测试指令
移位指令
SAL
: 算术左移指令SAR
: 算术右移指令SHL
: 逻辑左移指令SHR
: 逻辑右移指令ROL
: 不带进位的循环左移指令ROR
: 不带进位的循环右移指令RCL
: 带进位的循环左移指令RCR
: 带进位的循环右移指令
串操作指令
要预先设置源串指针(DS:[SI]
),目标串指针(ES:[DI]
),重复次数(CX
),操作方向(DF
),使用CLD or STD
重复前缀
共同特点,使用前要设置CX,每重复一次CX自减1,为0时停止
REP
: 无条件重复REPE(Repeat if Equal)
: 相等重复REPZ(Repeat if Zero)
: 为0重复REPNE(Repeat if Not Equal)
: 不相等重复REPNZ(Repeat if Not Zero)
: 不为0重复
串操作指令
每次循环会使SI和DI自增一个字或者字节(取决于指令)
MOVS, MOVSB, MOVSW
: 串传送CMPS, CMPSB, CMPSW
: 串比较SCAS, SCASB, SCASW
: 串扫描LODS, LODSB, LODSW
: 串装入STOS, STOSB, STOSB
: 串送存
每种串操作有三种格式,第一种格式是需要手动设置操作数的,第二种是默认使用预先设置的源串指针(DS:[SI]
),目标串指针(ES:[DI]
)来按字节
操作,第三种则是按字
操作
程序控制指令
转移指令
JMP
: 无条件转移指令(加修饰符FAR
可段间调用)JC/JNC
: 判断CF的状态,常用于比大小JZ/JNZ
: 判断ZF的状态,常用于循环体的结束判断JO/JNO
: 判断OF的状态,常用于有符号数的溢出判断JP/JPE
: 判断PF的状态,用于判断运算结果低八位1的个数是否为偶数JA/JAE/JB/JBE
: 判断CF或CF+ZF的状态,常用于无符号数的比较
更多指令查看下表
循环指令
循环次数由预先设置的CX决定
LOOP
: 无条件循环指令
过程调用和返回
调用时将IP
压入堆栈,如果是段间调用(FAR
)还要先将CS
压入堆栈
CALL
: 调用子程序(加修饰符FAR
可实现段间调用)RET
: 从堆栈中弹出IP
,返回到原程序
中断指令
INT
: 中断程序调用,后跟中断类型码执行过程
- 将FLAGS压入堆栈
- 将INT指令的下一条指令的
CS
、IP
压栈 - 由中断类型码乘4获得中断向量存放的地址
- 将中断向量(中断服务程序入口地址)放入
CS
、IP
- 转入中断服务程序运行
IRET
: 中断程序返回,恢复原程序的CS
、IP
、FLAGS