汇编语言简明教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.2 8086的寄存器

处理器内部需要高速存储单元,用于暂时存放程序执行过程中的代码和数据,这些存储单元被称为寄存器(Register)。处理器内部设计有多种寄存器,每种寄存器还可能有多个,从应用的角度可以分成两类:透明寄存器和可编程寄存器。

有些寄存器对应用人员来说不能通过指令直接编程控制,例如:保存指令代码的指令寄存器。它们对应用人员来说好像看不见一样,被称为透明寄存器。这里的“透明”(Transparency)是计算机学科中常用的一个专业术语,表示实际存在但从某个角度看好像没有;运用“透明”思想可以使我们抛开不必要的细节,而专注于关键问题。

底层语言程序员需要掌握可编程(Programmable)寄存器。它们具有引用名称、供编程使用,还可以进一步分成通用和专用寄存器:

⊙ 通用寄存器:这类寄存器在处理器中数量较多、使用频度较高,具有多种用途。例如它们可用来存放指令需要的操作数据,又可用来存放地址以便在主存或I/O接口中指定操作数据的位置。

⊙ 专用寄存器:这类寄存器各自只用于特定目的。例如程序计数器PC(Program Counter)只用于记录将要执行指令的主存地址,标志寄存器保存指令执行的辅助信息。

8086的寄存器有8个16位通用寄存器、4个16位段寄存器、1个16位标志寄存器和1个16位指令指针寄存器,如图1-4(图中数字15、7、0等依次用于表达二进制位D15、D7、D0)所示。

图1-4 8086的寄存器

1. 通用寄存器

通用寄存器(General-Purpose Register)一般是指处理器最常使用的整数通用寄存器,可用于保存整数数据、地址等。8086处理器只有8个通用寄存器,数量有限。

8086 处理器的 8 个 16 位通用寄存器,分别被命名为:AX、BX、CX、DX、SI、DI、BP和SP。其中前4个通用寄存器AX、BX、CX和DX还可以进一步分成高字节H(High)和低字节L(Low)两部分,这样又有了8个8位通用寄存器:AH和AL、BH和BL、CH和CL、DH和DL。前4个通用寄存器在编程中,可以整个使用16位寄存器(例如:AX),也可以分成两个8位使用:D15~D8(例如:AH)和D7~D0(例如:AL),对其中某8位的操作,并不影响另外对应8位的数据。

通用寄存器的用途很多,可以保存数据、暂存运算结果,也可以存放存储器地址、作为变量的指针。但在 8086 处理器中每个寄存器又有它们各自的特定作用,并因而得名。程序中通常也按照其含义使用它们,如表1-2所示。

表1-2 8086处理器的通用寄存器

许多指令需要表达两个操作数(操作对象,例如加法指令的被加数以及加法结果):

⊙ 源操作数是指被传送或参与运算的操作数(例如:加法的被加数)。

⊙ 目的操作数是指保存传送结果或运算结果的操作数(例如:加法的和值结果)。

SI和DI是变址寄存器,常通过改变寄存器表达的地址指向数组元素。SI常用于指向源操作数,而DI常用于指向目的操作数。

堆栈(Stack)是一个特殊的存储区域,它采用先进后出FILO(First In Last Out)、也称为后进先出LIFO(Last In First Out)的操作方式存取数据。它用于调用子程序时暂存数据、传递参数、存放局部变量,也可以用于临时保存数据。BP和SP是指针寄存器,用于指向堆栈中的数据。其中,SP堆栈指针会随着处理器执行有关指令自动增大或减小,所以SP不应该再用于其他目的,实际上可归类为专用寄存器;但是 SP 又可以像其他通用寄存器一样灵活地改变。

2. 标志寄存器

标志(Flag)用于反映指令执行结果或控制指令执行形式。许多指令执行之后将影响有关的状态标志位;不少指令的执行要利用某些标志;当然,也有很多指令与标志无关。处理器中用一个或多个二进制位表示一种标志,其0或1的不同组合表达标志的不同状态。Intel 8086支持的9个标志,分为状态标志和控制标志两类,采用一个16位的标志寄存器FLAGS保存,如图1-5所示(图上方的数字表示该标志在标志寄存器中的位置)。

图1-5 标志寄存器FLAGS

状态标志是最基本的标志,用来记录指令执行结果的辅助信息。加减运算和逻辑运算指令是主要设置它们的指令,其他有些指令的执行也会相应地设置它们。状态标志有6个,处理器主要使用其中5个构成各种条件,分支指令判断这些条件实现程序分支。它们从低位到高位是:进位标志CF(Carry Flag)、奇偶标志PF(Parity Flag)、调整标志AF(Adjust Flag)、零标志ZF(Zero Flag)、符号标志SF(Sign Flag)、溢出标志OF(Overflow Flag)。

控制标志用于控制处理器执行指令的方式,可由程序根据需要用相关指令设置。8086的控制标志有3个:方向标志DF(Direction Flag),仅用于串操作指令中,控制地址的变化方向;中断允许标志IF(Interrupt-enable Flag),或简称中断标志,用于控制外部可屏蔽中断是否可以被处理器响应;陷阱标志TF(Trap Flag),也常称为单步标志,用于控制处理器是否进入单步操作方式。

3. 指令指针寄存器

程序由指令组成,指令存放在主存储器中。处理器需要一个专用寄存器表示将要执行的指令在主存的位置,这个位置用存储器地址表示。在 8086 处理器中,这个存储器地址保存在16位指令指针寄存器IP(Instruction Pointer)中。

指令指针寄存器IP一个是专用寄存器,具有自动增量的能力。处理器执行完一条指令, IP就加上该指令的字节数,指向下一条指令,实现程序的顺序执行。需要实现分支、调用等操作时需要修改 IP,它的改变将引起程序转移到指定的指令执行。但 IP 寄存器不能像通用寄存器那样直接赋值修改,需要执行控制转移指令(如跳转、分支、调用和返回指令)、出现中断或异常时被处理器赋值而相应改变。

4. 段寄存器

一个程序当中,有可以执行的指令代码,还有指令操作的各类数据等。遵循模块化程序设计思想,希望将相关的代码安排在一起,相关的数据安排在一起,于是(区)段(Segment)的概念自然出现。一个段安排一类代码或数据。程序员在编写程序时,可以很自然地把程序的各部分放在相应的段中。对应用程序来说,主要涉及3类基本段:存放程序中指令代码的代码段(Code Segment)、存放当前运行程序所用数据的数据段(Data Segment)和指明程序使用的堆栈区域的堆栈段(Stack Segment)。

段其实就是主存的一个连续区域,为了表明段在主存中的位置,8086处理器设计有4个16位段寄存器:代码段寄存器CS,堆栈段寄存器SS,数据段寄存器DS和附加段寄存器ES (Extra Segment)。其中,附加段也是用于存放数据的数据段,专为处理数据串设计的串操作指令必须使用附加段作为其目的操作数的存放区域。