寄存器(8086CPU)概述与作用

目录

  • 寄存器(8086CPU)概述与作用
    • 0 概述
    • 1 通用寄存器
      • 1.1 数据寄存器
        • 1.1.1 累加寄存器(AX)
        • 1.1.2 基地址寄存器(BX)
        • 1.1.3 计数器寄存器(CX)
        • 1.1.4 数据寄存器(DX)
      • 1.2 指针寄存器
        • 1.2.1 BP寄存器
        • 1.2.2 SP寄存器
      • 1.3 变址寄存器
    • 2 段寄存器
      • 2.1 代码段寄存器(CS)
      • 2.2 堆栈段寄存器(SS)
      • 2.3 数据段寄存器(DS)及附件段寄存器(ES)
    • 3 控制寄存器
      • 3.1 FLAG寄存器
      • 3.2 IP寄存器
    • 4 巨人的肩膀

0 概述

所有寄存器均为16位,可以存放两个字节。8086CPU共有14个寄存器,分别是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、FLAG

这 14 个寄存器按照一定方式又分为了通用寄存器控制寄存器段寄存器

  • 通用寄存器:
    • 数据寄存器:AX、BX、CX、DX
    • 指针寄存器:SP、BP
    • 变址寄存器:SI、DI
  • 段寄存器:CS、SS、DS、ES
  • 控制寄存器:IP、FLAG
寄存器英文名分类具体名称常用关联
AXAccumulator数据寄存器累加寄存器div除法指令和mul乘法指令会调用;端口的输入输出只能用ax、al存放
BXBase数据寄存器基地址寄存器经常与ds, es 连用;[bx] 默认调用ds:[bx]
CXCount数据寄存器计数器寄存器储存循环次数,loop, jcxz指令会调用cx
DXData数据寄存器数据寄存器常用来储存数据
SPStack Pointer指针寄存器堆栈指针寄存器存放栈顶的偏移地址
BPBase Pointer指针寄存器基指针寄存器默认与ss相关联,比如 [bp] 默认调用 ss:[bp]
SISource Index变址寄存器源变址寄存器常用于 ds:[si],存放偏移地址,数据从哪里来
DIDestination Index变址寄存器目的地址寄存器常用于 es:[di],存放偏移地址,数据到哪里去
DSData Segment段寄存器数据段寄存器常用于 ds:[si],存放段地址,数据从哪里来
ESExtra Segment段寄存器附加段寄存器常用于 es:[di],存放偏移地址,数据到哪里去
SSStack Segment段寄存器堆栈段寄存器存放栈的段地址
CSCode Segment段寄存器代码段寄存器存放执行指令的段地址
IPInstruction Pointer控制寄存器指令指针寄存器存放执行指令的偏移地址
FLAGFlag控制寄存器标志寄存器按位作用,详见正文

1 通用寄存器

AX、BX、CX、DX用于存放一般性数据,被统称为通用寄存器。

以AX为例,寄存器的逻辑结构如图:

AX、BX、CX、DX这4个寄存器均可分为两个可独立使用的8位寄存器来使用,仍以AX为例,16位寄存器分为两个8位寄存器的情况如图:

1.1 数据寄存器

1.1.1 累加寄存器(AX)

AX寄存器又被称为累加寄存器或简称为累加器,除其暂存数据的作用外,还有一些特殊作用,即在使用MUL指令和DIV指令时。

  • 在使用MUL做乘法运算时,两个相乘的数要么都是8位,要么都是16位。如果两个相乘的数都是8位的话,则一个存放在AL,另一个位于其他寄存器或内存字节单元,默认乘法结果保存在AX当中;如果两个相乘的数都是16位的话,一个默认存放在AX中,另一个位于其他寄存器或内存字单元,默认乘法结果有32位,高位默认保存在 DX 中,而低位则默认保存在 AX 中。
  • 在使用MUL做除法运算时,除数有两种情况,即除数可以是8位或者是16位的,且除数可以存放在寄存器中或者是内存单元中,被除数则由AX负责。当除数为8位时,被除数一定是16位的,并默认放在AX寄存器中;当除数位16位时,被除数一定是32位的,此时被除数高16位存放在DX中,低16位存放在AX中。

1.1.2 基地址寄存器(BX)

除了暂存一般性数据的功能外,BX主要还是用于其专属功能——寻址(寻找物理内存地址)上,BX寄存器中存放的数据一般是用来作为偏移地址使用的。在 8086 CPU 中,CPU 是根据 来进行寻址操作,经常与DS、ES连用,如DS:[BX][BX] 默认调用DS:[BX]

1.1.3 计数器寄存器(CX)

除了暂存一般性数据的功能外,CX也有其专门用途——储存循环次数,loop, jcxz指令会调用cx。

当使用LOOP循环指令时,可以通过CX指定需要循环的次数,CPU每一次执行LOOP指令时,都会做两件事:

  1. CX=CX-1,即令CX计数器减去一
  2. 判断CX中的值,如果CX中的值为0则跳出循环

1.1.4 数据寄存器(DX)

除了暂存一般性数据的功能外,DX在其他方面也具有用途,已在介绍AX寄存器时有所介绍过了。

1.2 指针寄存器

1.2.1 BP寄存器

BP为基指针寄存器,与其他几个用来寻址操作所使用的寄存器(BX,SI,DI)没有太大区别。

它作为通用寄存器的一种,其可以暂存数据,而BP又不是数据寄存器,意味着其不能分割成为两个8位寄存器使用。

