0%

Intel 8086的寄存器结构

简单整理一下Intel 8086的各个寄存器的用途,为以后玩汇编语言奠定一个基础(>ω<)。

寄存器总览

Intel 8086共有14个寄存器,且均为16位,按照一定的方式又被分为通用寄存器组(其下又可被分为数据寄存器组和地址指针、变址寄存器组)、控制寄存器组和段寄存器组。

通用寄存器组

通用寄存器组包括累加寄存器AX、基址寄存器BX、计数寄存器CX、数据寄存器DX、堆栈指针寄存器SP、基址指针寄存器BP、源变址寄存器SI、目的变址寄存器DI,这些寄存器除了具有相应的专职功能外,还可用于数据的暂存。

数据寄存器组

数据寄存器组由累加寄存器AX、基址寄存器BX、计数寄存器CX、数据寄存器DX组成,为了兼容基于Intel 8086之前的8位CPU开发的程序,在Intel 8086中,每一个16位的数据寄存器均可拆分成2个独立的8位寄存器使用;即:

  • AXAHAL
  • BXBHBL
  • CXCHCL
  • DXDHDL

除此之外,其他16位寄存器均不可拆分为2个独立的8位寄存器。

累加寄存器AX & 数据寄存器DX

AX是算术运算的主要寄存器,所有I/O指令都使用AX与外部设备交换数据。

对于某些I/O操作,其端口地址可写入DX

在使用DIV指令(Intel 8086的除法指令)时,除数可以是8位或16位,且除数可以写入其他寄存器或内存;当除数是8位时,被除数一定是16位且默认被写入AX;当除数是16位时,被除数一定是32位,被除数的高16位被写入DX,低16位则被写入AX

当DIV指令执行完成后,如果除数是8位,此次除法操作的商被写入AL,余数则被写入AH;如果除数是16位,此次除法操作的商被写入AX,余数则被写入DX

在使用MUL指令(Intel 8086的乘法指令)时,两个乘数要么都是8位,要么都是16位;当两个乘数都是8位时,其中一个乘数默认被写入AL,另一个乘数则被写入其他寄存器或内存;当两个乘数都是16位时,其中一个乘数默认被写入AX,另一个乘数则被写入其他寄存器或内存。

当MUL指令执行完成后,如果是8位乘法运算,则运算结果为16位且默认被写入AX;如果是16位乘法运算,则运算结果为32位,其中高16位默认被写入DX,低16位默认被写入AX

基址寄存器BX

BX被写入基址,用于物理内存的寻址。

计数寄存器CX

CX在循环LOOP指令和串处理指令中用作计数器。

在Intel 8086每次执行LOOP指令时,

  • CX的值自动减1
  • 判断CX的值,若CX的值为0,则跳出循环;若CX的值不为0,则继续执行循环中的指令

地址指针、变址寄存器组

地址指针、变址寄存器组包括堆栈指针寄存器SP、基址指针寄存器BP、源变址寄存器SI和目的变址寄存器DI,经常被用于在段内寻址时提供偏移地址。

堆栈指针寄存器SP

SP用来表示栈顶的偏移地址,必须与SS联合使用。

基址指针寄存器BP

BP用于表示偏移地址,可与SS联合使用来确定堆栈段中的具体地址。

若指令中没有明确给出段寄存器,则BP默认与SS联合使用;若指令中明确给出段寄存器,则BP与该段寄存器联合使用。

源变址寄存器SI & 目的变址寄存器DI

一般与DS联用,用来确定数据段中的具体地址。

在串操作中,SIDS联用来寻址源操作数,DIES联用来寻址目的操作数,SIDI具有自动增量和自动减量的功能。

段寄存器组

段寄存器组包括代码(指令)段寄存器CS、数据段寄存器DS、堆栈段寄存器SS和附加段寄存器ES

代码段寄存器CS

CSIP联用表示了Intel 8086当前将要读取的指令的地址;当操作系统运行一个可执行文件时,操作系统会将该可执行文件的起始地址分别写入CSIP两个寄存器,随后CPU会从这个起始地址开始读取指令,当一条指令读取完后,自动变更IP,指向下一条要读取的指令。在任何时候,CSIP指向的地址即为Intel 8086将要执行的指令的地址。

堆栈段寄存器SS

SP联用,指向堆栈的栈顶。

数据段寄存器DS & 附加段寄存器ES

DS被写入待访问的数据段的段地址。

ES,emmmmm,备胎角色(/‵Д′)/~ ╧╧,当段寄存器不够用时,它再上位。

控制寄存器组

控制寄存器组包括指令指针寄存器IP和标志寄存器FLAG

指令指针寄存器IP

  • IP用于被写入代码段的偏移地址;
  • 程序运行过程中IP始终指向下一次待读取的指令的偏移地址;
  • IPCS联用才能生成物理内存地址。

用户程序不能对IP进行修改,只能由BIU自动修改。

标志寄存器FLAG

FLAG用于被写入程序的状态字(例如进位、中断等),被写入FLAG的信息是按位起作用的,即FLAG中的每一个位都表示程序不同的状态。

标志寄存器中各位如下:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
  • CF(进位标志):若运算过程中产生进位或错位,CF置1,否则置0;
  • PF(奇偶标志):若相关指令执行后其结果的低8位中1的个数为偶数,PF置1,否则置0;
  • AF(辅助进位标志):若字节操作中低半个字节向高半个字节借位或进位,AF置1,否则置0;
  • ZF(零标志):若相关指令执行后其结果为0,ZF置1,否则置0;
  • SF(符号标志):若相关指令执行后其结果为负数,SF置1,否则置0;
  • TF(追踪标志):常用于程序调试,若TF置1,每执行一条指令后,自动产生一次内部中断,使Intel 8086处于单步执行指令工作方式;
  • IF(中断允许标志):若IF置1,则允许外部可屏蔽中断,Intel 8086能响应外部的可屏蔽中断请求;
  • DF(方向标志):在串处理指令中,若令每次操作后SIDI均自增,DF置0;
  • OF(溢出标志):若相关指令执行有符号运算后其结果发生溢出,OF置1,否则置0。

若有错误,请各位大佬多多指教,非常感谢(〃´∀`)。

参考资料

8086CPU各寄存器及其简介

8086CPU详解