零基础入门~汇编语言(第四版王爽)~第2章寄存器(CPU工作原理)

前言

一个典型的 CPU(此处讨论的不是某一具体的 CPU)由运算器、控制器、寄存器(CPU 工作原理)等器件构成,这些器件靠内部总线相连。前一章所说的总线,相对于 CPU 内部 来说是外部总线。内部总线实现CPU 内部各个器件之间的联系,外部总线实现CPU 和主 板上其他器件的联系。简单地说,在CPU 中:

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

对于一个汇编程序员来说,CPU 中的主要部件是寄存器。寄存器是CPU 中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。
不同的CPU, 寄存器的个数、结构是不相同的。8086CPU 有14个寄存器,每个寄存器有一个名称。这些寄存器是:AX 、BX 、CX 、DX 、SI 、DI 、SP 、BP 、IP 、CS 、SS 、 DS 、ES 、PSW。

2.1 通用寄存器

8086CPU的所有寄存器都是16位的,可以存放两个字节。AX 、BX 、CX 、DX这 4 个寄存器通常用来存放一般性的数据,被称为通用寄存器。

以AX 为例,寄存器的逻辑结构如图2.1所示。
在这里插入图片描述
一个16位寄存器可以存储一个16位的数据,数据在寄存器中的存放情况如图2.2所示。 想一想,一个16位寄存器所能存储的数据的最大值为多少?
8086CPU 的上一代 CPU 中的寄存器都是8位的,为了保证兼容,使原来基于上代 CPU编写的程序稍加修改就可以运行在8086之上,8086CPU的 AX 、BX 、CX 、DX这 4 个寄存器都可分为两个可独立使用的8位寄存器来用:
● AX可分为AH 和 AL;
● BX可分为BH 和 BL;
● CX可分为CH 和 CL;
● DX可分为DH 和 DL;

数据:18
二进制表示:10010
在寄存器AX中的存储:
在这里插入图片描述
数据:20000
二进制表示:100111000100000
在寄存器 AX中的存储:
在这里插入图片描述
以 AX 为例,8086CPU 的16位寄存器分为两个8位寄存器的情况如图2.3所示。
在这里插入图片描述
AX 的低8位(0位~ 7位)构成了AL 寄存器,高8位(8位~15位)构成了AH 寄存器。 AH 和 AL 寄存器是可以独立使用的8位寄存器。图2.4展示了16位寄存器及它所分成的 两个8位寄存器的数据存储的情况。
想一想, 一个8位寄存器所能存储的数据的最大值为多少?
(2的8次方减一)
在这里插入图片描述

2.2 字在寄存器中的存储

出于对兼容性的考虑,8086CPU 可以一次性处理以下两种尺寸的数据。
● 字节:记为byte, 一 个字节由8个bit组成,可以存在8位寄存器中。
● 字:记为 word, 一个字由两个字节组成,这两个字节分别称为这个字的高位字 节和低位字节,如图2.5所示。
在这里插入图片描述
一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个 寄存器的高8位寄存器和低8位寄存器中。如图2.4所示, 一个字型数据20000,存在 AX 寄存器中,在AH 中存储了它的高8位,在AL中存储了它的低8位。 AH 和AL中的数据,既可以看成是一个字型数据的高8位和低8位,这个字型数据的大小是20000;又可以看成是两个独立的字节型数据,它们的大小分别是78和32。

                                        关于数制的讨论