以 […] 的方式访问内存单元而且在 […] 中使用了寄存器 BP 的话,那么如果在指令中没有明确或者说是显示的给出段地址时,段地址则使用默认的 SS 寄存器中的值(BX,SI,DI 会默认使用 DS 段寄存器),比如DS:[BP]中明确给出了段地址位于DS中。

1.2.2 SP寄存器

SP寄存器必须与SS段寄存器一起使用,所以SP寄存器将在后文中与SS段寄存器一起作介绍

1.3 变址寄存器

SI (Source Index) 是源变址寄存器,DI (Destination Index) 即是目的变址寄存器。

8086 CPU 中的 SI 寄存器和 DI 寄存器其实和 BX 寄存器的功能是差不多的,即寻址操作和暂存一般性数据,只不过 SI 寄存器和 DI 寄存器均不是数据寄存器,所以它们不能够拆分为 2 个独立的 8 位寄存器。

SI:常用于 DS:[SI],存放偏移地址,数据从哪里来

DI:常用于 ES:[DI],存放段地址,数据到哪里来

示例:

MOV SI,0;初始化偏移地址为 0MOV AX,[SI];将段地址为 DS 偏移地址为 SI 的内存单元中的值移入 AX 中MOV AX,DS:[SI];将段地址为 DS 偏移地址为 SI 的内存单元中的值移入 AX 中MOV AX,SS:[SI];将段地址为 SS 偏移地址为 SI 的内存单元中的值移入 AX 中MOV DI,0;初始化偏移地址为 0MOV AX,[DI];将段地址为 DS 偏移地址为 DI 的内存单元中的值移入 AX 中MOV AX,DS:[DI];将段地址为 DS 偏移地址为 DI 的内存单元中的值移入 AX 中MOV AX,SS:[DI];将段地址为 SS 偏移地址为 DI 的内存单元中的值移入 AX 中

2 段寄存器

2.1 代码段寄存器(CS)

CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中 CS 为代码段寄存器,而 IP 为指令指针寄存器 。

当我们运行一个可执行文件时,我们需要另外一个程序来将这个可执行文件加载到内存当中,一般是通过操作系统的外壳程序( Shell 程序)将可执行文件加载到内存中以后,就会设置 CPU 中的两个寄存器,即设置 CS:IP 两个寄存器指向可执行文件的起始地址,此后 CPU 便从这个起始地址开始读取内存中的指令,并且执行。

我们在写汇编程序时,通常会使用 START 标记,其实这个标记就是用来标记起始地址的,当将一个汇编程序编译,连接成可执行文件以后,再通过操作系统的 Shell 程序将可执行文件加载到内存中以后,这个 START 所标记处的地址就是整个可执行文件的起始地址了 。

即,当一个可执行文件加载到内存中以后,CS:IP 两个寄存器便指向了这个可执行文件的起始地址,然后 CPU 就可以从这个起始地址开始往下读取指令,当读取完指令后,CS:IP 将会自动的改变(基本上是改变 IP) ,从而指向下一条要读取的指令,这样就可以执行这个可执行文件了 。

2.2 堆栈段寄存器(SS)

在任何时刻,SS:SP 都是指向栈顶元素,要注意8086 CPU 并不会保证我们对栈的操作会不会越界,所以我们在使用栈的时候需要特别注意栈的越界问题 。

  • 当使用 PUSH 指令向栈中压入 1 个字节单元时,SP = SP – 1;即栈顶元素会发生变化;

  • 当使用 PUSH 指令向栈中压入 2 个字节的字单元时,SP = SP – 2 ;即栈顶元素也要发生变化;

  • 当使用 POP 指令从栈中弹出 1 个字节单元时, SP = SP + 1;即栈顶元素会发生变化;

  • 当使用 POP 指令从栈中弹出 2 个字节单元的字单元时, SP = SP + 2 ;即栈顶元素会发生变化;

2.3 数据段寄存器(DS)及附件段寄存器(ES)

DS 段寄存器来存放要访问的数据的段地址;ES段寄存器是一个附加段寄存器,当其他段寄存器不够用时,可以考虑使用ES段寄存器。

3 控制寄存器

3.1 FLAG寄存器

FLAG寄存器与其他寄存器不同,其他寄存器都是用来存放数据的,而FLAG寄存器按位起作用。

8086CPU的FLAG寄存器结构如图所示:

  • ZF标志:零标志位,记录相关指令执行后,其结果是否为0。结果为0,则zf=1;结果不为0,则zf=0。
  • PF标志:奇偶标志位,记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,则pf=1;如果为奇数,则pf=0。
  • SF标志:符号标志位。记录相关指令执行后,其结果是否为负。如果结果为负,则sf=1;如果非负,则sf=0。
  • CF标志:进位标志位,一般情况下,在进行无符号数运算时,记录运算结果的最高有效位是否向更高位进位,或从更高位借位。
  • OF标志:溢出标志位,一般情况下,记录了有符号数运算的结果是否溢出。如果发生溢出,OF=1;如果没有,OF=0;
  • DF标志:方向标志位,在串处理指令中,控制每次操作后si、di的增减。df=0,si、di递增;df=1,si、di递减。

3.2 IP寄存器

通常与CS寄存器配合使用,已在前文的CS介绍中介绍过。

4 巨人的肩膀

王爽. 汇编语言.第3版[M]. 清华大学出版社, 2013.

https://blog.csdn.net/ulan420/article/details/126329586