1.寄存器是*处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在*处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在*处理器的算术及逻辑部件中,存器有累加器(ACC)
2.包括通用寄存器、专用寄存器和控制寄存器
3.分类
数据寄存器- 用来储存整数数字(参考以下的浮点寄存器)。在某些简单/旧的CPU,特别的数据寄存器是累加器,作为数学计算之用。
地址寄存器- 持有存储器地址,用来访问存储器。在某些简单/旧的CPU里,特别的地址寄存器是索引寄存器(可能出现一个或多个)。
通用目的寄存器(GPRs) - 可以保存数据或地址两者,也就是说它们是结合数据/地址 寄存器的功用。
浮点寄存器(FPRs) - 用来储存浮点数字。
常数寄存器- 用来持有只读的数值(例如0、1、圆周率等等)。
向量寄存器- 用来储存由向量处理器运行SIMD(Single Instruction, Multiple Data)指令所得到的数据。
特殊目的寄存器- 储存CPU内部的数据,像是程序计数器(或称为指令指针),堆栈寄存器,以及状态寄存器(或称微处理器状态字组)。
指令寄存器 register)- 储存现在正在被运行的指令。
索引寄存器(index register)- 是在程序运行时用来更改运算对象地址之用。
PORT1的控制寄存器在某些架构下,模式指示寄存器(也称为“机器指示寄存器”)储存和设置跟处理器自己有关的数据。由于他们的意图目的是附加到特定处理器的设计,因此他们并不被预期会成为微处理器世代之间保留的标准。
有关从随机存取存储器提取信息的寄存器与CPU(位于不同芯片的储存寄存器集合)
存储器缓冲寄存器(Memory buffer register)
存储器数据寄存器(Memory data register)
存储器地址寄存器(Memory address register)
存储器型态范围寄存器(Memory Type Range Registers)[1]
向量寄存器[2]
4.工作原理
1、一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
区别:
内部总线实现CPU内部各个器件之间的联系。
外部总线实现CPU和主板上其它器件的联系。
8086CPU有14个寄存器 它们的名称为:
AX、BX、CX、DX、SI、DI、SP、BP、
IP、CS、SS、DS、ES、PSW。
8086CPU所有的寄存器都是16位的,可以存放两个字节,一个字节8位。
AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。
一个16位寄存器所能存储的数据的最大值为多少?
因为每一位存放的数据是0或1,那么最大的数值自然就是 1111 1111 1111 1111(2),也就是2^16-1。
2、通用寄存器(重点)
8086上一代CPU中的寄存器都是8位的,为保证兼容性,
这四个寄存器都可以分为两个独立的8位寄存器使用。
AX可以分为AH和AL;
BX可以分为BH和BL;
CX可以分为CH和CL;
DX可以分为DH和DL。
AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。
AH和AL寄存器是可以独立使用的8位寄存器,如果当成是8位寄存器使用,那么他们就是独立的,没有任何关系。
一个8位寄存器所能存储的数据的最大值是多少?二进制数值 1111 1111 ,也就是 2^8-1。
3、字在寄存器中的存储
注意:在进行数据传送或运算时,要注意指令的操作数的位数要匹配。
4、物理地址的表示(重点)
CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。
我们将这个唯一的地址称为物理地址。
不同的CPU有不同的形成物理地址的方式。
(1)16位结构的CPU
8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
8086外部有20位地址总线,可传送20位地址,寻址能力为1M。
那么,8086CPU如何用内部16位的数据,转换成20位的地址呢?
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
段地址+偏移地址 -> 地址加法器 -> 20位的物理地址。
地址加法器合成物理地址的方法:段地址×16+偏移地址=物理地址。
“段地址×16”有一个更为常用的说法就是数据左移4位。(二进制位)
二进制的数据左移4位,意味着乘以2^4=16。
这样做的目的主要是为了弥补内部总线16位的缺陷而设计的。
5、关于段空间
内存没有分段,段的划分来自于CPU,
由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,
使得我们可以用分段的方式来管理内存。
以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,
用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
(1)段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;
(2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位多少内存单元?
因为偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元。
比如:给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。
6、地址的描述
在8086PC机中,存储单元的地址用两个元素来描述。即段地址和偏移地址。
“数据在21F60H内存单元中。”对于8086PC机的两种描述:
(a)数据存在内存2000:1F60单元中;
(b)数据存在内存的2000段中的1F60H单元中。
可根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。
7、段寄存器就是提供段地址的。
8086CPU有4个段寄存器: CS、DS、SS、ES。
CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
CS为代码段寄存器,IP为指令指针寄存器。
在 8086CPU 加电启动或复位后( 即 CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。
即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。
FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。
8、修改CS,IP
mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能。
8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令
JMP 段地址:偏移地址
JMP 2AE3:3
功能:用指令中给出的段地址修改CS,偏移地址修改IP。CS = 2AE3H, IP = 0003H。
仅修改IP的内容:
jmp 某一合法寄存器
jmp ax (类似于 mov IP,ax)
功能:用寄存器中的值修改IP。
8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。
9、关于debug指令(Win7没有这个指令,XP才有)
R命令查看、改变CPU寄存器的内容;
D命令查看内存中的内容;
E命令改写内存中的内容;
U命令将内存中的机器指令翻译成汇编指令;
T命令执行一条机器指令;
A命令以汇编指令的格式在内存中写入一条机器指令。