文章目录
一、标志寄存器图
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指令
尝试只影响一位的汇编指令
(海哥的练习)