任何数据,到了计算机中都是以二进制的形式存放的。为了描述不同的问题,又经常将它们用其他的进制来表示。比如图2.4中寄存器AX 中的数据是0100111000100000,这就是AX 中的信息本身,可以用不同的逻辑意义来看待它。可以将它看作一个数值,大小是20000。
当然,二进制数0100111000100000本身也可表示一个数值的大小,但人类习惯的是十进制,用十进制20000表示可以使我们直观地感受到这个数值的大小。十六进制数的一位相当于二进制数的四位,如0100111000100000可表示成:4(0100)、E(1110)、2(0010)、0(0000)四位十六进制数。 一个内存单元可存放8位数据,CPU 中的寄存器又可存放n个8位的数据。也就是说,计算机中的 数据大多是由1~N 个8位数据构成的。很多时候,需要直观地看出组成数据的各个字节数据的值,用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的。比如20000写成4E20就可以直观 地看出,这个数据是由4E 和20两个8位数据构成的,如果AX中存放4E20, 则 AH 里是4E,AL 里是20。这种表示方法便于许多问题的直观分析。在以后的课程中,我们多用十六进制来表示一个数据。
在以后的课程中,为了区分不同的进制,在十六进制表示的数据的后面加H, 在二进制表示的数据后面加B,十进制表示的数据后面什么也不加。如:可用3种不同的进制表示图2.4中AX 里的数据,十进制:20000,十六进制:4E20H,二进制:0100111000100000B。

2.3 几条汇编指令

通过汇编指令控制CPU进行工作,看一下表2.1中的几条指令。
在这里插入图片描述
注意,为了使具有高级语言基础的读者更好地理解指令的含义,有时会用文字描述和高级语言描述这两种方式来描述一条汇编指令的含义。在写一条汇编指令或一个寄存器的名称时不区分大小写。如: mov ax,18和 MOV AX,18的含义相同; bx 和 BX 的含义相同。
接下来看一下 CPU 执行表2.2中所列的程序段中的每条指令后,对寄存器中的数据 进行的改变。
在这里插入图片描述
在这里插入图片描述
问题2.1
指令执行后AX 中的数据为多少?思考后看分析。
分析:
程序段中的最后一条指令 add ax,bx, 在执行前ax 和 bx 中的数据都为8226H, 相加后所得的值为:1044CH, 但是 ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax 中保存,ax 中的数据为:044CH。
表2.3中所列的一段程序的执行情况。
在这里插入图片描述
问题2.2

指令执行后AX 中的数据为多少?思考后看分析。
分析:
程序段中的最后一条指令 add al,93H, 在执行前,al 中的数据为C5H, 相加后所得的值为:158H, 但是al 为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失 ,ax 中的数据为:0058H。(这里的丢失,指的是进位值不能在8位寄存器中保存,但 是CPU 并不真的丢弃这个进位值,关于这个问题,我们将在后面中讨论。)
注意,此时al 是作为一个独立的8位寄存器来使用的,和ah 没有关系,CPU 在执行这条指令时认为ah 和al 是两个不相关的寄存器。不要错误地认为,诸如 add al,93H的指令产生的进位会存储在ah 中,add al,93H 进行的是8位运算。
如果执行add ax,93H,低8位的进位会存储在ah 中 ,CPU 在执行这条指令时认为只 有一个16位寄存器 ax, 进行的是16位运算。指令 add ax,93H 执行后,ax 中的值为: 0158H。此时,使用的寄存器是16位寄存器ax,add ax,93H相当于将 ax 中的16位数据 00c5H和另一个16位数据0093H 相加,结果是16位的0158H。

在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:

在这里插入图片描述

检测点2 . 1
(1)写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 (AX=F4A3H)

mov ah,31H (AX=31A3H)

mov al,23H (AX=3123H )

add ax,ax ( AX=6246H)

mov bx,826CH (BX=826CH)

mov cx,ax (CX=6246H)

mov ax,bx (AX=826CH)

add ax,bx (AX=04D8H)

mov al,bh (AX=0482H)

mov ah,bl (AX=6C82H)

add ah,ah (AX=D882H)

add al,6 (AX=D888H)

add al,al (AX=D810H)

mov ax,cx (AX=6246H)

(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方

posted @ 2024-08-16 16:50  海鸥先生  阅读(1)  评论(0)    收藏  举报  来源