标志寄存器(flag)
8086CPU的标志寄存器有16位,其中储存的信息通常被称为程序状态字。
其他寄存器时用来存放数据的,整个寄存器具有一个含义。
flag寄存器是按位起作用的,它的每一位都有专门的含义,记录特定的信息。
8086CPU的flag寄存器的结构
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
1、ZF标志
(flag的第六位) 零标志位
它记录相关指令执行后
结果为0,ZF=1
结果不为0,ZF=0
例:
mov ax,1
sub ax,1
指令执行后,结果为0,则ZF=1
mov ax,2
mov ax,1
指令执行后,结果为1,则ZF=0
注意:
在8086CPU的指令集中,有的指令的执行是影响标志寄存器,如:add、sub 等,它们大多数是运算指令(进行逻辑或算数运算)
有的指令的执行对寄存器没有影响,如mov,push,pop等,它们大多是传送指令。
2、PF标志
(flag第二位) 奇偶标志位
它记录指令执行后,结果的所有二进制位中1的个数
为偶数 PF=1
为奇数 PF=0
例:
mov al,1
add al,10
执行后,结果为00001011B,其中有3个1(奇数) 则PF=0。
mov al,1
or al,10
执行后,结果为00000011B,其中有2个1(偶数),则PF=1。
3、SF标志
(flag第七位) 符号标志位
结果为负,SF=1
结果为正,SF=0
有符号数与补码
计算机中通常用补码来表示有符号数。
例:
mov al,10000001B
add al,1
将add指令当无符号数运算,那么add指令相当于计算-127+1为-126(10000010B)
CPU在执行add等指令时,就已经包含两种含义,也将得到用同一种信息来记录两种结果。
关键在于程序需要哪种结果
将数据当做无符号数来运算,SF值无意义。
将数据当做有符号数来运算,可以通过SF得知结果的正负。
某些指令将影响标志寄存器中多个标志位,这些被影响的标记位比较全面地记录了指令的执行结果,为相关的处理提供了所需的依据。
4、CF标志
(flag第零位) 进位标志位
在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。 (进位或借位 CF=1)
例
mov al,98H
add al,al
执行后 (al)=30H,CF=1
5、OF标志
(flag第十一位) 溢出标志位
在进行有符号运算时,如果结果超过了机器所能表示的范围称为溢出。
溢出 OF=1
6、adc指令
adc是带进位加法的指令,它利用了CF位记录的进位数
格式: adc 操作对象1,操作对象2
功能:
操作对象1=操作对象1+操作对象2+CF
例
mov ax,2
mov bx,1
sub bx,ax
adc ax,1
执行后,(ax)=4
CF值的含义由adc指令前的指令决定(借位还是进位)
7、sbb指令
带借位减法的指令,它利用了CF上记录的借位值。
格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
sbb和adc是基于相同思想设计的两种操作指令,sbb在应用思路上与adc类似。
8、cmp指令
cmp是比较指令,功能类似于减法指令,但是不保存结果。
cmp指令执行后,将对标志寄存器产生影响。
其他相关指令通过识别这些别影响的标志寄存器位得知比较结果。
格式:cmp 操作对象1,操作对象2
例:
mov ax,1
cmp ax,ax
比较结果为0
其产生影响:ZF=1,PF=1,SF=0,CF=0,OF=0
具体情况具体分析。
9、检测比较结果的条件转移指令
与cmp配合使用。
根据无符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF值。
根据有符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF和OF值。
一些指令:
指令 | 含义 | 检测的相关标志位 |
je | 等于则转移 | ZF=1 |
jne | 不等于则转移 | ZF=0 |
jb | 低于则转移 | CF=1 |
jnb | 不低于则转移 | CF=0 |
ja | 高于则转移 | CF=0,ZF=0 |
jna | 不高于则转移 | CF=1或ZF=1 |
10、DF标志和串传送指令
(flag第十位) 方向标志位
在串处理指令中,控制每次操作后si,di的增减
DF=0 每次操作后 si,di递增
DF=1 每次操作后 si,di递减
格式:movsb
功能:(以字节为单位传送)
((es)*16+(di))=((ds)*16+(si))
DF=0 (si)=(si)+1
(di)=(di)+1
DF=1 (si)=(si)-1
(di)=(di)-1
movsw
功能:(以字为单位传送)
si,di递增(减)2.
movsb和movsw一般和rep配合使用,格式如下:
rep movsb
rep作用是根据CX的值,重复执行后面的串地址指令。
8086CPU提供下面两条指令对DF位进行设置
cld指令:将标志寄存器DF位置0
std指令:将标志寄存器DF位置1
assume cs:code
data segment
db 'welcome to masm!'
db 16 dup (0)
data endscode segment
start : mov ax,datamov ds,axmov si,0mov es,axmov di,16mov cx,16cldrep movsbmov ax,4c00hint 21h
code ends
end start
11、pushf和popf
pushf:将标志寄存器的值压栈
popf:从栈中弹出数据,送入标志寄存器
标志寄存器(flag)相关推荐
- 一个奇葩的标志寄存器 flag寄存器
注意: mov,push,pop等传送指令,执行结果对标志寄存器并无影响! ZF标志:结果为0,则ZF为1:不为0,ZF为0:(zero flag) PF标志:如果1的个数为偶数,pf=1:如果为奇数 ...
- 8086标志寄存器FLAG
8086CPU提供一个特殊的寄存器称为标志寄存器,里面包含9个标志,用来反映处理器的状态和运算结果的某些特征.FLAG是按位起作用的
- 标志寄存器df_标志寄存器
CPU内部的寄存器中,有一种特殊的寄存器具有以下三种作用. 用来存储相关指令的某些执行结果 用来为CPU执行相关指令提供行为依据 用来控制CPU的相关工作方式 这种特殊的寄存器在8086CPU种,被称 ...
- 8086汇编语言:标志寄存器的各个标志位的详细介绍
一.基本介绍: CPU的内部的寄存器中,有一类特殊的寄存器(对于不同的处理机,其个数和结构都可能不同):它具有以下三种作用! 这种特殊的寄存器在8086CPU中,被称为标志寄存器flag.8086CP ...
- 汇编:CPU结构 - FLAG标志寄存器和相关指令
文章目录 一.概述 1.标志寄存器的作用 2.8086CPU标志寄存器的结构 3.debug查看标志位 二.标志位 1.CF(0):进位标志位 2.PF(2):奇偶标志位 3.AF(4):辅助进位标志 ...
- 8086标志寄存器(Flag Register)
标志寄存器设计为16位,实际使用9位,其中6位用以存放算术逻辑单元运算后的结果特征,称为状态标志:另外3位通过人为设置,用以控制8086的三种特定操作,称为控制标志. 6个状态标志位定义如下: 进位标 ...
- 标志寄存器的详细解释
简介: CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有三种作用. (1)用来存储相关指令的某些执行结果. (2)用来为CPU执行相关指令提供行 ...
- 状态标志寄存器--EFLAGS
EFLAGS寄存器有控制CPU的操作或反映CPU某些运算的结果的独立二进制位构成. 标志位 名称 全称 作用 CF 进位标志 Carry Flag 无符号算术运算的结果太大而目的操作数无法容纳时置位 ...
- 汇编语言随笔(3)-条件转移指令和标志寄存器
标志寄存器 标志寄存器通常具有以下三种作用: 1,用来存储相关指令的某些执行效果 2,用来为CPU执行相关指令提供行为依据 3,用来控制CPU的相关工作方式 ...
最新文章
- 基于.Net Core开发现代化Web应用程序系列课程和文章
- 树莓派:外设开发编程,控制继电器
- python多线程库_Python多线程常用包对比
- [云炬ThinkPython阅读笔记]3.1 函数调用
- 【JBPM4】完成任务
- GPU 与CPU的作用协调,工作流程、GPU整合到CPU得好处
- 大规模针对iOS设备的恶意广告活动劫持3亿次浏览器会话
- 第六章节 多态 (密封类)
- java引导类加载器_Java类加载器层次结构(一)
- java day35【Bootstrap】
- DEVC中的for编译出错问题解决办法
- J1939广播DM1报文
- 基于树莓派的人脸识别门禁系统
- 开发老铁们,就参考这个图灵畅销新书书单加购!
- 十大ERP系统排行榜—2022年
- Vue 上传图片裁剪
- 火车采集 PHP插件 post,火车采集器2010版PHP插件增加扩展的方法
- windows中的SC命令
- Service Mesh中的通用数据平面API设计
- 遗传算法解决城市TSP问题