汇编:CPU结构 - FLAG标志寄存器和相关指令

一、概述

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溢出标志OFOverflow FlagOV : overflowNV : no overflow
2方向标志DFDirection FlagUP : upDN :down
3中断允许标志IFInterrupt-enable FlagEI : enable interruptDI : disable interrupt
4追踪标志TFTrap Flag
5符号标志位SFSign FlagPL : plusNG : negative
6零标志ZFZero FlagZR : zeroNZ : no zero
7辅助进位标志AFAuxiliary Carry FlagAC : assistant carryNA : no assistant carry
8奇偶标志PFParity FlagPE : parity evenPO : parity odd
9进位标志CFCarry FlagCY : carryNC : 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、jcc:条件跳转

序号指 令英译含义检测的相关标志位
1jne、jnznot quual、not zero不等于则转移ZF=0
2je、jzequal、zero等于则转移ZF=1
3jnsnot sign(无符号\无负号)结果为非负则跳转SF=0
4jssign(有符号\有负号)结果为负则跳转SF=1
5jp、jpeparity even结果中1的个数为奇数则跳转PF=0
6jnp、jpoparity odd结果中1的个数为偶数则跳转PF=1
7jnonot overflow结果没有溢出则跳转OF=0
8jooverflow结果溢出了则跳转OF=1
9jnb、jaenot below、above equal、>=不低于则转移CF=0
10jb、jnaebelow、not above equal、<低于则转移CF=1
11ja、jnbeabove、not below equal、>高于则转移CF=0且ZF=0
12jna、jbenot above、below equal、<=不高于则转移CF=1或ZF=1
13JL、jngelittle、not great equal、<小于则跳转 (有符号数)SF≠ OF
14JBL、jgenot little、great equal、>=大于等于则跳转 (有符号数)SF=OF
15JLE、jnelittle equal、not great、<=小于等于则跳转 (有符号数)ZF=1 or SF≠ OF
16JNLE、jgnot little equal、great、>大于则跳转(有符号数)ZF=0 and SF=OF

5、pushf、popf:入栈、出栈

pushf:将标志寄存器值压栈

popf:从栈中弹出数据,送入标志寄存器

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜子三百克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值