滴水逆向笔记(六.标志寄存器)

一.

1.pushad

对比上面两图得知,pushad的作用相当于把这八个通用寄存器的值都依次存到了上面的内存单元,栈底对应的内存编号不变,而栈顶对应的内存编号也从原来的7c变为了5c

这个也不知道该咋说,就草率地对比两个图总结

2.popad

这里寄存器对应的内存编号也是稍作了变化,接下来看作用效果

这里可以看到它是将pushad执行之前8个寄存器对应的内存编号还原了回来,但是那些被涉及到的内存单元存储的值并没有变回来

二.(注:mov指令不影响标志寄存器)

1.进位标志CF:如果运算结果的最高位产生了一个进位或借位,那么其值为1,否则,其值为0

这里add al,1还没有执行,此时现在是c0

这里执行完毕,此时c0变为c1

这时候eax并没有11120100而是11120000,这里老师给出的解答就是进的这一位进到c0上去了

2.奇偶标志PF:奇偶标志PF用于反映运算结果中“1”的个数的奇偶性,如果“1”的个数为偶数, 则PF的值为1,否则其值为0(注意:这里“1”的个数是最低有效字节的,就是最后两位)

                                                                  

先执行了mov al,3的指令,之后我们将执行add al,3

 这时可以发现p0变成p1了,转成二进制0011变成0110,2个“1”,偶数,所以此时p0变成p1了,之后我们将执行add al,2

 执行完指令后,0110成了1000,此时只有一个“1”,p1变成了p0

3.辅助进位标志AF:在发生以下情况下,辅助进位标志AF的被置为1,否则为0

(1)在字操作时,发生低字节向高字节进位或借位时;

(2)在字节操作时,发生低4位向高4位进位或借位时;

刚执行完mov ax,0x5efe指令,接着

执行完add ax,2,可以看出A0变为A1

4.零标志:零标志用来反映运算结果是否为0,若是,其值为1,否则为0

接下来,执行sub eax,eax

此时运算结果为0,Z0变成了Z1

5.符号标志SF:SF用来反映运算结果的符号位,它与运算结果的最高位相同

刚执行完mov al,7f,接着

 执行完add ax,2,此时从二进制角度看从0111 1111变成了1000 0001,S0变成了S1

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

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

进位标志表示无符号数运算结果是否超出范围

溢出标志表示有符号数运算结果是否超出范围

无符号数:0~FF,

                                                     有符号数:正数0~7F,负数:80~FF

溢出主要是给有符号数运算使用的,在有符号运算中,有如下规律:

正+正=正,如果结果为负数,则说明有溢出

负+负=负,如果结果为正数,则说明有溢出

正+负永远不会有溢出

(1)无符号数和有符号数都不溢出的情况

这时刚执行完mov al,7,接着

执行完add al,7,可以看到C0和O0并没有变化

(2)无符号数溢出,有符号数不溢出的情况

刚执行完mov al,0xff,接着

执行完add al,2,发现此时只有C0变为C1,O0保持不变

(3)无符号数不溢出,有符号数溢出的情况

此时刚执行完mov al,7f,接着

 执行完 add al,2,C0不变,O0变为O1

(4)有符号数和无符号数都溢出的情况

刚执行完mov al,0x80 ,接着

执行完add al,81 ,可以看到此时C0和O0分别变成了C1、O1

猜你喜欢

转载自blog.csdn.net/m0_51295934/article/details/122585169
今日推荐