8086汇编学习笔记02

寄存器

系列文章

寄存器的概念

在CPU中,大致有如下器件:

对于汇编编程来说,主要操作的是CPU中的寄存器。寄存器是CPU中可以用指令读写的部件,可以通过改变寄存器中内容实现对CPU的控制。

8086CPU中的所有寄存器都是16位的,可以存放1个字或2个字节。

寄存器的逻辑结构为:

一个典型的寄存器结构

一个16位寄存器可以存储16位的数据,存储数据的范围是 0~216-1

通用寄存器

8086CPU中的寄存器 AXBXCXDX 一般用来存放通用的数据,被称为通用寄存器。

为了保证与8位CPU的兼容,以上X系列通用寄存器可以分为两个独立的8位寄存器H系列(代表高位字节High)和L系列来使用。例如, AX 可以分为 AHAL 寄存器

AX寄存器的结构

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可以直观地看出,它是由4E20两个8位数据组成的。这种方法便于许多问题的直观分析。

为了区分不同的进制,以后将在十六进制表示的数据后面加上H,在二进制表示的数据后面加上B,十进制表示的数据后面不加任何标记

例如,以下三种进制表示的是同一个数据:十进制20000,十六进制4E20H,二进制0100111000100000B

几条基本汇编指令

MOV指令(传送指令)
格式:
MOV register , number
用途:
number 对应的值送入寄存器 number 中。

其中 number 可以是一个十六进制数据,也可以是一个寄存器(包括H系列和L系列)。如果 number 是一个寄存器,那么该指令会将该寄存器内存储的值送入寄存器 register 中。

ADD指令(加法指令)
格式:
ADD register , number
用途:
number 对应的值加到寄存器 number 中。该值同样可以是一个寄存器(包括自身)。

MOVADD 指令的区别在于,MOV 指令会覆盖原有数据,而 ADD 指令会在原有数据的基础上加上新的数据。

在进行数据传输或运算时,要注意指令的两个操作对象的位数应当是一致的,也就是说数据与寄存器之间应当有位数一致性。因此:

不同位寄存器之间不能相互传输数据,或接收更高位的数据。

ADD 指令可能造成加法操作后数据超过了寄存器容纳范围的上限,造成进位值无法被保存(注意,CPU并不会丢弃它,但是目前并不涉及这一点)。

ADD 指令对 AL 等寄存器的加法操作也可能造成进位值丢失,注意该进位值并不会被存储到 AH 等中,由于寄存器之间是相互独立的,因此此时 AL 是作为一个独立的8位寄存器来使用,和 AH 无关。当然,对 AX 寄存器的操作会影响到 AH ,这时 AX 是一个完整的寄存器。