====== 2.寄存器 ======
一个典型的CPU由运算器、控制器、寄存器(CPU工作原理)等器件组成,这些器件靠内部的总线相连。程序员通过改变各种寄存器中的内容实现对cpu的控制
^ 器件 ^ 功能 ^
| 运算器 | 进行信息处理 |
| 寄存器 | 进行信息存储 |
| 控制器 | 控制各种器件进行工作 |
| 内部总线链接各种器件,在他们之间进行数据的传输 | |
内部总线:实现的是CPU内部的各个器件之间的联系
外部总线:实现的是CPU和主板上其他器件之间的联系
8086cpu有十四个寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
===== -# 通用寄存器 =====
8086CPU所有的寄存器都是16位的,可以存放两个字节(2B=2*8位=16位)。AX,BX,CX,DX通常用来存放一般性的数据被称为通用寄存器。
{{ :assembly:16位寄存器的逻辑结构.jpg?nolink&600 |}}
一个16位的寄存器所能存储的数据的最大值为:2的16次-1
==== - 数据存储 ====
{{ :assembly:16位数据在寄存器中的存放情况.jpg?nolink&600 |}}
为了保证兼容性,这四个通用的寄存器都可以分为两个独立的8位寄存器使用
^ 寄存器 ^ 高位 | 低位 |
| AX | AH | AL |
| BX | BH | BL |
| CX | CH | CL |
| DX | DH | DL |
AH和AL寄存器是可以独立使用的8位寄存器,AL寄存器计算溢出,不到进位到AH寄存器
{{ :assembly:16位寄存器分为两个8位寄存器.jpg?nolink&600 |}}
十进制2000为例
{{ :assembly:16位寄存器及所分成的两个8位寄存器的数据存储情况.jpg?nolink&600 |}}
===== -# 字在寄存器中的存储 =====
==== - 字、字节、比特的关系 ====
字(word):1个字是由2个字节组成=2*8字节=16比特
{{ :assembly:一个字由两个字节组成.jpg?nolink&600 |}}
高位字节和低位字节可以堪称是独立的字节数据。
十六进制的1位相当于二进制输的4位
{{ :assembly:十六进制与二进制的关系.jpg?nolink&600 |}}
===== -# 几条汇编语言 =====
通过汇编语言控制cpu进行工作
{{ :assembly:汇编指令举例.jpg?nolink&600 |}}
==== - 高低8位计算方式 ====
计算案例
{{ :assembly:表2.2.jpg?nolink&600 |}}
AX只能放4位十六进制的数,最高位的1不能在AX保存,所以数据为044CH。满16进1。
计算案例
{{ :assembly:表2.3.jpg?nolink&600 |}}
注意指令的两个操作对象的位数应当一致。
===== -# 物理地址 =====
物理地址:内存单元在其所在的一个一维的线性空间中的唯一地址
物理地址必须在内部先形成。
===== -# 16位结构的cpu =====
^ 结构特性 ^
| 运算器一次最多可以处理16位的数据 |
| 寄存器的最大宽度为16位 |
| 寄存器和运算器之间的通路为16位 |
===== -# 8086cpu给出物理地址的方法 =====
8086cpu地址总线20位:1048576个内存单元,寻址能力1M。
8086cpu是16位结构:只能发出16位的地址,65536个内存单元,寻址能力64kb。
8086cpu采用一中在内部用两个16位地址合成方法形成一个20位的物理地址。
{{ :assembly:8086cpu相关部件的逻辑结构.jpg?nolink&600 |}}
地址加法器采用物理地址=段地址*16+偏移地址
{{ :assembly:地址加法器的工作过程.jpg?nolink&600 |}}
===== -# 段地址*16+偏移地址 =====
“段地址×16+偏移地址=物理地址”的本质含义:CPU在访问内存时,用一个基础地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
===== -# 段地址的概念 =====
{{ :assembly:分段.jpg?nolink&600 |}}
16位的寻址能力为64KB=65536个(0-65535)
cpu可以用不同的段地址和偏移地址形成他同一个物理地址。
段地址1000H,用偏移地址寻址,cpu的寻址范围10000H(左移1位) 至 10000H+FFFF(65535)=1FFFFH
*16 相当于 末尾左移1位 前位补0
/16 相当于 末尾右移1位替换前位数值
===== -# 段寄存器 =====
存放段地址和偏移地址 8086cpu有4个段寄存器:CS DS SS ES,当cpu要访问内存时由这4个段寄存器提供内存单元的段地址。
===== -# CS和IP =====
指示了cpu当前要读取指令的地址。 CS:段寄存器 IP:指令指针寄存器。
CS:IPZ指向的内容当做指令执行。 = cs*16+ip单元开始(ip的值根据实际自加),读取一条指令并执行。
{{ :assembly:8086pc读取和执行指令的相关部件.jpg?nolink&600 |}}
从CS:IP指向的内存单元读取指令,读的指令进去指令缓存器。
IP=IP+所读取指令的长度,从而指向下一条指令
执行指令,重复这个过程
==== - 修改CS、IP的指令 ====
程序员能后用指令读写的部件只有寄存器,可以通过修改寄存器中的内容实现对cpu的控制。
mov:传送指令 操作寄存器
==== - jmp 指令 ====
jmp :转移指令 jmp CS:IP
只修改IP的内容,配合寄存器使用。
jmp ax,= ax赋给IP,CS保持不变
{{ :assembly:内存中存放的机器码和对应的汇编指令.jpg?nolink&600 |}}
==== - 工作过程 ====
1.从CS:IP指向的内存单元读取指令,读的指令进入指令缓存器
2.IP指向下一条指令先做ip自加 然后执行读取到的指令
3.执行指令
===== -# 代码段 =====
cpu只认被CS:IP指向所定义的内存单元中的内容为指令。