第2章 寄存器
1、CPU的构成:典型CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。
2、内部总线和外部总线的区别:内部总线实现CPU内部各个器件的联系,外部总线实现CPU和主板上其他器件的联系。
3、对于一个汇编程序员来说,CPU中的主要部件是寄存器。
4、不同的CPU寄存器个数和结构不同。8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
2.1 通用寄存器
1、8086CPU所有寄存器都是16位的,可以存放2个字节。
2、通用寄存器:存放一般性的数据,有AX、BX、CX、DX。
3、通用寄存器的逻辑结构及数据在其中的存放方式,以16位通用寄存器AX为例,如图:
4、一个N位寄存器所能存储的数据的最大值为2N-1。
5、AX、BX、CX、DX可分为两个可独立使用的8位寄存器来用:如AX分为AH(高8位)和AL(低8位)。如图:
2.2 字在寄存器中的存储
1、8086CPU中一个字(Word)由两个字节(高位字节和低位字节)组成。
2、一个字可以存储在一个16位寄存器中,其中高位字节存储在高8位寄存器中,低位字节存储在低8位寄存器中。
2.3 几条汇编指令
mov 寄存器, 数据
mov 寄存器, 寄存器
add 寄存器, 数据
add 寄存器, 寄存器
1、汇编指令不区分大小写。
2、注意进位值丢失问题。
3、在进行数据传送或运算时,要注意指令的两个操作对象的位数应当一致。
2.4 物理地址
1、CPU访问内存单元时,要给出内存单元的地址。
2、所有内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。
2.5 16位结构的CPU
1、16位机、字长为16位与16位结构的含义相同。
2、16位CPU的特征:能一次性处理、传输、暂时存储16位的地址。
(1)运算器一次最多可以处理16位的数据;
(2)寄存器的最大宽度为16位;
(3)寄存器和运算器之间的通路为16位。
2.6 8086CPU给出物理地址的方法
1、8086CPU外部有20位地址总线,可以传送20位地址,达到1MB(220B)寻址能力。
2、8086CPU内部为16位结构,它只能传送16位的地址,理论上表现出的寻址能力只有64K。
3、8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
4、地址加法器合成物理地址的方法:物理地址=段地址×16(十进制)+偏移地址。
2.7 “段地址×16+偏移地址=物理地址”的本质含义
8086CPU的寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案,段地址×16可看作是基础地址。
2.8 段的概念
1、内存并没有分段,段的划分来自于CPU,由于8086CPU用“段地址×16+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
2、以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
3、注意事项:
(1)段地址必然是16的倍数,即一个段的起始地址必然是16的倍数;
(2)偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB;
(3)CPU可以用不同的段地址和偏移地址形成同一个物理地址。
4、数据存在21F60H内存单元中
=数据存在内存2000:1F60单元中
=数据存在内存的2000H段中的1F60H单元中
。
2.9 段寄存器
1、段寄存器就是提供段地址的。
2、8086CPU有4个段寄存器:CS(code segment)、DS(data segment)、SS(stack segment)、ES(extra segment)。
3、当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。
2.10 CS和IP
1、CS和IP时候8086CPU中最关键的寄存器,它们指示了CPU当前读取指令的地址。
2、CS和IP的含义
(1)CS:代码段寄存器;(2)IP:指令指针寄存器。
3、CPU从CS、IP中读取指令的方式
设CS中的内容为M,IP中的内容为N,8086CPU将从内存M×16+N的单元开始,读取一条指令并执行。
4、8086CPU工作过程的简要描述
(1)从CS:IP指向内存单元,读取指令,读取的指令进入指令缓冲器;
(2)IP=IP+所读取指令的长度,从而指向下一条指令;
(3)执行指令,转到步骤(1),重复这个过程。
5、开机时的CS和IP
(1)在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H;
(2)即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行;
(3)FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。
6、CPU根据什么将内存中的信息看作指令?
(1)CPU将CS:IP指向的内存单元中的内容看作指令;
(2)在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
(3)内存中的一段信息曾被CPU执行过,说明它所在内存单元必然被CS:IP指向过。
2.11 修改CS、IP的指令
1、在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
2、CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
3、修改CS和IP的方式:
(1)通过mov可以改变AX等,但不能改变CS和IP。
(2)以下指令同时修改CS和IP,其中指令中的段地址修改CS、偏移地址修改IP。
jmp 段地址, 偏移地址
例如:
jmp 3:01B6
在含义上好似 mov CS, 3 与 mov IP, 01B6
(3)以下指令用寄存器中的值修改IP,仅修改IP的内容。
jmp 某一合法的寄存器
例如:
jmp ax
在含义上好似 mov IP, ax
(4)jmp是只具有一个操作对象的指令。
2.12 代码段
1、可以将长度为N(N<=64KB)的一组代码,存放在一组地址连续、起始地址为16的倍数的内存单元中这段内存是用来存放代码的,从而定义了一个代码段。
2、CPU不会自行安排代码段,CPU中只认被CS:IP指向的内存单元中的内容为指令。
3、要让CPU执行放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。