当前位置: 首页 > news >正文

软件逆向之标志位

进位标志CF(Carry Flag)

  • 介绍:如果运算结果的最高位产生了一个进位(加法)或借位(减法),那么,其值为1,否则其值为0。无符号数。

  • 示例:

    mov al,0xFF
    add al,0x2
    

奇偶标志PF(Parity Flag)

  • 介绍:奇偶标志PF用于反映运算结果中(最低有效字节中)1的个数的奇偶情况。偶数个"1"时,PF为1,否则为0

  • 示例:

    mov al,0x3
    add al,0x3 //6  0110  2个"1"  偶数
    add al,0x2 //8  1000  1个"1"  奇数
    
    • 偶数示例:


    • 奇数示例:


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

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

    1. 在字(word、dword等)操作时,发生低字节向高字节进位或借位时;
    2. 在字节操作时,发生低4位向高4位进位(加法)或借位(减法)时。
  • 示例:

    mov eax,0x55EEFFFF
    add eax,2mov ax,0x5EFE
    add ax,2mov al,0x5E
    add al,2mov ah,0x5E
    add ah,2
    

零标志ZF(Zero Flag)

  • 介绍:零标志ZF用来反映运算结果是否为0。如果运算结果为0, 则其值为1, 否则其值为0。在判断运算结果是否为0时,可使用此标志位。

  • 示例:

    xor eax,eaxmov eax,2
    sub eax,2
    

符号标志SF(Sign Flag)

  • 介绍:符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在二进制数中,最高位指的是最左侧的位。最高位也称为符号位,在有符号数中,它用来表示数字的正负(0表示正,1表示负)。符号标志位,记录相关指令执行后,其结果是否为负,如果结果为负,则sf = 1,如果结果为非负,则sf = 0。

  • 示例:

    mov al,0x7F
    add al,0x2 // 81    1000 0001  最高位为1->负数   SF = 1
    

溢出标志位OF(Overflow Flag)

  • 介绍:溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则被清为0。

    1. 无符号数:0……FF
    2. 有符号数: 正数:0……7F 负数:80……FF
  • 示例:

    无符号溢出、有符号不溢出 //8位无符号整数范围:0~255  超出范围从0开始
    mov al,0xff
    add al,0x2 //1   257    0001 0000 0001无符号不溢出、有符号溢出  //8位有符号整数范围:-128 ~ 127 
    mov al,0x7f
    add al,0x2 //81   129 > 127    1000 0001无符号、有符号都溢出
    mov al,fe
    add al,0x80 
    //无符号溢出原因:当al的值为254,再加128理论上应该是382,超出了无符号整数范围,发生了溢出
    //有符号溢出原因:al是8位寄存器,只能存储-128 ~ 127,0x80为128,超出了最大范围,发生了溢出
    

补充

补码运算:正数为原码本身,负数为原码取反加一
127为正数,其补码为原码0111 1111
-127为负数,其补码为原码0111 1111,取反1000 0000,加一,1000 0001。

0xFFFF :
要想转换为十进制,可以先转换为二进制,即1111 1111 1111 1111
最高位为符号位,1代表负数
你的问题相当于求其真值,公式为除过符号位其他位取反加一,即
1111 1111 1111 1111 ->1000 0000 0000 0000 ->1000 0000 0000 0001他就是十进制-1

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

进位标志CF表示无符号数运算结果是否超出范围。
溢出标志OF表示有符号数运算结果是否超出范围。
溢出主要是给有符号运算使用的,在有符号的运算中,有如下的规律:

正 + 正 = 正,如果结果是负数,则说明有溢出。
负 + 负 = 负,如果结果是正数,则说明有溢出。
正 + 负,永远都不会有溢出

总结

  • CF针对无符号数(将寄存器中的操作数都看作是无符号数)
  • OF针对有符号数(将寄存器中的操作数都看作是有符号数)
  • 有符号无符号指的是最高位是否是符号位,即是以补码的形式看待还是以原码的形式看待。



http://www.mrgr.cn/news/82542.html

相关文章:

  • SpringMVC(三)请求
  • 用opencv实现像素统计
  • Gitee图形界面上传(详细步骤)
  • springboot3 redis 批量删除特定的 key 或带有特定前缀的 key
  • 《深度剖析:开源与闭源模型,AI舞台上的不同角色》
  • jenkins入门4 --window执行execute shell
  • 公共数据授权运营系统建设手册(附下载)
  • Tableau数据可视化与仪表盘搭建-数据连接
  • C语言:结构体
  • 【Rust自学】10.4. trait Pt.2:trait作为参数和返回类型、trait bound
  • 每天你好20250105(距离春节24天!!!)
  • 「C++笔记」unordered_map:哈希化的无序映射函数(键值对)
  • BerOS 文件系统路径归一化问题及其 Python 实现
  • 软件测试面试题整理
  • Chapter 3 Coding Attention Mechanisms
  • unity学习6:unity的3D项目的基本界面和菜单
  • 基于NLP的医学搜索相关性判断
  • GIT 企业级开发学习 1_基本操作
  • Navicat 17 for Mac 数据库管理软件
  • 人工智能之机器学习算法
  • 【QT】增删改查 XML 文件的类
  • AI是如何实现推理的
  • Ant Design Pro写项目的总结经验(react)
  • ABAQUS三维Voronoi晶体几何建模
  • Flume拦截器的实现
  • 我用AI学Android Jetpack Compose之开篇