汇编语言 第二章 寄存器

在 CPU 中:

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

不同的 CPU,寄存器的个数、结构不同。8086CPU 有 14 个寄存器,分别是:AX、BX、CX、DX、SI、DI、SP、BP、CS、SS、DS、ES、PSW。 ### 2.1 通用寄存器

8086CPU 的上一代 CPU 中的寄存器都是 8 位的,为了保证兼容,8086CPU 的 AX、BX、CX、DX 都可以分为 2 个可独立使用的 8 位寄存器来使用:

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

AX 的低 8 位(0-7)构成了 AL 寄存器,高 8 位(8-15)构成了 AH 寄存器。它们是可以独立使用的 8 位寄存器。

2.2 字在寄存器中的存储

8086CPU 可以一次处理“字节”和“字”两种尺寸的数据。

一个字可以存在一个 16 位寄存器中,这个字的高位字节和地位字节存在这个寄存器的高 8 位寄存器和低 8 位寄存器中。图 2.4 既可以是 20000,也可以是 78 和 32。

2.3 几条汇编指令

原 AX 中的值:0000H,原 BX 中的值:0000H。

程序段中指令的执行情况之一:

程序段中的指令 指令执行后 AX 中的数据 指令执行后 BX 中的数据
mov ax,4E20H 4E20H 0000H
add ax,1406H 6226H 0000H
mov bx,2000H 6226H 2000H
add ax,bx 8226H 2000H
mov bx,ax 8226H 8226H
add ax,bx 044CH 8226H

最后一条指令,把 ax 与 bx 中数据相加,所得值位 1044CH,但是 ax 为 16 位寄存器,只能存放 4 位十六进制的数据,所以最高位的 1 不能在 ax 中保存,即 ax 中的数据为 044CH。

程序段中指令的执行情况之二:

程序段中的指令 指令执行后 AX 中的数据 指令执行后 BX 中的数据
mov ax,001AH 001AH 0000H
mov bx,0026H 001AH 0026H
add al,bl 0040H 0026H
add ah,bl 2640H 0026H
add bh,al 2640H 4026H
mov ah,0 0040H 4026H
add al,85H 00C5H 4026H
add al,93H 0158H 4026H

此时,al 作为一个独立的 8 位寄存器来使用,和 ah 没有关系。

在进行数据传送或运算时,指令的两个操作对象的位数应当是一致的。不一致就是错误的指令。

(1)F4A3H;31A3H;3123H;6246H;826CH;6246H;826CH;04D8H;0482H;6C82H;D882H;D888H;D810H;6246H;

(2)mov al,2;add al,al;add al,al;add al,al。

2.4 物理地址

所有的内存单元构成的内存空间是一个一维的线性空间,每一个内存单元在这个空间都有唯一的地址,称为物理地址。CPU 通过地址总线送入存储器的,必须是一个内存单元的物理地址,二物理地址必须先在内部形成。

2.5 16 位结构的 CPU

16 位结构(16 位机,字长为 16 位)的 CPU 有以下特性:

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

2.6 8086CPU 给出物理地址的方法

8086 有 20 位地址总线,可以传送 20 位地址,寻址能力 1MB.而 16 位结构,表现出寻址能力只有 64KB。8086 在内部用两个 16 位地址合成的方法来形成一个 20 位的物理地址。

8086CPU 相关部件的逻辑结构:

地址加法器采用物理地址=段地址x16+偏移地址的方法合成物理地址。例如:

“段地址x16“ 又称为左移四位(二进制位),左移 N 位,相当于乘以 2N

同理,X 进制的数据左移 N 位,相当于乘以 XN

2.7 ”段地址x16+偏移地址=物理地址“ 的本质含义

在 CPU 访问内存时,用一个基础地址”段地址x16“和一个相对于基础地质的偏移地址相加,给出内存单元的物理地址。

2.8 段的概念

段地址并不是内存被分为一段一段,每段有个地址。段的划分来自于 CPU,我们用分段的方式来管理内存。我们可以认为:地址 10000H-100FFH 的内存单元组成一个段,该段基础地址(起始地址)为 10000H,段地址为 1000H,大小为 100H;也可以认为地址 10000H-10007FH、10080H-100FFH 的内存单元组成两个段,基础地址为:10000H 和 10080H,段地址为:1000H 和1008H,大小都为 80H。

可根据编程需要,将若干地址连续的内存单元看作一个段,段地址x16 定位段的起始地址,偏移地址定位段的内存单元。注意:段的起始地址一定是 16 的倍数;段的最大长度为 64KB(由偏移地址的 16 位长度决定)。

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

  2. 给定段地址,仅通过偏移地址来寻址,最多可定位 64KB 个内存单元。因为偏移地址 16 位,变化范围为 0-FFFFH。

(1)00010H,1111FH;

(2)1001H,2000H。1001H 是向上取整,而非四舍五入。

2.9 段寄存器

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

2.10 CS 和 IP

CS 和 IP 是 8086CPU 中两个最关键的寄存器。它们指示了 CPU 当前要读取指令的地址。CS 为代码寄存器,IP 为指令指针寄存器。

在 8086CPU 机中,任意时刻,设 CS 中的内容为 M,IP 中的内容为 N,8086CPU 将从内存 Mx16+N 单元开始,读取一条指令并执行。即任意时刻,CPU 将CS:IP 指向的内容当作指令执行。

下图展示了 8086CPU 读取、执行命令的工作原理:(图中数字都为 16 进制)

下面以图 2.10 为初始状态,展示 8086CPU 读取、执行一条指令的过程。

则可以把 8086CPU 的工作过程简要描述如下:

(1)从 CS:IP 指向的内存单元读取指令,指令进入指令缓冲器;

(2)IP = IP+所读指令的长度,从而只想下一条指令;

(3)执行命令,转到步骤(1),重复这个过程。

在 8086CPU 加电启动或复位后,CS 和 IP 被设置为 CS=FFFFH,IP=0000H,即在 8086PC 机刚启动时,CPU 从内存 FFFF0H 单元中读取指令执行,这也是 8086PC 机开机的第一条指令。

在内存中,指令和数据没有区别,都是二进制信息。CPU 将 CS:IP 指向的内存单元中的内容看作指令。内存中的一段信息曾被 CPU 执行过的话,那么其所在内存单元必然被 CS:IP 指向过。

2.11 修改 CS、IP 的指令

在 CPU 中,能够用指令读写的部件只有寄存器。而 CPU 执行什么指令是由 CS、IP 的内容决定的,所以程序员通过改变 CS、IP 的内容来控制 CPU。

mov 指令,称为传送指令,不能设置 CS、IP 的值。

jmp 指令,称为转移指令(能改变 CS、IP 指令的统称)。

2.12 代码段

我们可以将长度为 N(N≤64KB)的一组代码,存在一组地址连续、起始地址为 16 的倍数的内存单元中,即定义了一个代码段。

4 次,三次读取命令后,指令指向下一条,还有最后一条执行后;ax。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×