寄存器的概念
在CPU中,大致有如下器件:
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种器件进行工作
- 内部总线连接各种器件,在它们之间进行数据的传送
对于汇编编程来说,主要操作的是CPU中的寄存器。寄存器是CPU中可以用指令读写的部件,可以通过改变寄存器中内容实现对CPU的控制。
8086CPU中的所有寄存器都是16位的,可以存放1个字或2个字节。
寄存器的逻辑结构为:
一个16位寄存器可以存储16位的数据,存储数据的范围是 0~216-1 。
通用寄存器
8086CPU中的寄存器 AX 、BX 、CX 、DX 一般用来存放通用的数据,被称为通用寄存器。
为了保证与8位CPU的兼容,以上X系列通用寄存器可以分为两个独立的8位寄存器H系列(代表高位字节High)和L系列来使用。例如, AX 可以分为 AH 和 AL 寄存器:
AX 的低8位(0位~7位)构成了 AL 寄存器,高8位(8位~15位)构成了 AH 寄存器。
一个字可以存储在一个16位的寄存器中,这个字的高位字节和低位字节可以存储在寄存器的高8位寄存器和低8位寄存器中。
数进制的讨论
生活中常用的进制是十进制,但数据在计算机中的存储是以二进制的形式存放的。例如,一个 AX 寄存器中存储的数据可能是1011001100011001。
十六进制数的一位相当于二进制数的四位,因此以上数据可以表示成b(1011)3(0011)1(0001)9(1001)。
一个内存单元可以存放8位数据,CPU中寄存器也是8的倍数,由于计算机中的数据大多是用若干个8位数据构成的,使用十六进制表示数据可以直观地看出数据是由哪些8位数据构成的。
例如,20000写成十六进制4E20可以直观地看出,它是由4E和20两个8位数据组成的。这种方法便于许多问题的直观分析。
为了区分不同的进制,以后将在十六进制表示的数据后面加上H,在二进制表示的数据后面加上B,十进制表示的数据后面不加任何标记。
例如,以下三种进制表示的是同一个数据:十进制20000,十六进制4E20H,二进制0100111000100000B。
几条基本汇编指令
MOV
register
,
number
number
对应的值送入寄存器
number
中。其中 number
可以是一个十六进制数据,也可以是一个寄存器(包括H系列和L系列)。如果 number
是一个寄存器,那么该指令会将该寄存器内存储的值送入寄存器 register
中。
ADD
register
,
number
number
对应的值加到寄存器
number
中。该值同样可以是一个寄存器(包括自身)。MOV 与 ADD 指令的区别在于,MOV 指令会覆盖原有数据,而 ADD 指令会在原有数据的基础上加上新的数据。
在进行数据传输或运算时,要注意指令的两个操作对象的位数应当是一致的,也就是说数据与寄存器之间应当有位数一致性。因此:
- 寄存器 AX 可接收的数据范围是0000H~FFFFH
- 寄存器 AH 和 AL 可接收的数据范围是00H~FFH
不同位寄存器之间不能相互传输数据,或接收更高位的数据。
ADD 指令可能造成加法操作后数据超过了寄存器容纳范围的上限,造成进位值无法被保存(注意,CPU并不会丢弃它,但是目前并不涉及这一点)。
ADD 指令对 AL 等寄存器的加法操作也可能造成进位值丢失,注意该进位值并不会被存储到 AH 等中,由于寄存器之间是相互独立的,因此此时 AL 是作为一个独立的8位寄存器来使用,和 AH 无关。当然,对 AX 寄存器的操作会影响到 AH ,这时 AX 是一个完整的寄存器。