根据汇编学习经历和编程经验总结一下8086系统通用寄存器的专用功能。

引子


8086 系统中有 8 个通用寄存器。虽然叫作通用寄存器,但它们却都有自己专门的名字,这是因为它们都有自己专门的功能。比如 CX 作为计数寄存器,用来存储循环次数。如果只有一个专用功能,那就它们只能称之为专用寄存器了,而这些寄存器还可以用来传送数据和暂存数据,所以称它们为通用寄存器。

数据寄存器


数据寄存器主要用来保存操作数和运算结果等信息,它们的存在节省了为存取操作数所需占用总线和访问存储器的时间。这四个 16 位的数据寄存器均可分解成两个独立的 8 位寄存器,这些 8 位的寄存器有各自的名称,均可独立存取。
例如:AX寄存器可以分解为AH寄存器和 AL 寄存器,其中 AH 寄存器就是 AX 寄存器的高 8 位,AL 寄存器就是AX寄存器的低 8 位。其他寄存器类似。

累积器

AX:
i. 在字乘、字除指令中做累加器,存储被除数/商以及因数/积;
ii. 在字I/O操作时用做数据寄存器与外界设备传送数据;

AH, AL:
i. 在LAHF指令中用做目的寄存器;
ii. 在字节乘、字节除指令中用做累加器,存储;
iii. 在字节I/O操作时做数据寄存器与外界设备传送数据;
iv. BCD、ASCII码数据运算时用作累加器,在XLAT指令中用作累加器。

除法运算
运算开始时:
如果除数是 8 位,被除数一定是 16 位的,被除数默认放在 AX 寄存器中;
如果除数是 16 位,被除数一定是 32 位的,这时要引入 DX,其中 DX 放被除数的高 16 位,AX 则放被除数的低 16 位。
运算结束时:
如果除数是 8 位,则 AL 中保存此次除法操作的商,而在 AH 中保存此次除法操作的余数;
如果除数是 16 位,则 AX 中保存此次除法操作的商,而在 DX 中保存此次除法操作的余数。

乘法运算
运算开始时:(两个相乘的数要么都是 8 位,要么都是 16 位)
如果两个相乘的数都是 8 位,则一个默认放在 AL 中,另一个放在 8 位寄存器中或者内存字节单元中;
如果两个相乘的数都是 16 位,则一个默认放在 AX 中,另一个放在 16 位寄存器中或者内存单元中。
运算结束时:
如果是 8 位的乘法运算,则默认乘法运算的结果是保存在 AX 中;
如果是 16 位的乘法运算,则默认乘法运算的结果有 32 位,这时要引入 DX,其中高位默认保存在 DX 中,而低位则默认保存在 AX 中。

基址寄存器

BX:
i. 间接寻址时用作地址寄存器和基址寄存器;
ii. 在XLAT指令中用作基址寄存器。

它是四个数据存储器中唯一可以作为存储器指针使用的存储器

计数寄存器

CX:
i. 字符串操作时用作循环次数计数器;
ii. 循环操作时用作循环次数计数器。

CL:
在循环移位和移位操作时用作环移和移位次数的计数寄存器

CPU 在每次执行 LOOP 指令的时候,会完成两个过程:
i. CX = CX – 1,即令 CX 计数器自动减去 1;
ii. 判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,去执行循环后面的指令;如果 CX 中的值不为 0 ,则继续执行循环中所指定的指令。

数据寄存器

DX:
i. 在字乘、字除指令中用做辅助寄存器,具体使用见 AX 部分;
ii. I/O指令间接寻址时用作端口寄存器,存放I/O端口地址。

指针寄存器


这两个 16 位寄存器只能按 16 位进行存取操作,主要用来形成操作数的地址,用于堆栈操作中计算操作数的有效地址。

堆栈指针寄存器

SP:
堆栈指针,必须与SS配合使用,指向目前的堆栈位置,在任何时刻,SS:SP 都是指向栈顶元素。

基址指针寄存器

BP:
i. 间接寻址时用作地址寄存器和变址寄存器;
ii. 用作 SS 的一个相对基址位置,用于给出堆栈中数据区基址的偏移,从而可以方便的实现直接存取堆栈中的数据。

如果指令中明确给出段地址,例如 DS:[BP],那么它代表的内存单元是段地址为 DS,偏移量为 BP 寄存器中的值的内存单元;而如果指令中没有明确段地址,只使用 [BP] 时,那么它代表的内存单元是段地址为 SS,偏移量为 BP 寄存器中的值的内存单元。(BX,SI,DI 会默认使用 DS 段寄存器)

变址寄存器


这两个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于变址运算中计算操作数的有效地址。

源地址寄存器

SI:
i. 间接寻址时用作地址寄存器和变址寄存器;
ii. 串操作时时用作变址寄存器,用来存放相对于 DS 段的源变址指针

目的地址寄存器

DI:
i. 间接寻址时用作地址寄存器和变址寄存器;
ii. 串操作时时用作目的变址寄存器,用来存放相对于 ES 段的目的变址指针

再次强调
以上四个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。

最后补充


除上述的专用功能外,在中断系统中相应功能的实现也会指定专用的寄存器,由于中断类型太多不一一列举,详情可以在网上搜索BIOS、DOS中断大全便可找到所有的功能实现。

INT21H

完整 INT21H 功能可参考 百度文库 或者自行搜索