学习笔记--寄存器

一个典型的CPU由运算器、控制器、寄存器(CPU工作原理)等器件组成。靠内部总线相连。前面三类总线相对于CPU是外部总线。

内外部总线区别:

  • 内部总线实现CPU内部各个器件之间的联系。
  • 外部总线实现CPU和主板上各个器件之间的联系。

在CPU中:

  • 运算器进行信息处理;
  • 寄存器进行信息存储;
  • 控制器控制各种器件进行工作;
  • 内部总线连接各种器件,在它们之间进行数据的传送。

CPU的主要部件是寄存器,寄存器是CPU中程序用指令读写的部件。

8086CPU有14个寄存器。分别是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

通用寄存器

AX、BX、CX、DX 通常用来存放一般性的数据,被称为通用寄存器。

一个16位寄存器可以存储一个16位的数据,也可以临时存放地址。

为保证兼容性,AX、BX、CX、DX 都可分为两个8位寄存器来使用。

  • AX可分为AH 和AL
  • BX可分为BH 和BL
  • CX可分为CH 和CL
  • DX可分为DH 和DL

寄存器编号从右到左,从0开始到15结束。AX的低8位(07)构成AL寄存器,高8位(815)构成AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器。

当AH和AL独立使用时,只能存放数据,不能存放地址。

AX寄存器所能存储的最大数据是65535 (2^16 - 1)。

十六进制下 AX = AH + AL 。

字在寄存器中的存储

字节:byte,一个字节由8个bit组成,可以存在8位寄存器中。

字:word,一个字由两个字节组成,两个字节分别称为高位字节和低位字节。

一个字节可以存在一个16位寄存器中(AX),高位字节和低位字节就存在这个高8位寄存器和低8位寄存器中。

一个内存单元可存放8位数据,CPU中的寄存器又可存放n个8位数据,所以计算机中的数据大多是由1~N个8位数据构成的。

简单的汇编指令

mov ax,78

将78送入寄存器AX中,即AX = 78。

mov ax,bx

将寄存器BX的数据送入寄存器AX中,即AX = BX。

add ax,bx

将AX和BX中的数据相加,结果存放在AX中,即AX = AX + BX。

假如给AX赋值


mov ax,4234H
mov ah,0062H
mov al,0084H

此时AX = 6284H。

在写一条汇编指令或一个寄存器的名称时不区分大小写。

AH和AL只能存放一个字节的数据,如果要把158H存放进AH或AL中,那么存放进去的数据为0058H。

这里1不能在8位寄存器中保存,但是CPU不是丢弃这个进位值,有专门的寄存器存放。

同时进行数据传送或运算时,指令的两个操作对象的位数应该是一致的。BL中的数据不能传送给AX。

物理地址

CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间时一个一维的线性空间,每一个内存单元都有一个唯一的地址。

CPU通过地址总线送入存储器的必须是一个内存单元的物理地址。不同的CPU可以有不同的形成物理地址的方式。

16位结构的CPU

16位寄存器的结构特性:

  • 运算器一次最多可以处理16位的数据。
  • 寄存器的最大宽度为16位。
  • 寄存器和运算器之间的通路为16位。

8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位。

8086CPU给出物理地址的方法

8086CPU有20位地址总线,传送20位地址,有1MB的寻址能力。但8086CPU又是16位结构,一次性只能处理16位,寻址能力只有64KB。

在CPU内部采用两个16位地址合成一个20位地址。

  1. CPU的相关部件提供两个16位地址,一个是段地址,一个是偏移地址。
  2. 两个地址通过总线进入地址加法器的部件。
  3. 地址加法器将两个地址合成为一个20的物理地址。

地址加法器通过段地址*16+偏移地址=物理地址的方法合成物理地址。

段地址*16是十六进制左移1位,即二进制形式左移4位。

  1. 一个数据的二进制形式左移1位,相当于该数据乘以2。
  2. 一个数据的二进制形式左移N位,相当于该数据乘以2的N次方。

一个X进制的数据左移1位,相当于乘以X。

例:段地址为1445H,偏移地址为0008H,段地址左移1位即乘以16得14450H,加上偏移地址,物理地址即为14458H。

内存没有分段,段的划分来自于CPU,由于8086CPU用基础地址(段地址*16)+偏移地址=物理地址的方式给出物理地址,所以可以用分段的方式来管理内存。

用段地址*16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

  • 段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数。
  • 偏移地址为16位,所以一个段的长度最大为64KB。

CPU可以用不同的段地址和偏移地址形成同一个物理地址。

确定一个段地址,改变偏移地址最多可寻64KB内存单元,偏移地址的变化范围为0~FFFFH。

段寄存器

8086CPU有4个段寄存器:CS、DS、SS、ES。访问内存时,由这4个段寄存器提供内存单元的段地址。

CS和IP

CS为代码段寄存器,IP为指令指针寄存器。

在8086CPU启动或复位后,CS和IP被设置为CS=FFFFH,IP=0000H,这条指令为BIOS指令,是开机的第一条指令。

CPU把有的信息看作指令,有的信息看作数据。但任何时候都将CS:IP指向的内存单元中的内容看作指令,将CS、IP中的内容当作指令的段地址和偏移地址。如果内存中的一段信息被CPU执行过,那么它所在的内存单元必然被CS:IP指向过。

CS存放指令的段地址,IP存放指令的偏移地址。

8086CPU的工作过程:

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器。
  2. IP指向下一条指令。
  3. 执行指令。(转移到1,重复过程)

修改CS、IP指令

修改AX、BX等寄存器中的值可以用mov指令修改。mov指令被称为传送指令。

设置CS、IP的值用jmp指令修改。

形式:jmp 段地址:偏移地址
功能为:用指令中给出的段地址修改CS,偏移地址修改IP。

jmp 2ae3:3

执行后CS=2AE3H,IP=0003H,CPU从2AE33H处读取指令。

如果仅修改IP的内容,用“jmp 某一合法寄存器”的指令。

功能:用寄存器中的值修改IP。

jmp ax

将AX中的值传送给IP,在意义上类似于mov IP,ax。但实际上没有后一条指令存在。

代码段

在编程时,可以根据需要,将一组内存单元定义为一个段。可以将长度小于64KB的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,可以认为这段内存是用来存放代码的,从而定义了一个代码段。

将一段内存当作代码段,仅仅是在编程时的一种安排,CPU不会因为这样就自动的将定义的代码段中的指令当作指令来执行。

CPU只认被CS:IP指向的内存单元中的内容为指令。所以,要让CPU执行存放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值