【逆向】第七章 标志寄存器


一、标志寄存器图

EFLAGS寄存器:记住CF(0),PF(2),AF(4),ZF(6),SF(7),OF(11)的位
在这里插入图片描述

1.进位标志寄存器:CF

如果运算结果最高位产生了一个进位或者错位,那么其值为1,否则其值为0
研究这类题要确定数字宽度
在反汇编窗口写入:
在这里插入图片描述
此时寄存器窗口在这里插入图片描述
双击修改标志寄存器的值看到EFL,此时是202,拆成2进制是:0010 0000 0010
最后一位C位是0,倒数第二位默认是1,P位也是0
按下F8开始执行,我们先看C位在这里插入图片描述
看到,C位并没有变化,因为我们最高位是5,5没有进
在这里插入图片描述
按下F8
在这里插入图片描述
看到已经执行进位了,FF+1可以参考之前的数字宽度笔记

2.奇偶标志:PF

反应结果二进制中最低有效字节的结果的1的个数的奇偶性,如果为偶,则为1
“mov eax,0x3“
按照理论,最低有效字节是03,3转为二进制是011,偶数个,P为1
实验结果:只看P位在这里插入图片描述

3.辅助进位标志:AF

假如数字宽度是32位,转化为16进制是8个6666 FFFF,最高一个F向不向6进位
16位55FF,看F向不向5进位
8位FF,看后一个F向不向前进位
实验:
在这里插入图片描述
按下F8在这里插入图片描述
A位一直是1在这里插入图片描述在这里插入图片描述
A位变0了

4.零标志ZF

零标志用来判断运算结果是否为0,如果结果刚好是0,ZF的结果刚好变成1
实验:

xor eax,eax

把eax清零
在这里插入图片描述

5.符号位标志SF

符号位标志用来反映运算结果的符号位,它与运算结果的最高位相同在这里插入图片描述
实验结果
在这里插入图片描述

6.溢出标志OF

进位标志表示无符号数的运算结果
溢出只是表示有符号的是否超出范围
正+正=负 负+负=正 有溢出
正+负永远无溢出
有无符号是人来定寄存器的存储方式,也就是说无符号运算关注CF
在这里插入图片描述
无符号是跨整个球为溢出
有符号是正加正为负,负负为正为溢出

二.指令

1.ADC指令

带进位的加法,就是把CF加到结果去:al = 1,cl=3 写入ADC al,cl结果如下在这里插入图片描述
两边不能同时为内存

2.SBB指令

带错位的减法,同ADC

3.XCHG指令

交换数据在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
交换内存:xchg dword ptr ds:[12FFC4],eax

4.movs指令

在这里插入图片描述

移动数据:内存-内存
movs dword ptr es:[EDI],byte ptr ds:[ESI] 简写为MOVSB
实验结果:
寄存器窗口中EDI和ESI的值加上了4,栈堆中ESI数据指向的是一个地址,该地址的数据传给了EDI中数据指向的地址的数据

DF标志寄存器,指esi和edi的指向方向

D为1时,上述EDI和ESI的值是减,如果为0,是加

5.STOS指令

将AL/AX/EAX的值存储到【EDI】指定的内存单元
也受DF的影响

在这里插入图片描述

6.REP指令

在这里插入图片描述

尝试只影响一位的汇编指令

(海哥的练习)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46441427/article/details/112641320