汇编语言在处理数据时,必须准确指出数据存储的地方。计算机中可用于存储数据的装置有:CPU内部的寄存器;计算机的存储器;I/O端口(即I/O设备接口中的一些寄 存器)。
下面介绍8086系统的数据存储。
寄存器
图(8086的寄存器)所示为8086CPU中用于汇编语言程序设计的全部寄存器。根据用途不同,这些寄存器被分为三组:通用寄存器、专用寄存器和段寄存器。每个寄存器都有一个符号标志,作为寄存器的助记符。编程时,若所用数据存在某个寄存器中,就用其助记符来指出。
通用寄存器
通用寄存器用途多样,使用灵活,是编程时主要使用的寄存器。
AX寄存器
AX为16位寄存器,可以存放一个16位定点数,是使用最多的寄存器。AX在系统中有特殊的地位,称为16位累加寄存器,一些指令指定用AX存储数据。合理使用AX,还可以有效提高一些指令的时、空效率。
AX还可以分解为两个8位寄存器AH和AL。AH和AL可以作为独立的8位寄存器使用,也可以组合成16位的AX使用(AH为高8位,AL为低8位)。例如,若(AX)= 458EH,则(AH)= 45H,(AL) = 8EH。
在处理8位数据时,AL具有与AX类似的地位,称为8位累加寄存器。
BX、CX、DX寄存器
这三个寄存器也都是16位寄存器,也都能分解为两个8位寄存器使用(如图8086的寄存器所示)。
它们与AX有着相同的基本用途,但也有各自的独特用法,如BX中的内容可被用来生成一个存储器地址,以便据此访问存储器;CX在一些指令中被指定作为计数器使用;DX则在某些指令中被指定与AX配合,存储一个32位数。
BP寄存器
BP是不能分解的16位寄存器,可以存放一个16位数据,其所存内容也可用来生成一个存储器地址,并据此访问存储器。
SI和DI寄存器
这两个寄存器也都是不能分解的16位寄存器,其基本用途与BP相似,且在某些指令中被指定使用。
专用寄存器
这几个专用寄存器都有专一的用途,不可挪作他用。
SP寄存器
SP也叫堆栈指针,是一个16位寄存器,存放的是堆栈栈顶的地址,其内容将随着进栈和出栈操作而动态改变。
IP寄存器
IP也叫指令指针,是一个16位计数寄存器,用来提供下一条要执行的指令的地址。CPU就是根据IP提供的指令地址,到存储器中取出要执行的指令,并执行该指令的。一 条指令被取出后,CPU会修改IP中的地址,使其指向下一条指令......如此进行下去,CPU就能把整个程序全部执行完。
在汇编语言中,不能显式使用IP,只有控制程序执行流程的一类指令(程序控制类指令)能够隐式修改IP中的内容。
FLAGS寄存器
FLAGS为16位寄存器,是CPU中的状态标志寄存器。8086系统使用该寄存器中的9位,记录了9种状态标志,如图(8086的FLAGS)所示。
这些状态标志可分为两大类:条件标志和控制标志。
条件标志
条件标志记录运算所产生的一些状态,程序中可以根据这些状态决定后续的操作。也就是说,条件标志是用来决定程序后续操作的条件。FLAGS中的条件标志有6个。
- CF标志(进位/借位标志):主要用于记录加、减运算时,最高位上产生的进位或借位状态。CF=0,无进位或借位;CF=1,有进位或借位。
- AF标志(辅助进位/借位标志):用于记录加、减运算时,第3位上产生的进位或借位状态。AF=0,无进位或借位;AF=1,有进位或借位。
- ZF标志(零标志):用于记录运算结果是否为0。ZF=0,运算结果不为0;ZF=1, 运算结果为0。
- SF标志(符号标志):用于记录运算结果的符号位(或最高位)状态。SF=0,符号位为0(表示正号);SF=1,符号位为1(表示负号)。该标志主要用于带符号数(补码)运算。
- OF标志(溢出标志):主要用于记录带符号数(补码)加、减运算时的溢出状态。OF=0,无溢出;OF=1,有溢出。
- PF标志(奇偶标志):用于记录运算结果的低8位中,“1”的个数是奇数个还是偶数个。PF=0,奇数个1;PF=1,偶数个1。该标志用于对数据进行奇偶校验。
分析以下加法运算后,各条件标志的状态
0 1 0 1 0 1 1 0
+ 1 0 1 1 Q 1 1 1
--------------------
[1] 0 0 0 0 1 1 0 1
分析:由运算结果可知,最高位上产生了进位[1],因此CF=1 (在计算机中,该进位不被纳入运算结果,而是记录在CF标志位上,如后续运算需要此进位,可从CF取得);由 式中可知,第3位(式中带下画线的位)未产生进位,故AF=0;运算结果(排除最高位的进位,下同)不为0,所以ZF=0;运算结果中的最高位(对带符号数而言,为符号位)为0,故SF=0;如将式中两数视为带符号数的补码,则为异号数相加,其和不会溢出,所以OF=0;运算结果的8位二进制数中,共有3个1,3为奇数,故PF=0。
控制标志
控制标志用于对CPU的某些工作方式进行控制,可通过专门的指令对其进行设置。FLAGS中的控制标志有3个。
- DF标志(方向标志):用于在字符串操作时,控制串指针的修改方向。DF=O,增量修改;DF=1,减量修改。
- IF标志(中断标志):用于决定是否允许CPU响应外部的可屏蔽中断请求。IF=O,禁止响应;IF=1,允许响应。
- TF标志(陷阱标志):用于决定CPU是否以单步(也称单步陷阱)方式工作。TF=0,禁止单步方式;TF=1,允许单步方式。单步方式用于程序调试。在此方式下,CPU每执行完一条指令就会产生单步陷阱,暂停后续指令的执行。调试人员可以在此检查程序的执行状况是否正常,以便发现和排除程序中的错误。
段寄存器
8086系统由于硬件条件的限制,对存储器的使用釆取分段模式。此模式下,存储器地址分成段地址和段内偏移地址两部分表示。段寄存器就是专门用来存放段地址的寄存器。
8086系统中,一个汇编语言程序最多可以同时操作4个活跃的段,所以共设有4个段寄存器,均为16位寄存器。
CS寄存器
CS是代码段寄存器,存放代码段的段地址。代码段是存储程序中指令代码的段。
DS寄存器
DS是数据段寄存器,存放数据段的段地址。数据段是存储程序中定义的各种变量的段。
ES寄存器
ES是附加段寄存器,存放附加数据段的段地址。当一个数据段的存储空间不够用时,可以定义附加数据段。
SS寄存器
SS是堆栈段寄存器,存放堆栈段的段地址。堆栈段是在程序中作为堆栈使用的存储段。