汇编语言 (二) 寄存器

时间:2023-01-29 01:24:41

寄存器

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可以一次性处理一下两种尺寸的数据

  1. 字节:byte,可以存放在8位寄存器中
  2. 字: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

  1. 想同时更改CS,IP,则采用 jmp 段地址:偏移地址的格式
  2. 如果仅想更改IP的值,则采用jmp 某一合法寄存器的指令来完成。将更改IP的值为指定寄存器中的值

代码段

可以根据需要将一组内存单元定义为一段。

将长度为N(N<= 64KB)的一组代码存在一组连续的,起始位置为16的倍数的内存单元中。我们认为这一段是用来存放代码的,也就是定义了一个代码段。

使用CS,IP来是cpu执行代码段.

Debug的使用

查看,修改cpu中寄存器的内容:R命令

查看内存中的内容: D命令

修改内存中的内容:E命令(内存中,指令数据没有区别)

将内存中的内容解释为机器指令和对应的汇编指令:U命令

执行CS:IP指向指令:T命令

以汇编形式向内存写入指令:A命令

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">