引言
在笔记01和02我们主要学习了CPU的外部通讯,即CPU如何和其他的器件去联系。
而现在呢我们要学习的是内部通讯,即CPU内部是如何工作的。
这一段的内容重点在段寄存器上,包括偏移地址 物理地址等。
由于将基础知识分为第一大块内容,所以我们现在从 2 来命名
2.1 CPU的概述
一个典型的CPU有运算器、控制器、寄存器等器件组成,这些器件需要靠内部总线相连。
那么我们之前学的地址总线等等三种总线又是什么呢?和CPU内部的总线不一样,它们统称为外部总线。 外部总线主要负责的是实现CPU和主板上各个器件之间的联系。
CPU的组成
- 运算器进行信息处理。主要有一些算术逻辑单元组成。
- 寄存器进行信息存储。CPU内部用于存储数据的单元
- 控制器协调各种器件进行工作。
2.2 寄存器
寄存器是CPU内部的信息存储单元
还是以8086CPU来举例,其共有14个寄存器:
- 通用寄存器:AX, BX, CX, DX。一般用于存储运算过程中的临时数据。
- 变址寄存器:SI, DI
- 指针寄存器:SP, BP
- 指令指针寄存器:IP
- 段寄存器:CS, SS, DS, ES
- 标志寄存器:PSW
共性:8086CPU所有的寄存器都是16位的,可以存放两个字节
2.2.1 通用寄存器
我们以AX为例。
这是一个16位的寄存器,用来存储一个16位的数据,它所能存储的最大值显然是2的16次方-1(因为都是二进制存储),用16位表示最大值则是FFFFH。
那我们现在来存储18D(D是十进制)这个数据。
以上是这些通用寄存器的存储形式,BX,CX等都是一样的。
现在来想一个问题,8086是16位的,那我们现在都是64位的,再往前8088是8位的,这样就导致后代的CPU编写出来的程序,在前代没法用,那又如何去保证程序的兼容性呢?
方法是:将通用寄存器分为两个独立的8位寄存器。即我们上次说过的高低位——AX分为AH(high)和AL(low),这样就可以和上一代的8位寄存器适配了。
我们不难发现,十六进制的4E20很容易对应出来其二进制,而十进制在分开后就不是很直观,所以我们在学习汇编语言的时候,要习惯用过十六进制。
AX可以分为AH和AL,其他的通用寄存器也是同样的。
2.22 变址寄存器——SI DI
由于网课的安排并没有一下子就讲完所有的寄存器,所以这里等讲到了我会补上。
2.23 指针寄存器——SP BP
指针寄存器要跟SS堆栈寄存器一起使用。
SP是一个一直指向栈顶的指针,比如存一个0123H在栈里,SP就会自动+2.
而BP是用来协助SP去找到我们需要的地址,由于SP只能指向栈顶,所以我们必须再找一个BP去找到操作数对应的地址。
2.24 指令指针寄存器——IP
IP寄存器常常和CS段寄存器一起使用,用CS:IP来作为一个地址,指向的内容作为指令被CPU执行。
由于汇编指令翻译成机器指令后一般由三个内存单元存储,比如把mov ax,0123H这个指令放到物理地址为CS:IP=2000:0000的地方,其实是20002存储01,20001存储23,20000存储B8.
这样一来,执行完这条指令后,IP寄存器就会自动+3,变为0003。
可以看到执行完之后IP加了3(图中指令没有完全按照文字说的来,但IP都是一样的)
2.25 段寄存器——CS SS DS ES
段寄存器是专门用来存放段地址的寄存器。
8086CPU中一共有4个段寄存器——
- CS(Code Segment)代码段寄存器:
存放当前正在运行的程序代码所在段的基地址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。 - DS(Data Segment)数据段寄存器:
指出当前程序使用的数据所存放段的最低地址,即存放数据段的基地址。 - SS(Stack Segment)堆栈段寄存器:
指出当前堆栈的底部地址,即存放堆栈段的基地址。
堆栈和push以及pop等指令有关,可以看之后的指令相关博客去更加深入了解SS和SP和BP - ES(Extra Segment)附加段寄存器:
指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。
2.26 标志寄存器——PSW
由于网课的安排并没有一下子就讲完所有的寄存器,所以这里等讲到了我会补上。