第2章 寄存器
一个典型的CPU 由运算器、控制器、寄存器 等器件构成,这些器件靠内部总线相连。在CPU中:
- 运算器进行信息处理;
- 寄存器进行信息存储;
- 控制器控制各种期间进行工作;
- 内部总线连接各种器件,在它们之间进行数据的传送;
2.1 通用寄存器
-
通用寄存器:通常用来存放一般性的数据的寄存器。如8086CPU 中AX、BX、CX、DX 这4个寄存器【8086CPU中所有的寄存器都是16位的。】
8086CPU 中AX、BX、CX、DX 都可分为2个独立使用的8位寄存器来用:
-
AX: AH和AL;
-
BX: BH和BL;
-
CX: CH和CL;
-
DX: DH和DL;
2.2 字在寄存器中的存储
- 字节:byte,一个字节由8个bit组成。
- 字: word,一个字由2个字节组成,这2个字节分别称为高位字节和低位字节
2.3 几条汇编指令
注:
- 在写一个汇编指令或一个寄存器名称时不区分大小写。
- 16位的寄存器,当要写入的数据超过16位时,最高位的数据无法写入,仅能写入低16位数据。
- 在进行数据传送和运算时,要注意指令的2个操作对象的位数应一致。
例:mov ax,bl (ax 为16位,bl 为8位 此指令是错误的)
2.4 物理地址
所有内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有一个唯一的地址,即物理地址。
2.5 16位结构的CPU
16位结构(16位机、字长为16 位):
- 运算器一次最多可以处理16位的数据;
- 寄存器的最大宽度为16位;
- 寄存器和运算器之间的通路为16位;
2.6 8086CPU给出物理地址的方法
8086CPU 有20位地址总线,即1MB寻址能力。8086CPU 又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。表现出的寻址能力只有64KB.
- 地址加法器 采用 物理地址= 段地址x16 + 偏移地址 的方法合成物理地址。
- 例:8086CPU要访问地址为123C8的内存单元
“段地址x16” 更为常用的说法是左移4位。一个数据的二进制形式左移N位,相当于该数据乘以2的N次方。 即 一个数据的16进制形式左移1位,相当于x16;X进制的数据左移1位,相当于乘以X。
2.7 物理地址= 段地址x16 + 偏移地址 的本质含义
- “物理地址= 段地址x16 + 偏移地址”
的本质含义:CPU在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。即
“基础地址+偏移地址=物理地址”
2.8 段的概念
其实,内存并没有分段,段的划分来自于CPU,由于8086CPU 用“基础地址(段地址x16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存.
注意:
- 段地址x16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数;
- 偏移地址为16位,16位地址的寻址能力为64KB,所以一个短的长度最大为64KB.
- 在8086 PC 中,数据在21F60H 内存单元中,表示为:
①数据存在内存 2000:1F60 单元中;
②数据存在内存的2000段中的1F60单元中;
2.9 段寄存器
段地址在8086CPU的段寄存器中存放。8086CPU 有4个段寄存器:CS、DS、SS、ES.
2.10 CS 和 IP
**CS : 代码段寄存器;IP : 指令指针寄存器;**它们指示了CPU 当前要读取指令的地址。
在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086 CPU将从内存 Mx16+N 单元开始,读取一条指令并执行。即: CPU将 CS:IP 指向的内容当做指令执行。
- 8086CPU 读取、执行一条指令的过程:
- 8086CPU 工作过程:
①从CS:IP 指向的内存单元读取指令,读取的指令进入指令缓冲器;
②IP=IP+所读指令长度,从而指向吓一条指令;
③执行指令。转到步骤①重复这个过程;
CPU根据什么将内存中的信息看作指令?
CPU将CS:IP 指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS、IP 中的内容当做指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
2.11 修改CS、IP 的指令
程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
CPU从何处执行指令是由CS、IP 中的内容决定的,可以通过修改CS、IP 的内容来控制CPU执行目标指令。
- mov 指令:传送指令; mov ax,123 注:mov指令不能用于设置CS、IP的值。
- jmp指令:转移指令;
同时修改CS、IP的内容: jmp 段地址:偏移地址 (用指令中给出的段地址修改CS,偏移地址修改IP)
例:jmp 2AE3:3
仅修改IP 内容, jmp 某一合法寄存器 (指令功能:用寄存器中的值修改IP)
例:jmp ax
2.12 代码段
例:
mov ax,0000 (B8 00 00)
add ax,0123 (05 23 01)
mov bx,ax (8B D8)
jmp bx (FF E3)
这段长度为10 个字节的指令,存放在123B0H~123B9H的一组内存单元中,我们就认为123B0H ~ 123B9H 这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节。
要让CPU执行我们放在代码段中的指令,必须要将CS:IP 指向所定义的代码段中的第一条指令的首地址。
预备知识:Debug的使用
①什么是Debug?
Debug 是DOS、Windows 都提供的实模式(8086 方式)程序的调试工具。使用它,可以查看CPU 各种寄存器中的内容、内存的情况 和 在机器码级跟踪程序的运行。
②Debug 功能
命令 | 功能 |
---|---|
R | 查看、改变CPU寄存器的内容 |
D | 查看内存中的内容 |
E | 改写内存中的内容 |
U | 将内存中的机器指令翻译成汇编指令 |
T | 执行一条机器指令 |
A | 以汇编指令的格式在内存中写入一条机器指令 |
③进入Debug 参考:https://blog.csdn.net/madao1234/article/details/82951640
④ R 命令查看CPU中各个寄存器中的内容
用R命令改变寄存器中的内容:用R+寄存器名
⑤ D命令 查看内存内容
d 段地址:偏移地址 的格式查看
使用D命令,Debug将输出3部分内容:
-
中间是从指定地址开始的128个内存单元的内容,16进制的格式输出;(注意在每行的中间有一个“-”,它将每行的输出分为2部分,便于查看)
-
左边是每行的起始地址;
-
右边是每个内存单元中的数据对应的可显示的ASCII码字符;没有对应可显示的ACSII码字符 用 . 代替
-
在使用 d 段地址:偏移地址 之后,接着使用D命令,可列出后续的内容。
-
指定D命令查看范围: d 段地址:起始偏移地址 结尾偏移地址 , d 1000:0 9 查看 1000:0 ~ 1000:9的内容。
⑥E 命令 改写内存中的内容
可以用E命令逐个修改某一地址开始的内存单元的内容 :
- e 1000:1
- Debug 显示起始地址1000:1 和第一个单元的原始内容,然后光标停在“ . ”
的后面提示输入想要写入的数据,输入数据改写当前内存单元 ,不输入直接按空格则不修改内存单元 - 当前单元处理完成后 (按了空格键表示处理完成),Debug 将接着显示下一个内存单元的内容, 所有改写完成后,按Enter ,E命令操作结束。
⑦ e命令写入机器码 ,U命令查看机器码含义,T命令执行内存中的机器码
⑧ A命令 以汇编指令的形式在内存中写入机器指令
To be continue…