8086 CPU有14个寄存器,每个寄存器有一个名称。按照使用类别进行划分,80x86 CPU中的寄存器可以分为通用寄存器、段寄存器和专用寄存器三类。

8CEF5DB557BA0B69BB62E77B09291123-2.jpg

1.通用数据寄存器

8086 CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,有时候也可以存放地址,被称为通用数据寄存器。

① AX:累加器,运算时较多使用这个寄存器,有些指令规定必须使用它。
② BX:基址寄存器,除了存放数据,它经常用来存放一段内存的起始偏移地址。
③ CX:计数寄存器,除了存放数据,它经常用来存放重复操作的次数。
④ DX:数据寄存器,除了存放数据,它有时存放32位数据的高16位。

8086 CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上,8086 CPU的AX、BX、CX、DX这4个寄存器都可以分成两个可独立的8位寄存器来用,分别命名为:AH,AL,BH,BL,CH,CL,DH,DL。以AX为例,8086 CPU的16位寄存器分为两个8位寄存器的情况如图:

31848462BF7859864A5EED46204E739C-1.jpg

2.地址寄存器

16位的8086处理器有4个16位的通用地址寄存器。它们的主要作用是存放数据的所在偏移地址,也可以存放数据。这4个寄存器不能再拆分使用。

① SP:堆栈指针,这是一个专用的寄存器,存放堆栈栈顶的偏移地址。
② BP:基址指针,可以用来存放内存中数据的偏移地址。
③ SI:源变址寄存器,它经常用来存放内存中源数据区的偏移地址,所谓变址寄存器,是指在某些指令作用下它可以自动地递增或递减其中的值。
④ DI:目的变址寄存器,它经常用来存放内存中目的数据区的偏移地址,并在某些指令作用下可以自动地递增或递减其中的值。

3.段寄存器

16位80x86处理器有4个16位的段寄存器,分别命名为CS,SS,DS,ES。它们用来存放4个段的段基址。

① CS:代码段寄存器,用来存放当前正在执行的程序段的段基址。
② SS:堆栈段寄存器,用来存放堆栈段的段基址。
③ DS:数据段寄存器,用来存放数据段的段基址。
④ ES:附加段寄存器,用来存放另一个数据段的段基址。

32位80x86处理器仍然使用16位的段寄存器,但是它们存储的内容发生了变化。此外,32位80x86处理器还增加了两个段寄存器FS和GS,它们的作用与ES类似。

4.指令指针寄存器

IP:指令指针寄存器,存放即将执行指令的偏移地址

5.标志寄存器

FLAGS:存放CPU的两类标志。
状态标志:反映处理器当前的状态,如有无溢出、有无进位等。状态标志有6个:CF、PF、AF、ZF、SF和OF。
控制标志:用来控制CPU的工作方式,如是否响应可屏蔽中断等。控制标志有3个:TF、IF和DF。

F6232A2E3F5D71A350CA98B28EDF0114-1.jpg

各标志位的含义如下:

① OF:溢出标志。OF=l表示两个有符号数的运算结果超出了可以表示的范围,结果是错误的;OF=0表示没有溢出,结果正确。进行无符号数运算时也会产生新的 OF 标志(CPU 不知道处理对象是否为有符号数),此时程序员可以不关心OF标志。
② DF:方向标志。DF=0时,每次执行字符串指令后,源或目的地址指针用加法自动修改地址;DF=l时用减法来修改地址。它用来控制地址的变化方向。
③ IF:中断允许标志。IF=l 表示允许处理器响应可屏蔽中断请求信号,称为开中断,IF=0表示不允许处理器响应可屏蔽中断请求信号,称为关中断。
④ SF:符号标志。SF=1表示运算结果的最高位为“1”。对于有符号数,在溢出标志 OF=0时,SF=1表示运算结果为负,SF=0表示运算结果非负(正或零)。OF=1时,由于结果是错误的,所以符号位也和正确值相反。例如,两个负数相加产生溢出,此时SF=0。对于无符号数运算,SF无意义(但是可以看出结果的大小规模)。
⑤ ZF:零标志。ZF=l表示运算结果为零,减法运算后结果为零意味着两个参加运算的数大小相等;ZF=0,表示运算结果非零。
⑥ AF:辅助进位标志。在进行字操作时,低字节向高字节进位时,AF=1,否则为0。一般用于两个BCD数运算后调整结果用,对其他数的运算没有意义。
⑦ PF:奇偶标志。PF=1表示运算结果的低8位中有偶数个“1”;PF=0表示有奇数个“1”。它可以用来进行奇偶校验。
⑧ CF:进位/借位标志。CF=1表示两个无符号数的加法运算有进位,或者是减法运算有借位,需要对它们的高位进行补充处理;CF=0表示没有产生进位或借位。同样,进行有符号数运算时也会产生新的CF标志,此时程序员可以不关心CF标志。

状态标志在每次运算后自动产生,控制标志的值则由指令设置。

8086.jpeg

A Student on the way to full stack of Web3.