CPU内部需要一种特殊的寄存器来完成下面三个功能

1.用来存储相关指令的执行结果是否满足某些特性
2.为cpu执行相关指令提供行为依据
3.用来控制cpu的相关工作方式

能完成上面三个功能的寄存器被成为标志寄存器,标志寄存器简称flag,里面存的内容叫psw(程序状态字)

注:标志寄存器指的是一个寄存器,而不是多个寄存器的类型是标志寄存器

用来存放各种标志位,在Visual Sudio中打开标志寄存器调试界面,调试->窗口->寄存器,此时打开寄存器窗口,但是该窗口只有通用寄存器,这个时候右键,选择"标志",然后在寄存器窗口中会显示出标志寄存器的值

一:进位标志位CF(Carry Flag)也叫CY
用途1:计算指令(add等)产生的结果,最高有效位发生进位(加法)或者发生借位(减法),则将其置1,反之清0,注意,是最高位,比如一个int,最高位是32位,只有当第32位继续进位(溢出)的时候,CY会由0变1,在无符号整数运算中用来表示溢出,而OF是在有符号整数中表示溢出
用途2:在多倍精度运算中使用,可以将上次产生的进位或借位传递到下一次运算中

 int a = 0x80000000;int b = 0x80000000;_asm mov eax, a;_asm mov ebx, b;_asm add eax, ebx;// 在这里CY的值会由0变成1
 int a = 0x08000000;int b = 0x08000000;_asm mov eax, a;_asm mov ebx, b;_asm add eax, ebx;// 在这里CY的值依然是0不会改变,因为最高位没有进位
 int a = 0x80000000;int b = 0x70000000;_asm mov eax, a;_asm mov ebx, b;_asm sub eax, ebx;// eax减去ebx,8-7,没有借位,所以CY值一直是0
 int a = 0x70000000;int b = 0x80000000;_asm mov eax, a;_asm mov ebx, b;_asm sub eax, ebx;// eax减去ebx,7-8,有进位,所以CY由0变1

二:奇偶标志位PF(ParityFlag)也叫PE:计算指令(add等)产生的结果如果低8位有偶数个1,则PF为1,有奇数个1则为0

 int a = 0x10;//注意是低8位,如果是0x110,右数第三位那个1不算int b = 0x01;_asm mov eax, a;_asm mov ebx, b;// 调试的时候注意程序刚开始运行的时候,PE可能会保留之前的信息// 所以会出现刚执行程序的时候PE有时候是0有时候是1,这并不影响结果,但是容易造成误解_asm add eax, ebx;// 此处代码走完PE会变成1

三:辅助进位标志AF也叫AC
计算指令(add等)产生的结果如果右数第4个bit发生了进位或借位,则置1,否则置0,在BCD算数运算中中会被用到,此处初学千万注意,右数第4个bit,指的是2进制,像0x1111这不叫右数4个bit,这叫右数16个bit了(通俗的说就是最低字节有没有进位或借位)

 int a = 0x8;//0x8=1000,相当于右数第4个bit为1int b = 0x8;_asm mov eax, a;_asm mov ebx, b;_asm add eax, ebx;// 此处执行完毕AC会置1,因为发生了进位
 int a = 0x7;int b = 0x8;_asm mov eax, a;_asm mov ebx, b;// AC依然保持0,因为7+8=F,没有发生进位_asm add eax, ebx;

四:零标志位ZF(ZeroFlag)也叫ZR
计算指令(add等)产生的结果为0则置1,否则置0,注意如果两个数相加溢出了,也会置1,不管是如何得出0的,只要最终结果是0,那么ZR就会置1

 int a = 0x0;int b = 0x0;_asm mov eax, a;_asm mov ebx, b;// 下面这行代码走完之后,ZR变成1,因为0+0=0_asm add eax, ebx;

五:符号标志位SF(SignFlag)也叫PL
用来表示最高有效位,最高位是0,则置0,最高位是1则置1,在计算机中该标志位用来表示正负数

 int a = 0x00000000;int b = 0x88000000;_asm mov eax, a;_asm mov ebx, b;_asm add eax, ebx;//这行代码走完PL会置1

日记:
如果SF/PL=1,则说明这个数是某个数的补码形式,应该根据补码求解出原码,然后前面加上负号,但是,要注意,不能以SF/PL=1,就说明本次运算真正的结果是负数,当结果溢出之后,那么这个结果其实是正数,但是SF/PL依然是1,例如下面这段代码

mov ah,22H
mov bh,0A0H
// 实际结果应该是+130
// 但是ah里存的是82H,十进制是-126
sub ah,bh

所以要想得到一个结果真正是否是正负,还需要配合OF标志位(OV标志位),最终的结论如下
如果没溢出:SF/PL=1,则说明真正的结果为负,SF/PL=0说明结果为正
如果溢出:SF/PL=1,则说明真正的结果为正,SF/PL=0说明结果为负

六:陷阱标志位TF
陷阱标志指的是当前是一个单步调试的状态
七:中断标志位IF(Interrupt)
置1可屏蔽中断,后续再补上这个标志位 TODO
八:控制标志位DF(Direction),也叫方向标志
置1表示内存从高地址往低地址操作(减),置0则恰好相反
九:溢出标志位OF(Overflow)也叫OV
CF是无符号整数运算中用来表示溢出,而OF是在有符号整数中表示溢出,注意他俩的区别

 int a = 0x80000000;int b = 0x80000000;_asm mov eax, a;_asm mov ebx, b;// 发生了进位,算溢出,所以在这里OV的值会由0变成1_asm add eax, ebx;
 int a = 0x70000000;int b = 0x80000000;_asm mov eax, a;_asm mov ebx, b;// 发生了借位,也算溢出,所以在这里OV的值会由0变成1_asm add eax, ebx;

PUSHF和POPF指令

pushf是将标志寄存器(EFLAG)的值压入栈
popfs是从栈中弹出数据,放到标志寄存器中


Win-MASM64汇编语言-标志寄存器(EFLAGS/PSW/PUSHF/POPF)相关推荐

  1. [汇编语言]标志寄存器

    目录 一.ZF标志 二.PF标志 三.SF标志 四.CF标志 五.OF标志 六.adc指令 七.sbb指令 八.cmp指令 九.检测比较结果的条件转移指令 十.DF标志和串传送指令 十一.pushf和 ...

  2. 汇编语言--标志寄存器

    标志寄存器      CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3种作用. 用来存储相关指令的某些执行结果: 用来为CPU执行相关指令提供行为依据: 用 ...

  3. 状态标志寄存器--EFLAGS

    EFLAGS寄存器有控制CPU的操作或反映CPU某些运算的结果的独立二进制位构成. 标志位 名称 全称 作用 CF 进位标志 Carry Flag 无符号算术运算的结果太大而目的操作数无法容纳时置位 ...

  4. Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(2) - 32位EFLAGS - 80386(386, Intel386)/80486(486, Intel486)

    80386/386/Intel386标志寄存器EFLAGS 80386增加了RF/VM标志位,用于支持虚拟8086模式与指令断点调试. 80486/486/Intel486标志寄存器EFLAGS (1 ...

  5. 标志寄存器的详细解释

    简介:    CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有三种作用.    (1)用来存储相关指令的某些执行结果.    (2)用来为CPU执行相关指令提供行 ...

  6. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(7) - 标志寄存器/标志控制指令 段寄存器指令

    Flag Control (EFLAGS) Instructions 下列指令用于控制(即修改)标志寄存器EFLAGS中的标志位. 指令 描述 STC 设置CF标志为1 CLC 清除CF标志为0 CM ...

  7. 贺利坚老师汇编课程54笔记:标志寄存器

    指路老师的博客 8086状态标志寄存器含义 FLAG标志寄存器:PSW/FLAGS,别称:程序状态字 8086CPU指令集中,有的指令的执行是影响标志寄存器,比如:add,sub,mul,div,in ...

  8. 汇编语言 标志位介绍

    一.运算结果标志位 1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位.如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0. 使用该标志位的情 ...

  9. 二十二、标志寄存器与栈(代码设计安全,与子程序寄存器安全类似)

    1.子程序安全调用 子程序的设计要以保持寄存器值的平衡,栈空间的平衡为原则.     子程序的设计在必要时候,需要保持标志寄存器的平衡. 2.标志寄存器 在计算机中,有一个专用16位的寄存器FLAGS ...

最新文章

  1. 那些年,我们见过的 Java 服务端乱象
  2. ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...
  3. 创建java的可执行文件
  4. 所有库在门不显示封装_COB全天候通透屏,在商业显示中的场景应用
  5. 实现工控机4U断电后自动重启功能
  6. Not enough memory. Please load a smaller dataset or use larger heap size.
  7. NAT的extendable参数,使得一个地址被不同接口NAT出去测试
  8. Webdriver使用Chrome模拟手机浏览器测试移动版网站
  9. 58-混沌感悟.(2015.2.11)
  10. python时间序列滞后命令,时间序列-相关性和滞后时间
  11. SAP License:数据导入时的问题与总结
  12. 如何安装Ruby(Windows)
  13. JS事件流与DOM事件处理程序
  14. Python之字体反爬详细操作
  15. 仿iGoogle自定义首页模块拖拽效果
  16. diy服务器个人主机_DIY个人服务器
  17. 江苏各大高校开学具体时间,快来看看有你的学校吗?小伙伴们想开学了吗?
  18. Windows系统封装总结
  19. Office 2016 卡顿问题!如果其他方法都没有用就关掉硬件加速!
  20. LANDESK操作系统部署时,网卡启动后,自动进入pe选择菜单,而不用按F8 进行选择启动菜单的情况下,如何操作?...

热门文章

  1. 同步类容器与并发类容器
  2. Java中提取字符串中的数字
  3. IDEA导入Gradle项目后,重现构建项目并导入jar包后但是External Libraries目录中无任何引入的jar包
  4. oracle中季末最后一天,oracle有关时间计算,得到季度第一天、最后一天
  5. 两个表点击分页的时候怎么判断点的是哪一个表_如何对指数估值,估值表怎么用?...
  6. kafka入门综合概要介绍
  7. css不继承上级样式_CSS基础知识(一)
  8. 根据线程名获取线程及停止线程
  9. RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较(转)
  10. 子慕谈设计模式系列(二)——设计模式六大原则