80x86是Intel一系列cpu的代称,其中8088,8086,80286为16位cpu,80386为32位寄存器。其体系如下:
备注:通过寻址的方式可以使8088的最大寻址为1MB
cpu中的寄存器可以分为程序可见和程序不可见,汇编语言操作的就是程序可见的寄存器,程序不可见的寄存器为系统所使用。下面以80x86中16位
的cpu为例展示其程序可见的寄存器:
程序可见的寄存器共分为:8个通用寄存器,2个专用寄存器,4个段寄存器共14个。
其体系大致如下:
通用寄存器可以用于传送和暂存数据
,也可以参与算术运算,并保存运算结果,除此之外不同的通用寄存器有各自特殊的用途。详细如下:
8088和8086中的通用寄存器又可以分为
数据寄存器
:AX,BX,CX,DX 用来暂时存放计算过程中所用的操作数,结果或其他信息。
变址寄存器
:SI,DI 用来与段寄存器一起使用进行内存器的变址寻址。
指针寄存器
:BP,SP 主要用在堆栈中。
AX寄存器
Accumulator register,16位寄存器,可以拆为AH(高8位)和AL(低8位)两个8位寄存器使用。
主要用在:
可以作为累加器
是算术运算的主要寄存器
在乘除运算中用来存放操作数
IO指令都使用AX寄存器与外部设备传递信息
BX寄存器
Base register,16位寄存器,可以拆为BH(高8位)和BL(低8位)两个8位寄存器使用。
在计算存储器的地址时经常用作基址寄存器。可以使用[BX]
来进行取地址操作,并且在AX,BX,CX,DX中只有该寄存器可以这么进行操作。
CX寄存器
Count register,16位寄存器,可以拆为CH和BL两个8位寄存器使用。
主要用在:
保存计数值。
保存移位指令,循环指令和串处理指令中作隐含的计数器。
DX寄存器
Data register, 16位寄存器,可以拆分为DH和DL两个8位寄存器使用
SI,DI,SP,DP四个变址指针寄存器除了用在算术运算过程外,还可以在存储器的寻址中作为偏移地址
使用。
变址寄存器
SI(source index register)源变址寄存器
DI(destination index register)目的变址寄存器
这两个寄存器一般和数据段寄存器DS
联用,用来确定数据段中某个存储单元的地址。这两个变址寄存器具有自增或者自减
的功能,用来进行变址就非常方便,例如可以用来对两个串进行复制。其中SI和DS进行联用,DI和ES进行联用。
指针寄存器
BP(base pointer)基址指针寄存器
SP(stack pointer)堆栈指针寄存器
这两个寄存器可以和堆栈段寄存器联用用来确定堆栈中的某一段存储单元的地址
。其中SP用来指示栈顶的偏移地址,BP可以用来指示在堆栈中的偏移地址
。
备注:类似于高程程序语言中的栈结构,SP可以看做是pop对应的操作,移动就会弹出栈顶。BP可以看成是top的操作,并且可以往下进行移动,不会弹出堆栈中的元素。
指令:mov BP, SP可以使两个指针指向相同的栈顶。
一般与堆栈段寄存器(SS)联用进行寻址:
SS:SP
8086/8088中的专用寄存器是用来控制用的,或者是用来指示一些状态,包括IP指令指针寄存器,FLAGS标志寄存器。
指令指针寄存器-IP
IP寄存器用来存放代码段(CS)中的偏移地址,在程序运行的过程中保存下一条指令的首地址。在程序的执行中起着非常重要的作用,例如可以用来控制程序的执行流程(选择语句,循环语句等),CPU会根据该寄存器中的值进行取址-执行
。
备注:上述描述的CS:IP的联用方式的转化成物理地址的方式在实地址模式和保护地址模式有所区别。
标志寄存器-FLAGS
标志寄存器又称为程序状态寄存器(PSW)
,用来存放运算结果的标志(是否溢出,是否进位等),控制标志和系统标志的寄存器。其中这些状态都有该寄存器中的特定的位
进行表征。该寄存器各个位所代表的状态如下图所示:
其他位也是有作用的,但是这里并不讲。
条件码的标志
这里标志由CPU在运行中自动设置的 ,这类指令经常用于指令的转移控制,有下面几种:
进位标志
CF(Carry Flag),当运算结果的最高有效位产生进位时该位设置为1,否则设置为0。例如在加法运算中(补码表示),0111 + 1010 = 1 0011时最高有效位进位(注意此时并不是溢出)。
溢出标志
OF(Overflow Flag),当运算的结果超出了计算机能表示的位数,则会发出溢出。
进位和溢出的区别
假设在4位机中,补码表示二进制数,最高位为符号位:
符号标志
SF(Sign Flag),表示运算结果是否为负数
,如果运算结果为负置为1,正置为0
。
零标志
ZF(Zero Flag),表示运算结果是否为0
,运算结果为0置为1,不为零置为0
。
辅助进位标志
AF(Auxiliary Carry Flag),用来记录运算时第三位(半个字节)产生的进位值,例如在执行加法指令的时候如果第三位有进位时置1,否则置为0.
奇偶标志
PF(Parity Flag),表示操作数中的1的个数是否为偶数个
。用作数据传输的校验作用,当操作数中的1的个数为偶数个时置为1,否则置为0.
方向标志
DF(Direction Flag),用在串处理指令中控制处理信息的方向。
DF=1
时,在串处理的每次操作后都会使变址寄存器SI和DI的值同时减小
,这样串处理进行就从高地址往低地址方向执行。DF=0
时,在变址寄存器SI和DI的值同时增大
,这样串处理进行就从低地址到高地址方向执行。系统标志
这些标志位一般用于IO,中断和程序调试等工作的控制。
陷阱标志
TF(Trap Flag),用于调试时的单步方式操作。计算机中的"陷阱"可以简单看成是程序从用户态陷入到内核态当中,可以使得用户程序访问硬件从而获得操作系统所提供的服务。
当TF=1时,每条指令执行完毕后产生陷阱,由系统控制计算机。
当TF=0时,每条指令执行完后不产生陷阱。
中断标志
IF(Interrupt Flag),用于表示CPU是否响应可屏蔽中断的请求。
当IF=1时,允许CPU响应可屏蔽中断。
当IF=0时,不允许CPU响应中断。
在Debug的调试程序中上面那些标志的位都用不同的符号进行表示,如下表所示:
标志名称 | 标志等于1 | 标志等于0 |
---|---|---|
CF(是否进位) | CY | NC |
OF(是否溢出) | OV | NO |
SF(是否为负数) | NG | PL |
AF(辅助位是否进位) | AC | NA |
ZF(是否为0) | ZR | NZ |
DF(是否减少) | DN | UP |
IF(是否允许中断) | EI | DI |
PF(1的个数是否为偶数个) | PE | PO |
在DOSBox中的Debug程序中如下位置:
在冯诺依曼的体系结构中,指令和数据都被放在内存当中。其中指令放在代码段(CS)
中,数据放在数据段(DS)
中,这样就不会造成混淆。而段寄存器专门用于存储器的寻址,在后面的存储器的寻址方式中有非常大的用途,可以用来直接或间接的存放段地址。分有代码段CS,数据段DS,堆栈段SS,附加段ES。段寄存器的具体用途会在下面的存储器的寻址方式中讲到。
总结: