复习
push
push imm8/16/32(立即数): 栈顶都会-4push r16/32(寄存器): 不一定了. 要看操作的寄存器宽度
pop
pop 具体操作 也可以弹出 指定宽度的值到寄存器标志寄存器
EFLAGS寄存器上面的一些位上面的值.
某些汇编指令会根据这个值决定要不要执行本条指令
需要记住的位置 : 0,2,4,6-11 这几个位置
我们将 eflags 每一位转为 二进制数,在和 CF,PF,AF,ZF一一对应即可
位
第0位: CF,进位标志这里主要指 运算结果最高位产生了进位或借位.那么它的值就是1,否则是0. 产生的进位或借位的值就是1. CF存放的就是这个值
第2位: PF,奇偶标志.
如果运算结果中1的个数为偶数,那么这个为上的值是1 否则这个位上面的值是0
第4位: AF,辅助进位标志
在 操纵字节或字的时候,低4位向高四位发生进位或借位的时候. AF位的值为1
也就是说: 32位宽度的时候: FFFFF
FFF. 看哪个红的 F 是否会产生进位或借位. 产生了,AF的值是1
如果是16位的时候: FFF
F. 看中间的红的是否会产生进位. 如果产生了,那么AF的值是1
以此列推,当8位的时候: FF
看最后一位是否产生进位或借位
第6位: ZF,零标志
当计算结果是0的时候,ZF的值是1. 例如: XOR EAX,EAX. 相同为0,不同为1 那么. XOR EAX ,EAX 的值是0, ZF的值就是1 而 XOR的结果也是0,EAX 的是就是零
第7位: SF,符号标志
SF的值和 二进制数字最高位一样.
和 CF 相比. 不同的运算决定了 是否关注OF位. 如果 运算时有符号运算,那么就关注OF位.
规律:
正数 + 正数 = 负数: 说明溢出了.在计算机中,正数是有边界大小的. 受数据宽度影响. 如果过大. 则会跑到 负数的范围中.
说明溢出了.
而: 负数 + 负数 = 正数. 也说明溢出了
在 进行运算的时候,会同时影响各个标志位. 例如C和O位.
同一个运算. 看成有符号和无符号运算. 分别计算最后的结果,随之改变 CF 和 OF 位的值.
练习题
按照 上面的指令进行练习. 再结合 上面的那张图片. 观察对OF ,CF 标志位的影响
示例
第九集.
在这一集中, 逆向了一个 Creamk... 可以看到 je 指令的应用例如: je 指令. 看的是 z 标志位. 如果 z 标志位是0的话,不调. 如果是1,那么就跳
还有 jmp 指令. 不管标志寄存器上面的值,直接跳转想要去的地址