文章目录
一、概述
FLAG是计算机的专业术语,状态标志寄存器。
1、标志寄存器的作用
1、用来存储相关指令的某些数据结果。
2、用来为CPU执行相关的指令提供行为依据。
3、用来控制CPU的相关工作方式。
2、8086CPU标志寄存器的结构
标志寄存器是按位起作用,每一位都有专门的含义。
上图中有字符标记的都具有特殊含义,其他位没有使用(造成影响的大多数是运算指令(逻辑/算数))。
3、debug查看标志位
进行标志位学习和验证前,先看一下如何在debug里看标志位。
使用命令
-r
打印结果:
屏幕右下角打印出来
NV UP EI PL NZ NA PO NC
,这些符号代表的就是标志寄存器里常用的标志位的值。
OF <-----> OV(1) ; NV(0)
DF <-----> DN(1) ; UP(0)
IF <-----> EI(1) ; DI(0)
SF <-----> NG(1) ; PL(0)
ZF <-----> ZR(1) ; NZ(0)
AF <-----> AC(1) ; NA(0)
PF <-----> PE(1) ; PO(0)
CF <-----> CY(1) ; NC(0)
二、标志位
标志位分类:
1、运算结果标志位
2、状态控制标志位:用来控制CPU操作的,它们要通过专门的指令才能使之发生改变)。状态控制标志位有:TF、IF、DF。
标志位列表展示
注:加粗部分为状态控制标志位
序号 | 标志名 | 简写 | 英文 | 标志 1 | 标志 0 |
---|---|---|---|---|---|
1 | 溢出标志 | OF | Overflow Flag | OV : overflow | NV : no overflow |
2 | 方向标志 | DF | Direction Flag | UP : up | DN :down |
3 | 中断允许标志 | IF | Interrupt-enable Flag | EI : enable interrupt | DI : disable interrupt |
4 | 追踪标志 | TF | Trap Flag | ||
5 | 符号标志位 | SF | Sign Flag | PL : plus | NG : negative |
6 | 零标志 | ZF | Zero Flag | ZR : zero | NZ : no zero |
7 | 辅助进位标志 | AF | Auxiliary Carry Flag | AC : assistant carry | NA : no assistant carry |
8 | 奇偶标志 | PF | Parity Flag | PE : parity even | PO : parity odd |
9 | 进位标志 | CF | Carry Flag | CY : carry | NC : no carry |
1、CF(0):进位标志位
表示加减法操作中最高位有无进/借位。
如果运算不存在进位/借位:CF == 0(展示为NC)
如果运算存在进位/借位:CF == 1(展示为CY)
2、PF(2):奇偶标志位
记录相关指令执行后,其结果的所有二进制位中的1的个数是否为偶数。
当所有二进制位的1的个数是奇数:PF == 0(展示为PO)
当所有二进制位的1的个数是偶数:PF == 1(展示为PE)
3、AF(4):辅助进位标志
在8位加减法操作中表示低4位向高4位有无进/借位。
无进/借位:AF == 0(展示为NA)
有进/借位:AF == 1(展示为AC)
4、ZF(6):0标志位
表示运算结果是0或非0。
当运算结果不为0:zf == 0(展示为NC)
当运算结果为0:zf == 1(展示为CY)
5、SF(7):符号标志位
表示运算结果是负(最高位为1)或非负(最高位为0)
当运算结果为非负:SF == 0(展示为PL)
当运算结果为负:SF== 1(展示为NG)
6、TF(8):追踪标志
当追踪标志TF == 1时,CPU进入单步执行方式。
7、IF(9):中断标志位
表示CPU可否响应可屏蔽中断请求。IF的状态对不可屏蔽中断及内部中断没有影响。
8、DF(10):方向标志位
表示串操作时按地址减或加的方式进行。
每次操作si di 递增:df == 0 (展示为UP)
每次操作si di 递减:df == 1 (展示为DN)
9、OF(11):溢出标志位
(有符号运算)溢出标志位:在进行有符号运算的时候,如果结果超过了机器所表示的范围,称为溢出。
8位带符号数的范围是-128 ~ +127,
16位的是-32728 ~ +32767)。
如果不存在溢出:OF==0(展示为NV)
如果存在溢出:OF == 1(展示为OV)
三、指令
1、adc:加法
带进位加法指令,利用CF上的值
指令:adc ax,bx
计算:ax = ax + bx + CF
2、sbb:减法
sbb是带借位减法指令,利用CF上的值
指令:sbb ax,bx
计算:ax = ax - bx - CF
3、cmp:比较
cmp是比较指令,cmp的功能相当于减法指令,不保存结果,但对标志寄存器产生影响。
指令:cmp ax,bx
计算: ax - bx 根据计算结果对标志寄存器进项设置。
比如执行:
mov ax,8
mov bx,3
cmp ax,bx
执行后:(ax)=8, zf=0, pf=1, sf=0, cf=0, of=0
4、检测比较结果的条件转移指令
指令 | 含义 | 检测的相关标志位 |
---|---|---|
je | 等于则转移 | ZF=1 |
jne | 不等于则转移 | ZF=0 |
jb | 低于则转移 | CF=1 |
jnb | 不低于则转移 | CF=0 |
ja | 高于则转移 | CF=0且ZF=0 |
jna | 不高于则转移 | CF=1或ZF=1 |
5、pushf、popf:入栈、出栈
pushf:将标志寄存器值压栈
popf:从栈中弹出数据,送入标志寄存器