汇编-2.1-寄存器
1.一个CPU由运算器、控制器、寄存器等器件组成,这些器件由内部总线相连。相对于CPU内部总线来说是外部总线。内部总线实现CPU内部各个器件的联系,外部总线实现CPU和主板上其他器件的联系。
(1).运算器进行信息处理;
(2).寄存器进行信息存储;
(3).控制器控制各种器件进行工作;
(4).内部总线链接各种器件,在它之间进行数据的传送。
2.通用寄存器
AX,BX,CX,DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
AX可分为AH和AL
BX可分为BH和BL
CX可分为CH和CL
DX可分为DH和DL
3.字在寄存器中的存储
字节:记为byte,一个字节由8bit组成,可以存在8位寄存器中。
字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的的高字节和低字节。
4.汇编指令
在进行数据传送或者运算时,要注意指令的两个操作对象应当是一致的。
例如:
mov ax bl 错误:在8位寄存器和16位寄存器中传送数据,反之也不可以。
mov al , 20000 错误:8位寄存器最大可以存放的数据为255。
add al , 100H 将一个高于8位的数据加到8位寄存器中。
4.物理地址
CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每个内存单元在这个空间都有唯一的地址,我们将这个一维的空间称为物理地址。
CPU通过地址总线送入存储器的,必需是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须在内部形成这个物理地址。不同的CPU可以有不同形成物理地址的方式。
5.16位结构的CPU
对于16位结构的CPU内部,能够一次性处理、传输、暂时存储的信息的最大长度为16位的。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能够一次性处理、传输、存放16 位的地址。
6.8086CPU给出物理地址的方法
8086采用一种内部两个16位地址合成的方法来形成一个20位物理地址。
当8086CPU要读取内存时:
(1).CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
(2).段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
(3).地址加法器将两个16位地址合成一个20位的物理地址;
(4).地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
(5).输入输出控制电路将20位物理地址送上地址总线;
(6).20位物理地址被地址总线传送到存储器;
地址加法器采用物理地址=段地址*16+偏移地址的方法用段地址和便宜地址和成物理地址。例:8086CPU要访问123C8H内存单元:
“段地址*16”–>左移四位(2进制位)。
7.给出物理地址的含义
“物理地址=段地址*16+偏移地址”的含义:CPU在访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出存储单元的物理地址。
8.段地址
内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
9.段寄存器
段地址在8086CPU的段寄存器中存放。8086CPU有4个段寄存器:CS、DS、SS、ES。
10.CS和IP
CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取的地址。CS为代码段寄存器,IP为指令指针寄存器,从名称上我们可以看出他们和指令的关系!
在PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令执行。(任意时刻,CPU将CS:IP指向的内容当作指令执行)
11.修改CS、IP的指令
CPU从何处执行指令是由CS、IP中的内容决定的,可以修改CS、IP的内容来控制CPU执行目标指令。
8086CPU提供了转移指令来改变CS、IP的内容。
jmp指令:
jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H出读取指令。
jmp 2AE3:3,执行后:CS=0003H,IP=0B16H,CPU将从00B46H出读取指令。
“jmp 段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP。
仅修改IP:
jmp ax, 指令执行前:ax=1000H,CS=2000H,IP=0003H
指令执行前:ax=1000H,CS=2000H,IP=1000H
“jmp 某一合法寄存器”指令的功能为:用寄存器中的值修改IP。
12.代码段
对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们将长度为N(N<=64KB)的一组代码,存在一组地址连续、起始地址为16的倍数内存单元中,我们认为,这段内存是用来存放代码的,从而定义了一个代码段。
如:
mov ax , 0000 (B8 00 00)
add ax , 123H (05 23 01)
mov bx ,ax (B8 D8)
jmp bx (FF E3)
这段长度为10个字节的指令,存放在123B0H~123B9H的一组内存单元中,我们就可以认为123B0H~123B9H这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节。
要执行还要这段代码,还要将CS:IP指向所定义代码段中的第一条指令的首地址。要执行以上代码段,可设CS=123BH、IP=0000H。