寄存器(CPU工作原理)
概述
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连
寄存器是CPU内部的小型存储单元,用于快速存取数据和指令
CPU通过执行指令来处理数据,寄存器提供了快速的读写能力,从而提升了整体性能
区别
内部总线实现CPU内部各个器件之间的联系
外部总线实现CPU和主板上其它器件的联系
寄存器概述
8086CPU有14个寄存器,它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TP | SF | ZF | AF | PF | CF |
1. 通用寄存器
- AX(累加寄存器):主要用于算术运算,常用于输入输出操作。
- BX(基址寄存器):常用于存储数据的基地址,可以用于寻址。
- CX(计数寄存器):用于循环控制和计数操作,尤其在字符串操作中。
- DX(数据寄存器):用于存储I/O端口地址和某些算术运算的高位结果。
2. 段寄存器
- CS(代码段寄存器):指向当前执行代码的段。
- DS(数据段寄存器):指向数据存储的段。
- SS(堆栈段寄存器):指向当前堆栈的段,涉及函数调用和局部变量存储。
- ES(附加段寄存器):通常用于额外的数据存储和操作,特别是在字符串操作时。
3. 地址寄存器
- SP(堆栈指针):指向当前堆栈顶端的地址。
- BP(基指针):用于堆栈操作,通常用于访问函数参数和局部变量。
- SI(源索引寄存器):在字符串操作中用作源数据的起始地址。
- DI(目标索引寄存器):在字符串操作中用作目标数据的起始地址。
4. 控制寄存器
- IP(指令指针寄存器):指向下一条要执行的指令地址,与CS配合使用。
- FLAGS寄存器(PSW程序状态字):用于存储处理器的状态信息,包括算术运算的结果标志(如零标志、进位标志等)。
标识
条件码标志
- 零标志(ZF)
- 定义:当运算结果为零时,ZF被置为1;否则为0。
- 用途:用于判断结果是否为零,常用于条件跳转指令。
- 进位标志(CF)
- 定义:在无符号数运算中,如果发生进位,则CF被置为1;否则为0。
- 用途:用于判断算术运算中的溢出,特别是无符号数的加法和减法。
- 符号标志(SF)
- 定义:根据运算结果的最高位(符号位)来设置,如果结果为负,SF为1;否则为0。
- 用途:用于判断结果的正负,常用于条件跳转。
- 溢出标志(OF)
- 定义:在有符号数运算中,如果结果溢出(超出可表示的范围),则OF为1;否则为0。
- 用途:用于判断有符号数运算的结果是否有效。
- 辅助进位标志(AF)
- 定义:在进行BCD(十进制编码)运算时,如果低四位发生进位,则AF被置为1。
- 用途:用于BCD运算中的条件判断。
- 奇偶标志(PF)
- 定义:如果运算结果的1位数量为偶数,则PF为1;否则为0。
- 用途:用于某些特定的错误检测算法。
控制标志
- 方向标志(DF)
- 定义:控制字符串操作的方向,DF为1表示从高地址到低地址,DF为0表示从低地址到高地址。
- 用途:影响字符串处理指令的执行方向。
- 中断标志(IF)
- 定义:控制中断的使能状态,IF为1表示允许中断;为0则禁用中断。
- 用途:用于处理中断请求。
- 跟踪标志(TF)
- 定义:TF用于调试目的,当设置为1时,CPU会在每个指令执行后产生单步中断。
- 用途:使得程序员能够逐步执行程序,方便调试。
通用寄存器
8086CPU所有的寄存器都是16位的,可以存放两个字节
AX、BX、CX、DX通常用来存放一般性数据被称为通用寄存器
以AX为例,观察寄存器的逻辑结构:
一个16位寄存器可以存储一个16位的数据
一个16位寄存器所能存储的数据的最大值为2e16-1
注:WIN+R输入calc,可以打开电脑计算器
8086上一代CPU中的寄存器都是8位的
为了保证兼容性,这四位寄存器都可以分为两个独立的8位寄存器使用
如:AX可以分为AH(高八位)和AL(低八位)
字在寄存器中的存储
一个字可以存在一个16位寄存器中,也就是两个字节
关于数制的讨论
由于一个内存单元可以存放8位数据,CPU中的寄存器又可以存放n个8位数据,也就是说,计算机中的数据大多数是由1~N个8位数据构成
十六进制中,每两位对应一个8位数据
几条汇编指令
mov ax,18 AX = 18
mov ah,78 AH = 78
add ax,8 AX = AX + 8
mov ax,bx AX = BX
add ax,bx AX = AX + BX
思考题1:
结果为:044CH
思考题2:
AL作为八位寄存器,超过的数据不会存入AH
结果为:0058H
物理地址
CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间,我们将这个唯一的地址称为物理地址
16位结构的CPU
描述一个16位的CPU具有以下几个方面特征:
1字节(byte)= 8位(bit),64位/8 = 8字节
- 运算器一次最多可以处理16位数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路是16位的
8086CPU给出物理地址的方法
8086有20位地址总线,可传送20位地址,寻址能力为1M
8086内部为16位结构,它只能传送16位的地址能力,表现出的寻址能力却只有64K
8086CPU采用一种在内部用两位16位地址合成的方法来形成一个20位的物理地址(32位只占用其中的20位)
8086CPU读写内存时,发生了这么一些事:
- CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
- 地址加法器将两个16位地址合并成20位的地址
地址加法器工作原理
地址加法器合成物理地址的方法:
逻辑地址由段地址和偏移地址组成
物理地址 = 段地址 * 16 + 偏移地址(同一个结果可以由不同的输入产生)
一个物理地址可以有多种逻辑地址
例如:
传送一个四位数的数据,只有两张可以容纳三位数数据的地址
段的概念
错误认识:
内存被划分为一个一个的段,每个段有一个段地址
正确认识:
内存是分页的,不是分段的,页是固定的,而段不是
内存并没有分段,段的划分来自于CPU,由于8086CPU用 “ 物理地址 = 段地址 * 16 + 偏移地址 ” 的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存
段是我们强加给CPU的概念,可以按需要划分不同的段
两点需要注意
- 段地址*16,必然是16的倍数,所以一个段的起始地址也一定是16的倍数
- 偏移地址为16位,16位地址的寻址能力为64K,所以一个段的长度最大为64K(2^16 = 64KB)
寻址能力可以理解为寻址范围
小结
CPU访问内存单元时,必须向内存提供内存单元的物理地址
8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址
结论:CPU可以用不同的段地址和偏移地址形成一个物理地址
如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位0~FFFFH,也就是64K个内存单元
21F60H在内存单元中的表示:2000:1F60
给定段地址为0001H,仅通过偏移地址变化,CPU的寻址范围为多少?
CPU的寻址范围为0010H到FFFFH。
段寄存器
段寄存器就是提供段地址的
8086CPU有四个段寄存器:CS、DS、SS、ES
CS和IP
CS为代码段寄存器
IP为指令指针寄存器
它们指示了CPU当前要读取指令的地址
8086CPU读取和执行指令相关部件
8086CPU工作过程的简要描述
- 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器
- IP = IP + 所读取指令的长度,从而指向下一条指令
- 执行指令,转到步骤(1),重复这个过程
CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行
如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过
修改CS、IP的指令
在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制
CPU从何处执行指令是由CS:IP中的内容决定的,程序员可以通过改变CS:IP中的内容来控制CPU执行目标指令
mov不能用于设置CS、IP的值,8086CPU没有这样的功能,8086CPU没有提供这样的功能
但有另外的指令改变它们的值,用于区分mov:转移指令
例如:mov ax,123 被称为传送指令
同时修改CS、IP的内容:
jmp 2AE3:3
jmp 3:0B16
功能:用指令中给出的段地址修改CS,偏移地址修改IP
仅修改IP的内容:
jmp ax
jmp bx
CPU代码运行的流程
结果:
代码段
小结