什么是标志寄存器?
标志寄存器: flag寄存器16位。 这个标志寄存器并不是完全占满16位,它总共就有9位地址被用。
EFL(Extended Flags Register)是指 扩展标志寄存器,它是x86架构中的一部分,用于存储处理器的标志位,用于反应最近一次算数运算,逻辑运算和比较操作的结果。 EFL寄存器中的标志位用于决定条件调整和其他控制操作。
上面图有俩部分,第一个部分是标志位的状态区域, 下面EFL 是寄存器的16进制值。
EFL标志寄存器各个位说明
CF (carry flag, 进位标志):
用于表示跨字节加法产生进位或减法发生借位。比如: 当前加法运算的结果超过最大能表示的数据, 或减法中减数小于被减数发生借位,CF==1;
我们打开OllyDbg来尝试修改这个值。
我们来验证错位的情况,就是我们尝试减法错位的情况。
首先先设置EAX 的值为1 : 执行 MOV EAX, 1, F8执行后可以看到值被修改。
然后我们双击右侧的EFL寄存器,弹框后直接修改EFL的标志寄存器值为0,来验证CF
这里可以看到EFL 值为0,上面CF的值也是0
我们执行一次减法语句: SUB EAX, 2 执行后我们应可以看到 C 这个对应的值变成1,说法发生错位了。
上面我们可以看到C标志位已经变成了1. 进位场景这里就不截图了,情况是一样的。
PF (Parity Flag 奇偶标志)
当前运算结果的二进制数据中1的个数是偶数PF 会被设置成1, 否则被设置成0
我来验证下偶数的情况
首先将EAX 设置成1, 然后将EFL标志寄存器设置位0. (设置过程后面我就不截图了,大家搞过几遍应该都熟悉了)
上面图中我们可以看到EAX的值是,然后P 位置是0. 我们去执行 ADD EAX 2 语句,那么本次运行结果就是3, 转成进制就是 0011. 就是偶数个数的1. 我们应该可以看到P位置变成1.
上面图中我们可以看到符合预期,奇数情况一样。
AF (Auxiliary Carry Flag 辅助进位标志)
如果单个字节内低四位和高四位有进位或借位,就会发生AF 辅助进位标志被设置成1。
低四位进位验证
进位验证 0000 1111 + 0000 0001 = 0001 0000
mov eax, 0x0F
双击EFL设置为0
add eax, 1
备注: 这个是单个字节内发生的进位,
高四位错位
0001 0000 - 0001 = 1111
mov eax, 0x10
双击EFL标志寄存器,弹框后设置为0
sub eax, 1
可以看到AF 辅助进位标记被设置成了1.
到这里如果你注意到我上面的描述, "AF 是字节内的高四位和低四位发生进位就会改变AF标记“,并且去做了测试,你就发现32位程序中,除了最低位字节外,其他字节的高四位和低四位发生借位或进位AF是不会发生变化的。 这个我去查了下AI,它的回复如下
这个后面还可以在深入的探究下。
ZF (Zero Flag 零标志)
当前运算结果是否为0 ,如果是ZF标记就会被设置成1,否则会被设置成0;
mov eax, 1
手动设置EFL 为0
xor eax, 1
mov eax, 1
手动设置EFL 为0
sub eax,1
这里可以看到zf 标记都被设置成1了。
这里有一个问题,我现在还不是很懂,为啥我通过执行imul eax, 0语句后,eax的值也变成0了,但是 ZF标记始终没有被设置成1.这个有了解的朋友可以在评论区留言指导下,或者后面我学完了如果理解了,我也会这里再次更正下。
SF(Sign Falg 符号标志)
符号位如果是1则 SF 被设置成1
mov eax, 0
手动设置EFL 值为0
sub al, 0x80
TF(Trap Flag 陷阱标志)
陷阱标志(TF)是 x86 处理器中的一个调试标志位,用于控制处理器在每条指令执行后触发中断,从而实现单步执行功能,广泛应用于程序调试和异常处理。
DF(Direction Flag )
这个我理解就有的指令执行的方向,比如 之前学习的ESI 源索引寄存器和 EDI 目的索引寄存器操作方向可以通过DF来控制,
DF=0
:正向操作(ESI
/EDI
递增,默认状态)
DF=1
:逆向操作(ESI
/EDI
递减)
OF(Overflow Flag 溢出标记)
顾名思义,就是操作结果溢出了变量最大的可容纳的值就会设置OF为1
二进制: 0111 1111 1111 1111 1111 1111 1111 1111 + 1
十六进制: 0x7FFFFFFF + 1
mov eax, 0x7FFFFFFF
手动设置EFL为0
add eax, 1
这里可以看到,OF被设置成了1
哈哈哈,挑战失败了, 本来准备一天看完孙老师的全部课程, 谁知道这一章节中验证和理解每一个Flag还是比较耗费时间的, 大家如果发现理解上有问题,还请指出来,我将十分感谢。
上一篇:汇编学习之《扩展指令指针寄存器》
下一篇:汇编学习之《段寄存器》