我和CPU之间关于EFLAGS的对话

详解EFLAGS寄存器(标志寄存器) 1 阅读详情

作者:ukyohy

原作网址:http://www.pediy.com/kssd/pediy10/99569.html

某日下午,偶为了学习《加密解密》正伏案研究汇编语言中涉及到的CPU EFLAGS相关内容.针对书本上的内容,整按照自己的理解写了几个测试程序,用OD调来调去,可是EFLAGS寄存器的变化和自己想的总是不一样。于是苦苦思索,百思不得其解,只好闭目养神。

    不知道过了多久,在半睡半醒中来到一处陌生的地方。正四处张望的时候,前方突然出现一特大号CPU,那CPU竟然还能开口说话。因此才有了下面这段谈话。
   “CPU兄,您好。小弟最近在研究您内部的EFLAGS寄存器,能请教您几个问题吗?”我赶紧上前打招呼。
    “哦,你是UKYOHY吧。我正等你呢。就是你刚才老拿一个叫啥OLLYDBG的程序不停的在查看我的EFLAGS的值啊。有啥问题你说吧。” CPU答到。
我赶紧将正在思考的问题说出:“您能给我说说您的EFLAGS的结构吗?就是每个标志位都代表什么?”

      CPU :“BS你哦,这个问题好多文档上不是都写了嘛。比如最权威的intel官方文档都有啊,只有你整部明白,不停的调试来调试去,弄的我一身汗。哎,看你可怜,我再说一遍吧。” 说完,CPU一招手,凭空出现了一块黑板。他没有理睬我吃惊的表情,转身在黑板上画了如下的图:


        CPU画完之后看了看黑板满意的点点头,然后回过头来对我说:“先声明哦,灰色部分不要问我,因为我也不知道是干什么用的,也许只有我的父母才知道。”
     我仔细看了看黑板上的图,越看越迷惑,因为我看的书上没有介绍这么多,只好继续问CPU: “哦,我看的书上只介绍了CF,PF,AF,ZF,SF,OF 六个标志位,即使除掉保留位,也还剩下好多啊,这么多标志位该怎么学习理解啊?“
      CPU:  “CF,PF,AF,ZF,SF,OF 是最常用的6个标志啦,你作为一个初学者,先学习这6个标志就可以了,其他的暂时可以忽略。我来考考你,这6个进位标志你是怎么理解的?”
       我: “哦,书上时这么说的: CF标志位是当无符号加法运算的结果太大(或太小),目的操作数无法容纳的时候,CF标志位将被设置为1;PF 标志当结果数为1的bit位总数为偶数时设置为1;AF 标志当操作导致bit3向bit4进位的时候设置为1;ZF标志当结果为0的时候设置为1;SF标志当结果为负时被设置;OF标志当有符号数太大无法容纳于目的操作数时被设置为1.”
       CPU:“在评价你的答案之前,你能否回答我一个问题?你在答案中提到了无符号和有符号数,那么我是怎么判断一个数时有符号还是无符号的呢?”
       “哦…….”,我想了一下,尝试的发问“根据补码?根据符号位?”
        然后用求助的目光看着CPU。
        CPU笑而不答。
       “好吧,好吧…..我承认我不知道,还是请您告诉我吧。”我鼓足勇气说到。
       “知之为知之,不知为不知是为知也。孺子可教啊”,CPU得意的说。
        在顿了顿之后,CPU接着说道:“其实这个问题的答案是,作为CPU的我根本不知道一个数字到底是无符号还是有符号。我只知道这是个数字,或者精确的说,我的眼里只有这个数字的二进制表示形式。其实,从这个方面来说,我的设计逻辑没有想象的那么复杂,甚至可以说有点傻,我只关心二进制的加减(这里暂时忽略乘除)。我说的这些你能理解么?”
       我:“哦,我想起来了,《intel汇编程序设计》4.2.6节曾经提到过这个问题。大意是说CPU不知道,只有程序员知道。哎,你刚才的问题我其实是可以回答的,都怪我看书太不仔细了。不过这个观点我不是很理解,你能详细解释下么?”
       CPU:“当然可以。以下的内容要仔细听好哦。以一个字节为例,如果你分别向AL寄存器传送 1和 -1. 那么指令执行之后,AL里面的值究竟是什么呢? 根据你刚才的回答,你应该知道,传送1之后,AL的值是0X1h。 传送 -1 ,AL的值是0XFFh
 换句话说,1是直接转换成2进制存储到AL中。而-1是按照其补码存储到AL中的。可是这里的问题是,-1的补码是编译器在编译的时候完成转换的。换句话说,程序开始执行的时候,传到AL的实际值就是0xFFH. 在我眼里,它就是11111111,究竟它代表-1还是代表255,我也不知道。只有作为程序员的你知道。这点你能理解么?”
      CPU说道这里,停了下来,然后看着我。我仔细思考了下,似乎有点理解了,然后点了点头。       
     “那好,继续刚才的话题。所以,所有的算术逻辑运算,在我眼里都是简单的二进制运算。
现在回到刚才EFLAGS标志的问题,我从我的观点来阐述着几个标志位:
      CF标志:操作数的最高有效位发生进位或者借位的时候,这个标志位就是1.
         PF标志:操作结果的最低有效字节,换句话说,最右边的8位中,如果bit为1的总数
         是偶数,那么该标志就是1.
         AF标志:如果操作结果bit3发生了进位,那么该标志就是1.
         ZF标志:如果操作结果为0,那么该标志就是1。
      SF标志:就是操作数的最高有效位,就是说SF的值等于操作结果的最高有效位。
      OF标志:这个标志有点复杂,其结果是CF标志和次最高位是否发生进位(如果进位是1,
              没进位是0)进行异或的结果。
      以上是我设置标志位的规则,记住了哦。看你研究的那么辛苦,才告诉你。我要走了。”
      我:“等等,我还有好多问题要问啊,别走啊。。。。。。”
      一惊之下,突然醒来,口水流了一桌子原来是南柯一梦。
      赶紧整理下梦中的记忆,写在纸上进行验证。谁知结果竟然是正确的,因此写出来大家共享。

IA-32寄存器(通用寄存器、EFLAGS寄存器、指令指针寄存器、段寄存器) 文章目录一、通用寄存器(GPR)二、EFLAGS寄存器(标志寄存器)三、指令指针寄存器(EIP)四、段寄存器(Segment Register) 通用寄存器(General Purpose Registers,32位,8个) 段寄存器(Segment Registers,16位,6个) 程序状态与控制寄存器(Program Status and Control Register,32位,1个) 指令指针寄存器(Instruction Pointer,32位,1个) 一、通用寄存器(GPR) IA-32体系结 阅读详情

相关推荐

RTEMS实时操作系统精要(2)-FLAGS、EFLAGS寄存器

FLAGS寄存器是Intel x86微处理器中的状态寄存器,它包含处理器的当前状态。这个寄存器是16位宽的。它的后继者EFLAGS和RFLAGS寄存器的宽度分别为32位和64位。较宽的寄存器保持了与较小的前辈的兼容性。 位位置1、3和5的固定位,进位、奇偶校验、调整、零和标志标志都继承自更早的体系结构8080和8085。调整标志在8080中被称为辅助进位,在Zilog Z80架构中被称为半进位。 所有标志寄存器都包含条件码,标志位可以让一个机器语言指令的结果影响另一个指令。算术和逻辑指令设置部分或全部标志

The research on computer technolog 836

nasm : test eflags ZF

看看如何在bochs中查看标志寄存器,当标志寄存器置位和清零0,都是什么样子. 查看eflags的bochs命令 : info eflags 当(0 === ZF)时, ZF标志显示为zf 当(1 == ZF)时,ZF标志显示为ZF 其他标志位也是这样显示. Next at t=156867343 (0) [0x000000007c39] 0000:7c39 (unk.

博客标题不能为空 1387

X86CPU寄存器分析

本文讲述X86计算机的寄存器构造,包括EIP(程序指令指针寄存器,与16位单片机的PC程序计数器类似),以及EAX(累加寄存器),EBX(基地址寄存器),ECX(计数寄存器),EDX(数据寄存器),ESP(堆栈顶指针),EBP(堆栈基指针)等通用寄存器,以及CS、DS、ES、SS等段寄存器。 一、32位CPU寄存器                    可以看出,他的低16位作

随笔随心的博客 3991

操作系统真象还原第1.5章 NASM汇编学习

第二章有使用 NASM 汇编写主引导记录 MBR 的内容。 在写第二章的代码前,每天晚上下班后花一些时间简单地回顾了 NASM 汇编的内容,只复习了最简单的语法,之后写 OS 时再边写边查资料。 指令 mov 数据传送指令。 mov eax, 1 ; eax = 1 mov ebx, 2 ; ebx = 2 mov ecx, eax ; ecx = eax add 加法指令。 add eax, 2 ; eax = eax + 2 add ebx, eax ; ebx = ebx + e

zhwenx3的博客 526

数据分析是什么?

说道“数据分析”一词,大家应该并不陌生,数据分析从字面上来理解,就是对数据做出分析然后得出一个结论,看起来浅显易懂,下面我们把这个词语分开得到的是“数据”与“分析”。“数据”的范围就很广泛了,小到一个计量数字,大到成亿级别的数据汇总,都可以称为数据;“分析”一词并不难理解,以智慧思维的方法对某一事物做出合理的解释,给出结论是为分析,一般会用到数学上的分析方法,比如统计学或者概率论等等。 1. 什么是数据分析 1) 数据分析发展背景 进入到 21 世纪以后,伴随着互联网的迅速发展,大数据应运而生,越来越多的数

MC_XY的博客 5432

第一次面试经历:集创北方数字IC前端面试(崩)总结

时间:2020年8月11日上午10点 公司:集创北方,做LED、LCD、OLED、AMOLED等显示器芯片的公司,应该主要是做显示驱动、图像处理、电源管理等这一块。 岗位:数字IC前端设计 城市:北京 形式:线上面试。感觉我俩是两个社畜,他说摄像头开不开都可以,我说那语音OK吗他说OK,于是直接语音问答。 项目经历:基于FPGA的车牌识别 & 先导存储器集成工艺开发(课题组) & 基于FPGA的贪吃蛇小游戏 反正是凉凉的,这时候准备还不足,前面都在复习项目没怎么刷过题。 过程如下: 自我介绍

coin的博客 6680

EFLAGS寄存器中状态标志(Status Flags)小结

对EFLAGS寄存器中状态标志的总结。

astrotycoon 1万+

010Editor实战:5分钟破解Zip伪加密文件(附BUUCTF真题解析)

本文详细介绍了如何使用010Editor快速破解Zip伪加密文件,包括BUUCTF真题的完整解析。通过修改关键字节,轻松解除伪加密状态,适用于CTF竞赛和实际工作场景,提升文件处理效率。

weixin_29325007的博客 326

关于EFLAGS寄存器介绍

在学习Linux内核的时候经常会看到某个操作会需要用到eflags寄存器的值,而这个寄存器还是在本科学习汇编语言时学过。而鉴于这个寄存器的重要性,所以我又将我那本很经典的汇编语言(王爽版)的书翻出来好好看了下。并找到一张该寄存器各位的示意图,各个位的功能也就一目了然。                                                  学习linux内核时,发

一路前行的专栏 2674

Wireshark抓包实战:5个CTF比赛中高频出现的流量分析技巧(附真实案例)

本文分享了Wireshark在CTF比赛和实战渗透中的五个核心流量分析技巧。内容涵盖从宏观统计概览锁定可疑目标、深度解析ICMP与HTTP等协议、追踪重组完整会话流,到利用字符串搜索和命令行工具进行自动化分析。掌握这些高阶技巧能显著提升分析海量网络流量的效率与精准度。

rrr55的博客 261

利用LATX技术在龙芯安同AOCS OS上部署坚果云:跨架构文件同步实战

本文详细介绍了如何在龙芯安同AOCS OS上,利用LATX指令翻译技术部署坚果云客户端,实现跨架构文件同步。通过安装LATX环境、解压x64安装包、运行安装脚本三步,成功在loongarch64架构上运行仅支持x86_64的软件,解决了国产平台办公协同的痛点,并分享了性能实测与优化建议。

weixin_29305337的博客 457

汇编—EFLAGS寄存器

1. EFLAGS寄存器 两个数相加,如果最高位向高位进位,结果忽略这个位,那么这个位要放到 CF 里面。 Carry Flag,进位标志。 减法运算,如果最高位向高位借位,则 CF 位为 1。 CF 表示加满了之后,向高位进位,但是计算机限制宽度,没法表示,所以把进的这个位暂时放在标志寄存器里面的一个位 CF,以后有待查证,减法同理。 CF 在 eflag 里面第 0 位。运算的宽度可以自定义...

怪味巧克力的博客 2695

STM32F103C8T6实战指南:从零搭建最小系统与GPIO控制

本文详细介绍了STM32F103C8T6微控制器的实战应用,从零开始讲解如何搭建最小系统并进行GPIO控制。内容涵盖电源电路设计、时钟配置、GPIO工作模式详解及实战项目开发,帮助初学者快速掌握这款ARM Cortex-M3内核微控制器的核心开发技能,适用于物联网设备和嵌入式系统开发。

lemon的博客 632

Linux32位系统 eflags寄存器介绍

EFLAGS寄存器是x86架构中重要的状态寄存器,包含运算状态标志(CF、ZF、SF、OF等)、控制标志和系统标志。文章详细介绍了主要标志位的功能,并提供了一个汇编演示脚本,通过加法、减法等操作展示标志位的设置。还讲解了如何使用gdb观察EFLAGS值变化,以及条件跳转指令与标志位的关联。最后总结了EFLAGS在循环控制、条件判断和错误检查中的实际应用。演示脚本可通过编译运行,预期输出"结果为零"、"进位发生"等状态信息。

546

【人脸识别/轻量级模型】MobileFaceNet:适用于人脸识别的轻量级网络模型(文末附pytorch代码)

MobileFaceNet:用于人脸识别的轻量级网络模型

Roaddd的博客 6990

从零开始学习PX4源码23(飞行模式管理)

本文摘要主要介绍了PX4飞控系统中飞行模式管理模块的代码实现流程。文章从整体架构入手,分析了飞行模式管理模块的启动过程、类继承关系以及核心运行机制。重点阐述了模块从rc.mc_apps启动脚本到FlightModeManager::main()的调用链路,包括任务创建、工作队列初始化和主循环执行流程。核心部分解释了Run()函数如何通过订阅传感器数据、更新参数、处理命令以及生成轨迹设定点来实现飞行模式切换和任务管理功能。文章为理解PX4飞行控制系统的模式切换机制提供了代码层面的详细分析。

陌城烟雨 499

QSYM 的 EFLAGS 符号化:如何精确模拟 CPU 状态标志

QSYM 是一个面向混合模糊测试(Hybrid Fuzzing)的实用混合执行引擎(Concolic Execution Engine),而 **EFLAGS 符号化** 正是它区别于普通符号执行工具的核心技术之一。简单来说,QSYM 会把 CPU 的状态标志寄存器(EFLAGS)转换成符号表达式,从而精确模拟分支跳转背后的"真实原因"。本文将从零开始,用通俗的语言讲清 QSYM 如何一步步建模这

