《汇编语言(第3版)(王爽 著)》学习笔记四:寄存器(1)

版权声明:该文章由作者原创,未经许可请勿转载! https://blog.csdn.net/qq_29381145/article/details/82942800
  • 一个典型的 CPU 由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。前一章所说的总线,相对于 CPU 内部来说是外部总线。内部总线实现 CPU 内部各个器件之间的联系,外部总线实现 CPU 和主板上其他器件的联系。
  • 简单地说,在 CPU 中:(1)运算器进行信息处理;(2)寄存器进行信息存储;(3)控制器控制各种器件进行工作;(4)内部总线连接各种器件,在它们之间进行数据的传送。
  • 对于一个汇编程序员来说,CPU 中的主要部件是寄存器。寄存器是 CPU 中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对 CPU 的控制。
  • 不同的 CPU,寄存器的个数、结构是不相同的。8086 CPU 有 14 个寄存器,每个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

2.1 通用寄存器


  1. 8086 CPU 的所有寄存器都是 16 位的,可以存放两个字节。
  2. AX、BX、CX、DX 这 4 个寄存器通常用来存放一般性的数据,被称为通用寄存器
  3. 以 AX 为例,寄存器的逻辑结构如下图所示:
    图 2.1 16 位寄存器的逻辑结构
  4. 一个 16 位寄存器可以存储一个 16 位的数据,数据在寄存器中的存放情况如下图所示:
    图 2.2 16 位数据在寄存器中的存放情况
  5. 8086 CPU 的上一代 CPU 中的寄存器都是 8 位的,为了保证兼容,使原来基于上代 CPU 编写的程序稍加修改就可以运行在 8086 PC 机之上,8086 CPU 的 AX、BX、CX、DX 这 4 个寄存器都可分为两个可独立使用的 8 位寄存器:(1)AX 可分为 AH 和 AL;(2)BX 可分为 BH 和 BL;(3)CX 可分为 CH 和 CL;(4)DX 可分为 DH 和 DL。
  6. 以 AX 为例,8086 CPU 的 16 位寄存器分为两个 8 位寄存器的情况如下图所示:
    图 2.3 16 位寄存器分为两个 8 位寄存器
  7. AX 的低 8 位(0 位 ~ 7 位)构成了 AL 寄存器,高 8 位(8 位 ~ 15 位)构成了 AH 寄存器。AH 和 AL 寄存器是可以独立使用的 8 位寄存器。
  8. 下图展示了 16 位寄存器及它所分成的两个 8 位寄存器的数据存储的情况:
    图 2.4 16 位寄存器及所分成的两个 8 位寄存器的数据存储情况

2.2 字在寄存器中的存储


  1. 出于对兼容性的考虑,8086 CPU 可以一次性处理以下两种尺寸的数据:
  • 字节:记为 byte,一个字节由 8 个 bit 组成,可以存在 8 位寄存器中。
  • 字:记为 word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节,如下图所示:
    图 2.5 一个字由两个字节组成
  1. 一个字可以存在一个 16 位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高 8 位寄存器和低 8 位寄存器中。如图 2.4 所示,一个字型数据 20000,存在 AX 寄存器中,在 AH 中存储了它的高 8 位,在 AL 中存储了它的低 8 位。AH 和 AL 中的数据,既可以看成是一个字型数据的高 8 位和低 8 位,这个字型数据的大小是 20000;又可以看成是两个独立的字节型数据,它们的大小分别是 78 和 32。
  2. 任何数据,到了计算机中都是以二进制的形式存放的。为了描述不同的问题,又经常将它们用其他的进制来表示。例如,对于十进制数 20000,它的二进制形式是 0100 1110 0010 0000,而它的十六进制形式是 4E20。二进制是这个数在计算机中存储的真实形式;十进制是人类所习惯使用的数制,用它来表示数可以让我们直观地感受到这个数的大小;十六进制是汇编课程中经常用到的一种数制。
  3. 十六进制数的一位相当于二进制数的四位,例如 0100 1110 0010 0000 可以表示为 4(0100)E(1110)2(0010)0(0000) 这个四位十六进制数。
  4. 由于一个内存单元可存放 8 位数据,CPU 中的寄存器又可存放 n 个 8 位的数据。也就是说,计算机中的数据大多是由 1 ~ N 个 8 位数据构成的。很多时候,我们需要直观地看出组成数据的各个字节数据的值,用十六进制来表示数据可以直观地看出这个数据是由哪些 8 位数据构成的。比如 20000 写成 4E20 就可以直观地看出,这个数据是由 4E 和 20 两个 8 位数据构成的,如果 AX 中存放 4E20,则 AH 里是 4E,AL 里是 20。这种表示方法便于许多问题的直观分析。
  5. 为了区分不同的进制,常在十六进制数的后面加“H”,例如 4E20H;常在二进制数的后面加“B”,例如 0100111000100000B;在十进制数的后面则什么也不加。

2.3 几条汇编指令


  1. 通过汇编指令控制 CPU 进行工作,看一下下表中的几条指令:
    表 2.1 汇编指令举例
  2. 在写一条汇编指令或一个寄存器的名称时不区分大小写。
  3. 接下来看一下 CPU 执行下表中所列的程序段中的每条指令后,对寄存器中的数据进行的改变:
    表 2.2 程序段中指令的执行情况之一(1)
    表 2.2 程序段中指令的执行情况之一(2)

[问题 2.1] 指令执行后 AX 中的数据为多少?

[我的答案] 044CH

  1. 程序段中的最后一条指令 add ax,bx,在执行前 ax 和 bx 中的数据都为 8226H,相加后所得的值为 1044CH。但是 ax 为 16 位寄存器,只能存放 4 位十六进制的数据,所以最高位的 1 不能在 ax 中保存,ax 中的数据为 044CH。
  2. 请阅读下表中所列的一段程序及其执行情况:
    表 2.3 程序段中指令的执行情况之二

[问题 2.2] 指令执行后 AX 中的数据为多少?

[我的答案] 0058H

  1. 程序段中的最后一条指令 add al,93H,在执行前,al 中的数据为 C5H,相加后所得的值为 158H。但是 al 为 8 位寄存器,只能存放两位十六进制的数据,所以最高位的 1 丢失,ax 中的数据为 0058H。(这里的丢失,指的是进位值不能在 8 位寄存器中保存,但是 CPU 并不真的丢弃这个进位值。这个问题在以后的学习中再讨论。)
  2. 注意,此时的 al 是作为一个独立的 8 位寄存器来使用的,和 ah 没有关系,CPU 在执行这条指令时认为 ah 和 al 是两个不相关的寄存器。不要错误地认为,诸如 add al,93H 的指令产生的进位会存储在 ah 中,add al,93H 进行的是 8 位运算。
  3. 在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:
mov ax,bx
mov bx,cx
mov ax,18H
mov al,18H
add ax,bx
add al,bl
add ax,20000
  1. 这些指令则是错误的:
mov ax,bl
mov bh,ax
mov al,20000
add al,100H

检测点 2.1


检测点 2.1(1)
检测点 2.1(2)

[我的答案]

  1. (1)F4A3H。(2)31A3H。(3)3123H。(4)6246H。(5)826CH。(6)6246H。(7)826CH。(8)04D8H。(9)0482H。(10)6C82H。(11)D882H。(12)D888H。(13)D810H。(14)6246H。
  2. 依题意编写的程序如下:
mov ax,2
add ax,ax
add ax,ax
add ax,ax

猜你喜欢

转载自blog.csdn.net/qq_29381145/article/details/82942800