寄存器
cpu的组成
一个典型的cpu由运算器、控制器、寄存器等器件构成,这些器件依靠内部总线相连。与cpu内部的总线相对的则是外部总线。
在cpu中:
• 运算器进行信息处理
• 寄存器进行信息存储
• 控制器控制各种器件进行工作
• 内部总线连接各种器件,在他们之间进行数据的传送
汇编程序员通过改变各种寄存器中的内容来实现对cpu的控制。
不同的cpu,寄存器的个数、机构是不相同的。8086cpu有14个寄存器。
这些寄存器分别为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。
通用寄存器
8086的所有寄存器都是16位的,可以存访两个字节。其中AX,BX,CX,DX这四个寄存器通常用来存放一般性的数据,被称为通用寄存器。
同时为了保证兼容(8086的上代cpu寄存器都为8位),8086cpu的四个通用寄存器都可以分为两个独立使用的8位寄存器来使用。
AX的低8位构成了AL寄存器,高8位构成了AH寄存器。AH和AL寄存器是可以作为独立使用的8位寄存器。
AX可分为AH,AL。BX可分为BH,BL,以此类推。
字在寄存器中的存储
处于对兼容性的考虑,8086cpu可以一次性处理一下两种尺寸的数据
- 字节:byte,可以存放在8位寄存器中
- 字:word,一个字由两个字节组成。这两个字节分别称为这个字的高字节和低字节
比如在AX中,AH和AL中的数据既是分别独立的两个字节,也是AX中字的高字节和低字节。
几条汇编指令
同时需要注意,指令的两个操作对象的位数应当是一致的。
物理地址
cpu在访问内存单元时,需要给出内存单元的地址。所有的内存单元存储空间是一个以为的线性空间,每个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。
cpu通过地址总线送入存储器的,必须是一个内存单元的物理地址。在cpu向地址总线发出物理地址之前,必须要在内部先形成这个物理地址。不同的cpu可以有不同的形成物理地址的方式。
这里谈到的是8086如何在内部形成物理地址。
16位结构的cpu
16位机构(16位机,字长为16),描述了cpu具有下面几个方面的结构特性:
• 运算器一次最多可以处理16位数据
• 寄存器的最大宽度位16位
• 寄存器和运算器之间的通路为16位
即是说,在8086中,能够一次性处理,传输,暂存的信息的最大长度为16位。
8086cpu给出物理地址的方法
8086cpu拥有20位地址总线,可以传送20位地址,达到1MB的寻址能力。但是8086一次能处理的地址为16位。
所以8086采用在内部使用两个16位地址合成一个20位物理地址的方法。
即 物理地址 = 基础地址+偏移地址
地址加法器做的工作就是使用 段地址*10H+偏移地址 的方法合成物理地址。
段的概念
内存物理上并没有段的概念。段的概念来自于8086cpu使用的“基础地址(段地址*16)+ 偏移地址 = 物理地址”获取内存单元物理地址的方式.
我们将若个个连续的内存单元看成一个数据段,用基础地址(段地址*16)定位段的起始位置。同时因为偏移地址为16为,所以一个段的最大程度为64KB。
即 SA*16+EA=物理地址
段寄存器
段地址在8086cpu中的四个段寄存器中保存。CS,DS,SS,ES。8086方位内存时由这4个段寄存器提供内存单元的段地址。
CS和IP
CS和IP是8086cpu中最关键的两个寄存器.
CS为代码段寄存器,IP为指令指针寄存器。
在8086PC机种,任意时刻,设CS内容为M,IP内容为N。8086cpu将从内存M*16+N开始,读取一条指令并执行。
即,8086机中,任意时刻,cpu将CS:IP指向的内容当作指令执行。
每当读取一条指令,IP中的偏移值就会自增。增加的大小,取决于指令的长度。
在8086cpu加电启动或者复位(cpu刚开始工作),CS和IP被设置称为CS=FFFFH,IP=0000H。即8086开机执行的第一条指令为FFFF0H单元起始的指令。
现在我们可以回答,在内存中,指令和数据没有任何区别,都是二进制数据,cpu如何区分指令和数据。
cpu将CS:IP指向的内存单元中的内容看作指令,因为8086将CS,IP中的内容当作指令的段地址和偏移地址。如果说内存中的一条信息曾被cpu执行过的话。那么其所在的内存单元一定被CS:IP执行过。
修改CS,IP的指令
8086中大部分寄存器的值都可以用mov(传送指令)来改变。但mov指令不能用来设置CS,IP的内容,因为8086没有提供这个功能。
能够更改CS,IP的内容的指令被统称为转移指令。最简单的转移指令jmp
- 想同时更改CS,IP,则采用
jmp 段地址:偏移地址
的格式 - 如果仅想更改IP的值,则采用
jmp 某一合法寄存器
的指令来完成。将更改IP的值为指定寄存器中的值
代码段
可以根据需要将一组内存单元定义为一段。
将长度为N(N<= 64KB)的一组代码存在一组连续的,起始位置为16的倍数的内存单元中。我们认为这一段是用来存放代码的,也就是定义了一个代码段。
使用CS,IP来是cpu执行代码段.
Debug的使用
查看,修改cpu中寄存器的内容:R命令
查看内存中的内容: D命令
修改内存中的内容:E命令(内存中,指令数据没有区别)
将内存中的内容解释为机器指令和对应的汇编指令:U命令
执行CS:IP指向指令:T命令
以汇编形式向内存写入指令:A命令