SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;
SI和DI又称作为变址寄存器:
SI (Source Index):源变址寄存器;
DI (Destination Index):目的变址寄存器; 控制寄存器:
IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器; 段寄存器:
CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;
下面对这些寄存器的作用和使用方式进行详细介绍。
8086 CPU 中的指针寄存器包括两个,SP 和 BP,因为 SP 寄存器实质上必须和 SS 段寄存器一起使用,所以,把 SP 寄存器留到后面和 SS 段寄存器一起作介绍。
BP也就是基指针寄存器,它和其他的几个用来进行寻址操作所使用的寄存器(还有 BX,SI,DI)没有太大的区别。首先,BP 寄存器作为通用寄存器的一种,说明其是可以暂存数据的,而后,BP 又不是数据寄存器,也就意味着其不能分割成 2 个独立的 8 位寄存器使用。
当以 […] 的方式访问内存单元而且在 […] 中使用了寄存器 BP 的话,如果在指令中没有明确或者说是显示的给出段地址时, 段地址使用默认的 SS 寄存器中的值(BX,SI,DI 会默认使用 DS 段寄存器)。比如 DS:[BP] 则在这里明确给出了段地址位于 DS 中,代表的内存单元即是段地址为 DS ,偏移量为 BP 寄存器中的值的内存单元;而如果是仅使用 [BP] 的话,则代表的内存单元是段地址为 SS,偏移量为 BP 寄存器中的值的内存单元。
在 8086 CPU 中,只有 4 个寄存器可以以 […] 的方式使用,这四个寄存器分别是 BX,SI,DI,BP。BX 寄存器在寻址中的使用:
MOV BP,0
MOV AX,[BP] 将 SS:[BP] 代表的内存单元移入 AX 中
MOV AX,CS:[BP] 将 CS:[BP] 代表的内存单元移入 AX 中
变址寄存器(SI,DI)
首先,变址寄存器和上面介绍的指针寄存器(也就是 BP 和 SP),它们的功能其实都是用于存放某个存储单元地址的偏移,或者是用于某组存储单元开始地址的偏移,即作为存储器指针使用,当然,由于变址寄存器和指针寄存器都是属于通用寄存器,所以它们也可以保存算术结果或者说是具有暂存数据的功能,但是因为它们不是数据寄存器,所以无法分割成 2 个独立的 8 位寄存器使用。
SI 是源变址寄存器,DI 是目的变址寄存器,8086 CPU 中的 SI 寄存器和 DI 寄存器其实和 BX 寄存器的功能是差不多的,只不过 SI 寄存器和 DI 寄存器均不是数据寄存器,所以它们不能够拆分为 2 个独立的 8 位寄存器。同时,通过使用 SI 和 DI 寄存器也可以用来完成寻址操作。
MOV SI,0 初始化偏移地址为 0
MOV AX,[SI] 将段地址为 DS 偏移地址为 SI 的内存单元中的值移入 AX中
MOV AX,DS:[SI] 将段地址为 DS 偏移地址为 SI 的内存单元中的值移入 AX 中
MOV AX,SS:[SI] 将段地址为 SS 偏移地址为 SI 的内存单元中的值移入 AX 中
CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中 CS 为代码段寄存器,而 IP 为指令指针寄存器 。当一个可执行文件加载到内存中以后,CS:IP 两个寄存器便指向了这个可执行文件的起始地址,然后 CPU 就可以从这个起始地址开始往下读取指令,当读取完指令后,CS:IP 将会自动的改变,基本上是改变 IP,从而指向下一条要读取的指令,这样就可以执行这个可执行文件了。任何时候,CS:IP 指向的地址中的内容都是 CPU 当前执行的指令。
DS 寄存器和 ES 寄存器都属于段寄存器,其实它们和 CS 寄存器以及 SS 寄存器用起来区别不大,既然是段寄存器的话,自然它们存放的就是某个段地址了。我们知道,CPU 要访问一个内存单元时,必须要提供一个指向这个内存单元的物理地址给 CPU ,而在 8086 CPU中,物理地址是由段地址左移 4 位(乘以16)后加上偏移地址形成的。我们也就只需要提供段地址和偏移地址即 OK 。DS寄存器存放的就是数据段的段地址 ,除了BP基指针寄存器外,其余的寄存器都默认使用DS寄存器的值作为段地址。
标志寄存器(FLAG)
前面已经介绍了 8086 CPU 14个寄存器中的 13 个了,下面我们将介绍最后一个寄存器也就是 FLAG 寄存器。FLAG 中的每一个位都表示不同的状态,存储的信息通常又被称作程序状态字(PSW) 。下面是 FLAG 寄存器中各个位的示意图:
SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;
SI和DI又称作为变址寄存器:
SI (Source Index):源变址寄存器;
DI (Destination Index):目的变址寄存器; 控制寄存器:
IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器; 段寄存器:
CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;
下面对这些寄存器的作用和使用方式进行详细介绍。
8086 CPU 中的指针寄存器包括两个,SP 和 BP,因为 SP 寄存器实质上必须和 SS 段寄存器一起使用,所以,把 SP 寄存器留到后面和 SS 段寄存器一起作介绍。
BP也就是基指针寄存器,它和其他的几个用来进行寻址操作所使用的寄存器(还有 BX,SI,DI)没有太大的区别。首先,BP 寄存器作为通用寄存器的一种,说明其是可以暂存数据的,而后,BP 又不是数据寄存器,也就意味着其不能分割成 2 个独立的 8 位寄存器使用。
当以 […] 的方式访问内存单元而且在 […] 中使用了寄存器 BP 的话,如果在指令中没有明确或者说是显示的给出段地址时, 段地址使用默认的 SS 寄存器中的值(BX,SI,DI 会默认使用 DS 段寄存器)。比如 DS:[BP] 则在这里明确给出了段地址位于 DS 中,代表的内存单元即是段地址为 DS ,偏移量为 BP 寄存器中的值的内存单元;而如果是仅使用 [BP] 的话,则代表的内存单元是段地址为 SS,偏移量为 BP 寄存器中的值的内存单元。
在 8086 CPU 中,只有 4 个寄存器可以以 […] 的方式使用,这四个寄存器分别是 BX,SI,DI,BP。BX 寄存器在寻址中的使用:
MOV BP,0
MOV AX,[BP] 将 SS:[BP] 代表的内存单元移入 AX 中
MOV AX,CS:[BP] 将 CS:[BP] 代表的内存单元移入 AX 中
变址寄存器(SI,DI)
首先,变址寄存器和上面介绍的指针寄存器(也就是 BP 和 SP),它们的功能其实都是用于存放某个存储单元地址的偏移,或者是用于某组存储单元开始地址的偏移,即作为存储器指针使用,当然,由于变址寄存器和指针寄存器都是属于通用寄存器,所以它们也可以保存算术结果或者说是具有暂存数据的功能,但是因为它们不是数据寄存器,所以无法分割成 2 个独立的 8 位寄存器使用。
SI 是源变址寄存器,DI 是目的变址寄存器,8086 CPU 中的 SI 寄存器和 DI 寄存器其实和 BX 寄存器的功能是差不多的,只不过 SI 寄存器和 DI 寄存器均不是数据寄存器,所以它们不能够拆分为 2 个独立的 8 位寄存器。同时,通过使用 SI 和 DI 寄存器也可以用来完成寻址操作。
MOV SI,0 初始化偏移地址为 0
MOV AX,[SI] 将段地址为 DS 偏移地址为 SI 的内存单元中的值移入 AX中
MOV AX,DS:[SI] 将段地址为 DS 偏移地址为 SI 的内存单元中的值移入 AX 中
MOV AX,SS:[SI] 将段地址为 SS 偏移地址为 SI 的内存单元中的值移入 AX 中
CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中 CS 为代码段寄存器,而 IP 为指令指针寄存器 。当一个可执行文件加载到内存中以后,CS:IP 两个寄存器便指向了这个可执行文件的起始地址,然后 CPU 就可以从这个起始地址开始往下读取指令,当读取完指令后,CS:IP 将会自动的改变,基本上是改变 IP,从而指向下一条要读取的指令,这样就可以执行这个可执行文件了。任何时候,CS:IP 指向的地址中的内容都是 CPU 当前执行的指令。
DS 寄存器和 ES 寄存器都属于段寄存器,其实它们和 CS 寄存器以及 SS 寄存器用起来区别不大,既然是段寄存器的话,自然它们存放的就是某个段地址了。我们知道,CPU 要访问一个内存单元时,必须要提供一个指向这个内存单元的物理地址给 CPU ,而在 8086 CPU中,物理地址是由段地址左移 4 位(乘以16)后加上偏移地址形成的。我们也就只需要提供段地址和偏移地址即 OK 。DS寄存器存放的就是数据段的段地址 ,除了BP基指针寄存器外,其余的寄存器都默认使用DS寄存器的值作为段地址。
标志寄存器(FLAG)
前面已经介绍了 8086 CPU 14个寄存器中的 13 个了,下面我们将介绍最后一个寄存器也就是 FLAG 寄存器。FLAG 中的每一个位都表示不同的状态,存储的信息通常又被称作程序状态字(PSW) 。下面是 FLAG 寄存器中各个位的示意图: