这篇文章不是从0开始的,前面还有一些汇编基础指令以及进制,我都没写,时间问题,还是今天空闲,我才想补一下博文,后面我陆续会把前面知识点渐渐补上。我不会重0基础讲起,中间会以、汇编、C、C++交叉的形式讲解,实战或者学习中才能更好的提升自己!

  EFLAGS寄存器

  

这些标记出来的标志位十分重要,如果对于逆向开发,这些是需要课在脑子里的,可以不强背,实战中运用熟悉就自然记来了,为了方便描述,仅以8位来描述

演示之前,请读者参照下方红色字体,进行简单设置一下,后面都参考该格式。

OD中展示一遍效果,AL是EAX中的低8位(后面有时间这块我再发博文补充一遍,如果没有,请读者自行去学习一下吧,博主刚毕业,时间很有限),为了方便演示,我们直接将鼠标移到EAX,右键Modify将其改为0,中间那个框就是标志寄存器,为了演示每次的效果,方便我们观看标志位发生改变,我们用鼠标双击,将其全部改为0;

1、进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

  MOV AL,0XFF

  ADD AL,0X2

代码添加红框所示,按F8,代码往下走,我们一个一个的看!(这里讲解的是Carry flag)所以只看C位!!!

有个疑问?0xFF加上0x2之后,EAX里的值为什么是0x00000001呢?为什么不显示0x00000101呢?1去哪了呢?

这里1并没有不存在,而是存在了Carry flag里,我们之前将C为置成了0,相加过后变为了1,最高位发生了进位,C为就变成了1。(读者也可以去试试借位的情况,博主这里赶时间制作,就不演示了,后面内容还挺多,我想赶在12点前写完)

2、奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

  MOV AL,0X5

  ADD AL,0XA

对应的二进制得熟悉啊,不然思考起来很费劲!!!建议热爱的方向有与汇编相关的,一定要把十进制1 ~ 15对应的十六进制背下来啊

0x5 加上0xA,很显然为0xF,对应的二进制位1111,1的个数为4个,是偶数个,所以Parity flag为1(大家可以试试奇数个的情况,其实我代码里已经有了奇数个的,不知道大家有没有管擦到~~~)

3、辅助进位标志AF(Auxiliary Carry Flag):

在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字(word)操作时,发生低字节向高字节进位或借位时;

(2)、在字节(byte)操作时,发生低4位向高4位进位或借位时。

MOV EAX,0X555EFFFF    MOV AX,0X5EFF    MOV AL,0X5F

ADD EAX,0X2          MOV AX,0X2        MOV AL,0X2

4、零标志ZF(Zero Flag):零标志ZF用来反映运算结果是否为0。

如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

XOR EAX,EAX

MOV EAX,2

SUB EAX,2

我们先演示XOR(异或),这里我们需要先修改EAX里的值为AAA,当然了,既然是异或,那随您意了,随便什么数都行

5、符号标志SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

  这里,请读者抛弃掉以前课本上或者网络上有关描述最高位为1代表负数的观念(后续我会单独出博文,描述有符号数,无符号数),最高位为1代表负数纯属扯淡(如果是这样,计算机存的最大数岂不是要砍半,计算机发明的岂不是太low了),读者先记住一个观念有符号数,无符号数纯属编码者决定,跟计算机没关系!!!不然我后面讲不下去。。。。。

Sign Flag仅仅用来反映运算结果最高位是1,还是0,不代表有符号数,无符号数~~~

6、溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

最高位进位与溢出的区别:

进位标志表示无符号数运算结果是否超出范围.

溢出标志表示有符号数运算结果是否超出范围.

溢出主要是给有符号运算使用的,在有符号的运算中,有如下的规律:

正 + 正 = 正 如果结果是负数,则说明有溢出

负 + 负 = 负 如果结果是正数,则说明有溢出

正 + 负 永远都不会有溢出.

这个标志位有点不好理解,需要对有符号,无符号数具有很明确的概念,其实理解了很简单(就类似于很多人不懂自己多少岁一样,过了18岁生日,还以为自己是18岁,其实已经是19岁了)

这一块呢,可以参考一下Carry Flag标志位来理解,因为C为仅仅表示最高位有没有发生进位

a、无符号、有符号都不溢出

MOV AL,0X8

ADD AL,0X8

b、无符号溢出、有符号不溢出

c、无符号不溢出、有符号溢出

d、无符号、有符号都溢出

为什么这个说有符号、无符号都会溢出呢?

  首先从无符号角度来看,0xFF,仅仅只代表8位能存的最大正数(255),0x80为 128,既然0xFF已经代表8位能存的最大正数了,就算它加1,也必然溢出

  从有符号角度来看,0xFF,代表着 -128,8位中最小负数,0x80代表8位中最大负数 -1,既然0xFF已经代表了8位中能存的最小负数了,它再加 -1 (0x80)岂不是更小了,所以也必然溢出

本文只讲述了9个标志寄存器中的6个,因为这6个比较常用,也是博主目前知识储备中需要用到的6个,后面三个日后接触到,再来补充文章

如果看完本文,您觉得已经掌握了这6个标志寄存器,建议您可以做一做下面的题目,加深对标志寄存器的理解(答案在笔者电脑里,如果有需要,可以留邮箱,笔者私发给你,不难,看完文章就可以做出来)

1、写汇编指令只影响CF位的值(不能影响其他标志位)

2、写汇编指令只影响PF位的值(不能影响其他标志位)

3、写汇编指令只影响AF位的值(不能影响其他标志位)

4、写汇编指令只影响SF位的值(不能影响其他标志位)

5、写汇编指令只影响OF位的值(不能影响其他标志位)

第一篇博文发的有点匆促,许多知识点也未曾讲述明白,但本文意图旨在讲述EFLAGS寄存器 (标志寄存器),很多附带的知识点,笔者后面有时间会继续发出来!

写博文不容易,一方面是给自己留笔记,另一方面,也希望留给希望学习相关知识的人更清晰的参考,笔者在学习过程中,碰到过很多问题,曾也因为找不到很好解决问题的文章而苦恼过,编程从不是一个看懂听懂就行的,一定是多加实践、实践、实践、总结、总结、总结出来的,愿牛人技术越牛,新人更上一层楼!祝自己祝大家都能成为自己想成为的IT技术大牛!

EFLAGS寄存器(标志寄存器)的更多相关文章

  1. 8086cpu中的标志寄存器与比较指令

    在8086CPU中有一个特殊的寄存器--标志寄存器,该寄存器不同于其他寄存器,普通寄存器是用来存放数据的读取整个寄存器具有一定的含义,但是标志寄存器是每一位都有固定的含义,记录在运算中产生的信息,标志 ...

  2. 【reverse】逆向5 标志寄存器

    [reverse]逆向5 标志寄存器 1.引言 通过一个creak.exe文件的爆破,引出现阶段需要学习的知识 2.标志寄存器 标志寄存器有上图这么多个 记住这几个寄存器的位置和名称 下面是6个状态标 ...

  3. 学 Win32 汇编[20]: 洞察标志寄存器

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向 ...

  4. 学习笔记分享之汇编---3. 堆栈&标志寄存器

    前言:   此文章收录在本人的<学习笔记分享>分类中,此分类记录本人的学习心得体会,现全部分享出来希望和大家共同交流学习成长.附上分类链接:   https://www.cnblogs.c ...

  5. CPU标志寄存器

    这个标志寄存器似乎很重要,不干掉它,中断这玩意还进行不下去了,但是过于复杂,都是一些跟计算结果相关的位,头痛 (这是别人写的一篇非常好的关于标志寄存器的文章http://blog.csdn.net/w ...

  6. 标志寄存器在Debug中的表示

    在Debug中,标志寄存器是按照有意义的各个标志位单独表示的. 下面列出Debug对我们已知的标志位的表示.

  7. 标志寄存器PSW和汇编条件转移指令解释

    标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)   标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标志 ...

  8. 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示

    pushf 和 popf pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中弹出数据,输入标志寄存器. pushf 和 popf,为直接访问寄存器提供了方法. 格式 pushf popf ...

  9. 原来... 用debug如何查看当前标志寄存器的标志位值?

    -r 用这个指令,得到的信息右下角: NV   UP   EI   PL   NZ   NA   PO   NC这些符号代表的就是标志寄存器里常用标志位的值. 这个是符号值对应表: 溢出标志OF(Ov ...

随机推荐

  1. SparkStreaming整合flume

    SparkStreaming整合flume 在实际开发中push会丢数据,因为push是由flume将数据发给程序,程序出错,丢失数据.所以不会使用不做讲解,这里讲解poll,拉去flume的数据,保 ...

  2. python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

    用户代理池 用户代理池就是将不同的用户代理组建成为一个池子,随后随机调用. 作用:每次访问代表使用的浏览器不一样 import urllib.request import re import rand ...

  3. 关于 chromedriver、IEDriverServer、geckodriver 驱动器的几项注意点

    1. 下载 chromedriver 和 IEDriverServer 时,都没有对应的 win64 版本,只能选择 win32,也一样可以: 2. 下载的 IEDriverServer 的版本号和S ...

  4. ScratchJr是什么,有什么作用

    什么是ScratchJr? ScratchJr是一个入门级的编程语言,可以让5到7岁的小朋友去创建他们的互动故事和游戏.孩子们使用图形化的程序积木让角色移动.跳跃.舞蹈.唱歌.孩子们可以利用绘图编辑器 ...

  5. Go命令行库Cobra的核心文件root.go

    因为docker及Kubernetes都在用cobra库,所以记录一下. 自定义的地方,高红标出. root.go /* Copyright © 2019 NAME HERE <EMAIL AD ...

  6. 7.Java基础_Java数据输入

    import java.util.Scanner; public class Output { public static void main(String[] args){ Scanner sc=n ...

  7. 第十一周小组Scrum会议

    会议照片 本周会议内 回顾上一周的内容 总结上一轮的得失: 我们在第一轮中,并没有做出什么东西,为此我们痛定思痛,制定了计划,确定第二轮迭代的目标: 1. 实现小程序与后台代码的交互 2. 将检索书籍 ...

  8. java加密类

    java.security.KeyStore KeyStore ks = KeyStore.getInstance(type); KeyStore ks = KeyStore.getInstance( ...

  9. opencv读取USB相机select timeout问题

    现象: 树莓派4b或3b+   插着两个USB免驱相机 摄像头朝着灯就会报 time out 摄像头不朝着灯就不报 问题: 功率不够 朝着灯可能触发了USB相机的曝光补偿导致功率变大 解决: 使用带额 ...

  10. CSP-S 2019 AFO记

    DAY -1 上午并没有改出题,然而调出了动态$dp$,于是顺便$AC$了保卫王国,于是就很愉悦. 下午考前自闭赛,把会的题和原题写了出来,然后就$rank1$了,感觉自己$rp--$. 晚上发现$T ...