汇编: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 溢出标志 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:从栈中弹出数据,送入标志寄存器

猜你喜欢

转载自blog.csdn.net/weixin_38633659/article/details/125192247
今日推荐