8086/8088 CPU寄存器组包括4个16位数据寄存器,两个16位指针寄存器,两个16位变址寄存器,一个16位指令指针,4个16位段寄存器,1个16位标志寄存器。一共14个16位寄存器。
AH&AL=AX(accumulator):累加寄存器
BH&BL=BX(base):基址寄存器
CH&CL=CX(count):计数寄存器
DH&DL=DX(data):数据寄存器
—————————————————————————-
SP(Stack Pointer):堆栈指针寄存器
BP(Base Pointer):基址指针寄存器
SI(Source Index):源变址寄存器
—————————————————————————-
DI(Destination Index):目的变址寄存器
IP(Instruction Pointer):指令指针寄存器
—————————————————————————-
CS(Code Segment):代码段寄存器
DS(Data Segment):数据段寄存器
SS(Stack Segment):堆栈段寄存器
ES(Extra Segment):附加段寄存器
寄存器 | 用途 |
---|---|
AX | 字乘法,字除法,字I/O,累加器, 使用频率最高, 被特殊优化的寄存器, 一般用于存放运算结果; |
BX | 存储器指针,基址寄存器, 一般用于放某结构的首地址, 如数组,结构体等等; |
CX | 字节乘法,字节除法,字节I/O,十进制算术运算 |
DX | 字乘法,字除法,间接I/O,数据寄存器, 用于和其他寄存器组合表示大于一个寄存器的数值; |
AH | 计算器, 一般用于循环等其他需要计数操作的寄存器; |
AL | 字节乘法,字节除法 |
CL | 移位计数器 |
SI | 存储器指针(串操作中的源指针),源变址寄存器, 一般用于存放内存拷贝的源地址 |
DI | 存储器指针(串操作中的目的指针),目标变址寄存器, 一般用于存放内存拷贝的目标地址 |
BP | 存储器指针(存取堆栈的指针),一般指向栈低 |
SP | 堆栈指针,一般指向栈顶 |
标志位
标志位 | =1 | =0 |
---|---|---|
ZF 零标志位(Zero Flag) | ZR[Zero] | NZ[Not Zero] |
PF 奇偶标志位(Parity Flag) | PE[Parity Even] | PO[Parity Odd] |
SF 符号标志位(Sign Flag) | NG[Negative] | PL[Plus] |
CF 进位标志位(Carry Flag) | CY[Carry] | NC[No Carry] |
OF 溢出标志位(Overflow Flag) | OV[Overflow] | NV[Not Overflow] |
AF 辅助进位标志位(Auxiliary Flag) | AC[Auxiliary Carry] | NA[No Auxiliary Carry] |
DF 方向标志位(Direction Flag) | DN[Down] | UP[UP] |
IF 中断标志位(Interrupt Flag) | EI[Enable Interrupt] | DI[Disable Interrupt] |
ZF
零标志位(Zero Flag)
判断结果是否为0。运算结果0,ZF置1,否则置0。
PF
奇偶标志位(Parity Flag)
反映运算结果低8位中'1'的个数。'1'的个数为偶数,PF置1,否则置0。
SF
符号标志位(Sign Flag)
反映运算结果的符号。运算结果为负,SF置1,否则置0。
CF
进位标志位(Carry Flag)
反映无符号运算是否产生进位或借位。运算结果的最高有效位向更高位进位或者借位,CF置1,否则置0。
OF
溢出标志位(Overflow Flag) 反映有符号运算是否溢出。运算结果超过了8位或者16位有符号数的表示范围,OF置1,否则置0。
AF
辅助进位标志位(Auxiliary Flag)
在字节操作时低半字节向高半字节进位或借位。字操作时低字节向高字节进位或借位,AF置1,否则置0。
这个标志位在PC目前很少用, 和二进制显示屏有关;
DF
方向标志位(Direction Flag)
决定串处理指令控制每次操作后si、di的增减。df=0,则每次操作后si、di递增,否则递减。
IF
中断标志位(Interrupt Flag)
进位标志CF
执行了以下片段
mov al,98
add al,al
0x98+0x98=0x130,所以需要进位由NC变成CY
零标志ZF
执行了以下片段
mov al,1
sub al,al
AX寄存器低位赋1,然后低位相减,最后为0,标志位由原来的NZ变为ZR
符号标志位SF
执行了以下片段
mov al,80
add al,1
反映运算结果的符号位。SF与运算结果的最高位相同,如果运算结果的最高位为1,则SF被置1(NG),否则SF清零(PL)。由于在8086/8088系统中,有符号数采用补码的形式表示,所以SF反映了运算结果的符号。如果运算结果为正,则SF被清零,否则SF被置1
溢出标志OF
执行了以下片段
mov al,98
add al,al
反映有符号加减运算是否引起溢出。如果运算结果超过了8位或16位有符号数的表示范围,即在字节运算时大于127或小于-128,在字运算时大于32767或小于-32768时,称为溢出。如果溢出,则OF被置1,否则OF被清零
奇偶标志PF
执行了以下代码段
mov al,3
add al,al
用于反映运算结果中“1”的个数。如果“1”的个数为偶数,则OF被置1,否则OF被清零。利用PF可以进行奇偶校验检查,或产生奇偶校验位。
此案例,以为0x3+0x3=0110B的,所以PE标志位结果位PE。
辅助进位标志AF
在字节操作时,如果发生低半字节向高半字节进位或借位;在字操作时,如发生低字节向高字节进位或借位,则辅助进位标志AF被置1,否则AF被清零。十进制算术运算调整指令自动根据该标志产生相应的调整动作。
方向标志DF
方向标志DF决定串操作指令执行时有关指针寄存器调整方向。当DF=1时,串操作按减方式改变有关存储器指针值;当DF=0时,串操作按加方式改变有关存储器指针值。8086/8088提供专门用于设置方向标志DF的指令是STD,专门用于清DF的指令CLD。
std
cld
中断允许标志IF
中断允许标志决定CPU是否响应外部可屏蔽中断请求。当IF=1时,CPU能够响应外部的可屏蔽中断请求;当IF=0时,则不响应外部可屏蔽中断请求。但此标志的状态对于外部非屏蔽中断请求,或内部产生的中断不起作用。8086/8088提供的专门用于设置中断允许标志IF的指令是STI,专门用于清IF的指令是CLI。
cli
sti
追踪标志TF
当追踪标志TF被置1后,CPU进入单步方式。所谓单步方式指在一条指令执行后,产生一个单步中断。这主要用于程序的调试。8086/8088没有专门设置和清除TF标志的指令,要通过其他方法设置或清除TF。