第二章 寄存器

寄存器是CPU的一个组成部分, 是CPU用来暂时存放指令, 数据, 和地址的电脑存储器. 在CPU内部靠内部总线和其他器件相连. 寄存器容量有限, 读写速度非常快.
程序员通过改变寄存器中的内容来实现对CPU的控制.
不同CPU的寄存器的个数和结构不同.
目前学的这本书是以 8086CPU 为实体, 该CPU里的寄存器都是16位的. 分别有: AX, BX, CX, DX, SI, DI, SP, BP, IP, CS, SS DS, ES, PSW 这几个寄存器

通用寄存器:
AX, BX, CX, DX这四个寄存器是用来存放一般的数据 , 称为通用寄存器.

8086上一代寄存器是8位的, 为了保证兼容性, 8086CPU的AX, BX, CX, DX这四个通用寄存器也可以分为两个可单独使用的 8 位寄存器使用
譬如AX, 可分为 AH 和 AL 两个8位寄存器.

字在寄存器中的存储:

在8086CPU中, 一个字16位. 存在AX里一个字大小的数据, 低八位存在AL, 高八位存在AH.

8086CPU给出物理地址的方法

8086地址总线的宽度是20, 但8086是16位结构 , 在内部进行传输数据一次只能传16位.
8086采用在内部用两个16位去获得20 位的寻址能力
原理图如下:
image.png
物理地址 = 段地址<<4(*16) + 偏移地址
暂存段地址的寄存器叫段寄存器, 8086CPU有四个段寄存器: CS, DS, SS, ES. (Segement , 段)

CS ( Code Segement 代码段寄存器) 和 IP (Instruction Pointer 指令指针寄存器)
任意时刻,8086CPU会读取 CS:IP 指向的二进制当做指令并执行.

指令执行流程

image.png

  1. CS和IP寄存器通过总线把数据传到地址加法器
  2. 地址加法器通过计算得到物理地址通过总线把数据传递给输入输出控制器
  3. 输入输出控制器通过地址总线把物理地址传给内存
  4. 内存找到对应的地址,把从该地址开始的指令数据通过数据总线传给输入输出控制器
  5. 输入输出控制器把得到的指令(二进制代码)传给指令缓冲器
  6. 指令缓冲器把指令传给执行控制器并执行
  7. 执行控制器执行结束后, IP 的值改变, 指向下一个指令( 改变的值和上一个指令占多少字节有关)
  8. 重复a

修改CS, IP的指令

在CPU中, 程序员能够用指令读写的器件只有寄存器. CPU从何开始执行指令是由CS:IP决定的.
CS,IP寄存器如何修改, 规定不能使用mov直接修改这两个寄存器的值, mov指令被称作传送指令, 能直接修改CS, IP的指令被统称为转移指令.
jmp指令是最简单的转移指令:
jmp CS:IP
如果仅仅想修改IP的内容:
jmp 某一合法寄存器
该指令会把那一合法寄存器里的值传入修改IP寄存器里的值, 而CS里的值不变