目录
第一章 计算机系统概述
台式个人计算机的组成:
- 主机
- 主板
- CPU
- 内存
- 硬盘
- 声卡
- 显卡
- 网卡
- 键、鼠、显示器
1.0、冯诺依曼结构
控制器、存储器、运算器、输入设备、输出设备
特点
- 采用二进制
- 采用程序存储方式
- 计算机组成结构:上述5部分
1.1、系统组成与结构-三个层次
微处理器 → 微型计算机 → 微型计算机系统
1.2、微处理器系统的总线结构
系统总线连接CPU、存储器和I/O设备,用于传递数据、地址和控制信息。
地址总线:装载地址信号,确定被访问的存储单元、I/O接口,是单向总线。地址线的根数决定了CPU能直接访问的存储空间。
控制总线:CPU向其他部件传送控制信号,其他部件向CPU传送状态信号和请求信号。
数据总线:装载数据和指令代码。
第二章 16位和32位微处理器
2.0、基本寄存器:
通用寄存器:
AX: 累加寄存器 add register
BX: 基址寄存器 basic
CX: 计数寄存器 count
DX: 数据寄存器 data
BP: 基址指针寄存器 basic point
SP: 堆栈指针寄存器 stack point
SI: 源变址寄存器 source index
DI: 目的变址寄存器 destination index
段寄存器:
CS: 代码段 code segment
DS: 数据段 data
ES: 附加段 extra
SS: 堆栈段 stack
32位微处理器
FS: 附加段
GS: 附加段
指令指针和标志寄存器:
IP: 指令指针寄存器 instruction point
FLAGS: 标志寄存器
寄存器的使用规则:
- CS(代码段) → IP 指令指针寄存器
- SS(堆栈段) → BP、SP
2.1、微处理器逻辑结构的演变
2.1.1、8086逻辑结构
- 1978 :8086 1979 :8088
- 16位微处理器
- 20根地址线, 1MB的寻址空间
- 4或6字节指令Cache
2.1.2、8086CPU内部结构
8086CPU内部结构按功能可分为2个部分:
1、总线接口单元BIU ( Bus Interface Unit )
负责 与 存储器、I/O端口 传送数据
断句很重要。这里的存储器是指内存,CPU可直接读取内存中的数据。I/O接口:主机通过I/O接口来与外部设备进行数据的交换。比如打印机没纸了,返回一个信号给CPU请求中断。
2、执行单元EU ( Execution Unit )
负责指令的执行
如何记住这些部件?很简单,把这些部件运用的场景,和关系捋一遍。
BIU 总线接口单元
这还得从主机三大件说起......
主机三大件包括:CPU、内存、主板。主板上就集成了I/O接口。
因为CPU要与 内存、I/O接口进行数据交互,这势必就要找到他们的地址。而我们知道,要找一个地址,先是要找到他的段地址的。这就引出了段地址寄存器。段寄存器中有个特殊的寄存器名为代码段寄存器( CS ),他是与IP指令指针寄存器搭配使用的,这就引出了IP指令指针寄存器。
先引入物理地址的计算公式 :
物理地址 = 段基址 + 偏移地址
8086是有20根地址线的,即20位,我们的段寄存器和通用寄存器都是16位的,我们该怎么实现与20位进行匹配呢?把段寄存器左移4位,后面补0就好了。完成这一步骤需要用到地址加法器。
这样,我们的段基址就大功告成了,只差把段基址送到EU与通用寄存器存储的偏移地址相加就可以得到物理地址了。可是CPU嫌弃BIU送的太慢了,这时,BIU就想了个办法,捣鼓了个指令队列缓冲器。到此,BIU的工作就完成了。
EU 执行单元
接下来,EU要计算物理地址了,EU中是有通用寄存器,存储着偏移地址的。
要进行运算,那肯定是有 ALU 运算逻辑单元的咯。得到结果之后,还要检查最高位的进位,观察是否存在溢出问题,这就引出了标志寄存器。
2.1.3、总结
总线接口单元(BIU)
功能:
- 从内存中取指令传入指令预取队列
- 负责与内存或I/O接口之间的数据传送
总线接口单元(总线接口部件)是通过数据总线、地址总线、控制总线与外部取得联系的。
执行单元(EU)
功能:执行指令
从指令队列中取指令代码 --> 译码 --> 在ALU中完成数据的运算 --> 运算结果的特征保存在标志寄存器FLAGS中。
EU和BIU的关系:
指令预期队列的存在使EU和BIU两个部分可同时进行工作,从而:
- 提高了CPU的效率
- 降低了对存储器存取速度的要求
2.2、32位微处理器
1985年,Intel推出80386 从16位体系结构过渡到32位体系结构
- 流水线、指令重叠执行技术
- 虚拟存储器技术
- 存储器管理分段分页保护技术
CPU片内有存储器管理部件MMU
- 可实现分段和分页管理
- 有4级保护功能,因此程序不能访问段所规定区域以外的单元,数据也不能写到禁止的段里。
80386、80486、Pentium都是32位的微处理器
- 具有32位寄存器和数据通道
- 支持32位地址和数据类型
2.2.1、80386的逻辑结构
80386分为三大部件:总线接口部件、中央处理部件、存储器管理部件
存储管理部件
- 分段部件
- 分页部件
- 为了加快CPU访问内存的速度,还设有高速缓冲存储器
页是机械划分的,没4K为一页。存储器是按段来组织的,每个段包含若干页
拿着段选择码去段描述表里找特定的描述符,描述符里给出了32位的段基址和20位的段界限
线性地址 = 段基址 + 偏移量
如果没有分页,那线性地址就相当于物理地址
如果有分页,再分段,那物理地址还要由线性地址转化一下
2.2.2、80386先进的体系结构
- 外部数据总线为64位,数据传输量提高了一倍
- 设置片内代码cache和数据cache
- 两条指令流水线并行执行
- 片内集成FPU(浮点运算器),采用硬件实现浮点运算
- 采用分段和分页两级存储管理机制
- BTB 预判
CISC 和 RISC 相结合
C complex 复杂指令
R 精简指令
2.2.3 Pentium的寄存器
段寄存器:CS、DS、ES、SS、FS、GS
实模式下,逻辑地址空间中存储单元的地址由段值和段内偏移两部分组成。
在保护模式下,是由段选择子和段内偏移两部分组成的,与实模式相比,段选择子取代了段值。
段寄存器中的内容就是段选择子,但段选择子不能直接获得段基址,而是要用段选择子的值从段描述表里找到特定的段描述符。
每个描述符对应一个段,描述符中含有对应段的起始地址(段基址),还有段的一些其他的信息。
段描述符是存储在硬盘中的,不能放内存,因为占用太大。描述符表是由操作系统建立的,表里的每个段描述符有特定的编号。
段选择子的前13位是描述符索引,用来找到表中的对应的描述符
TI: 描述符指示位(0/1)
- 0 : GDT 全局描述符表 global description table
- 1 : LDT 局部描述符表 local
RPL 2位二进制,4种状态, 0为最高特权级
总线周期控制信号:
- D/C# 数据/控制信号输出(区分传输数据还是指令)
- M/IO# 存储器和I/O访问选择信号输出,高电平访问M
- W/R# 读/写信号输出
- LOCK# 总线封锁信号输出。总线被锁定时,其他总线主设备不能获得总线控制权,从而确保CPU完成当前操作。
- BRDY# 突发就绪信号(外设准备好了)
- NA# 下一地址有效信号
系统控制信号:
- INTR 可屏蔽中断请求信号
- NMI 非屏蔽中断请求信号
- RESET 系统复位信号
- CLK 系统时钟信号
- INIT 初始化信号
RESET : 2个时钟周期内终止程序进行复位
INIT : 等当前指令结束后内部才复位
总线仲裁信号
- HOLD 总线请求信号,由其他主线主设备发出,请求CPU让出总线控制权
- HLDA 总线请求响应信号 ,表示CPU已经让出了控制权
- BREQ 总线周期请求信号,由CPU发出,告示CPU正在使用总线
- BOFF 强制让出总线信号,CPU立即放弃总线控制权
BOFF无响应信号,HOLD有响应信号
一个总线周期由多个总线状态组成
Pentium的几种总线状态定义
- T1状态:地址和状态信号有效, ADS#信号有效,(可以进行寻址)
- T2状态 数据出现在数据总线上,且BRDY#有效(外设准备好了)
- T12状态 结合前两种状态
- T2p状态 外设或者存储器速度较慢时处于的一种状态(正在传输数据,但BRDY#还无效)
- Td状态 读写操作切换的过渡状态,需要一个时钟周期进行过渡
- Ti 状态 空闲状态 BOFF#和 RESET可让CPU进入该状态
第三章 Pentium的指令系统
指令的格式:操作码 + 操作数
一条指令通常包含一个或两个操作数(源操作数、目的操作数)
操作数放在
- 寄存器
- 存储器
- 指令区(代码区)(立即数)
立即寻址和寄存器寻址
立即寻址:操作数直接放在指令中,紧跟在操作码之后
寄存器寻址:在指令中指出所使用的寄存器
指令所要的操作数存储在寄存器中
输入、输出端口寻址
传送数据
总结:
- 立即数不能作为目的操作数,CS、IP、EIP不能作为目的操作数,同时IP也不能作为源操作数
- 两个内存之间,以及两个段寄存器之间不能直接传送数据
- 立即数不能直接传送给段寄存器
- EBX、ESI、EDI、BX、SI、DI间接寻址时,默认的段寄存器是DI 用ES,必须 ES: [ ]
- EBP、ESP、BP、SP间接寻址时,默认的寄存器是SS
- SI和DI不能同时用于源或目的操作数
- BX和BP不能同时用于源或目的操作数
LEA指令和MOV指令的区别
MOV BX, OFFSET BUFFER
LEA BX,BUFFER
这两条指令的执行效果是完全相同的。
堆栈操作指令
低地址为栈顶,sp指向栈顶。堆栈操作只能按字或双字进行。
入栈时,高字节对应高地址。
但对于机器码比如:330001 是按顺序写的,也就是说33是对应低地址的字节。
堆栈操作指令注意点:
- 堆栈操作总是按字或双字进行的。
- 推入PUSH指令,SP减2或4 ,高字节对应高地址
- 允许PUSH CS ,但不允许 POP CS