gitblog_00994的博客 319

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

linux内核获取cpu,Linux内核中CPU信息获取方法

Linux内核中CPU信息获取方法本文介绍了Linux Kernel中X86架构下CPU信息获取方法。1. EFLAGS寄存器The ID flag (bit 21) in the EFLAGS register indicates support for the CPUID instruction. If a software procedure can set and clear th...

weixin_30303839的博客 1188

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

EFLAGS description and implementation

EFLAGS description and implementation. Introduction From:http://code.google.com/p/aphrodite-vm/wiki/EFLAGS EFLAGS是一个32位寄存器,由:一组状态标志位,一个控制标志位,一组系统标志位和系统保留位组成。 状态标志位 状态标志位简称为:OSZAPC,它们分

kendyhj9999的专栏 824

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

状态标志寄存器--EFLAGS

EFLAGS寄存器有控制CPU的操作或反映CPU某些运算的结果的独立二进制位构成。

飘零过客 2472

【学员笔记分享】汇编之EFLAGS寄存器中标志位

【重要提示】因为公众号改了推送规则,一些读者反映有时收不到文章更新,不想错过的老铁可以这样:1、星标:点击公众号头像右上角的小人-然后点击点击右上角的“…”-设为星标。2、分享、赞、在看...

Ms08067安全实验室 1073

zero EFLAGS after setting rsp

zero EFLAGS after setting rsp

xiaozhi 193

【精通内核】Linux内核中断控制原理源码解析

CPU 对于任务切换是通过时钟中断来控制的,只要我们将中断屏蔽,就可以保证在当前CPU中的所有操作都不会被中断,从而保证了原子性。在单核CPU上, 通过操作 EFLAGS 寄存器相当于保存EFLAGS表示中断。

小明的Java问道之路 1496

我和CPU之

某日下午,偶为了学习《加密解密》正伏案研究汇编语言中涉及到的CPU EFLAGS相关内容.针对书本上的内容,整按照自己的理解写了几个测试程序,用OD调来调去,可是EFLAGS寄存器的变化和自己想的总是不一样。于是苦苦思索,百思不得其解,只好闭目养神。     不知道过了多久,在半睡半醒中来到一处陌生的地方。正四处张望的时候,前方突然出现一特大号CPU,那CPU竟然还能开口说话。因此才有了下面这段

kendyhj9999的专栏 496

[转载] 利用pushfd/popfd检测虚拟机(cpu模拟器)

执行popfd前: EFLAGS = 00200202 [ESP] = FFFFFAFF 执行popfd后: EFLAGS = 00244AD7 不等于[ESP]中的FFFFFAFF,什么原因导致的呢? POPFD不是简单把[ESP]赋值给EFLAGS 某些虚拟机(CPU模拟器)简单的把[ESP]值pop给了ELF,导致popfd后-》再pushfd-》再pop出来的值是相同的,实际如上,应该是不同的,popfd只对某些位有影响。 这应该算是某些CPU模拟器的BUG. ...

qq_26950893的博客 357

我所理解的CPU中断

什么是中断 假设你在玩王者荣耀,突然一个电话过来…, 这就是中断! 对CPU来说就是:CPU在执行某一段程序的时候收到某些特定信号转而去执行另一段特定程序的过程。 那为什么需要中断呢?原因是CPU不能闷着头啥也不管一个劲的只管执行代码,还得和连接在主板上的其它硬件打交道。经常和CPU保持联系的硬件有键盘、鼠标、磁盘,还有网卡等。如果没有中断那就意味着你猛敲键盘电脑都没反应,这显然不是你想要的结果。注意一点就是上图中,当CPU收到一个中断请求转去执行中断处理程序之后,不一定会返回继续执行原来的程序A,有可

Ajekseg的博客 7536
上一篇: 跳转指令 jmp、call、ret、retf
下一篇: GDT和LDT
xiaominthere
博客等级 码龄16年 65粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值