之前可以修改EIP寄存器的指令
JMP,CALL,RETN
所有JCC指令的动作->根据标志寄存器修改EIP的值
标志寄存器 EFLAGS
CF(bit 0)[Carry flag] C位
若算术产生的结果在最高有效位(most-significant bit)发生进位或者借位则将其置1 反之清零
这个标志通常用来指示无符号证书运算的溢出状态
|
|
PF (bit 2) [parity flag] P位
如果结果的最低有效字节 最后一个字节
(least-significant byte)包含偶数个1位则该位置1,否则清零
利用PF可进行奇偶校验检查
需要传输1100 1110
,数据中含5个1
,所以其奇校验位位,同时吧`1100 1110`传输给接收方, 接收方收到数据后再一次计算奇偶性,`1100 1110`中仍然含有5个`1`,所以接收方计算出的奇偶验位还是
,与发送方一致,表示在此次传输过程中未发生错误。
例子:
MOV AL,0xCE
AF (bit 4)[Auxiliary Carry Flag] 辅助进位标志器
如果算术操作在结果的第三位发生进位或者借位则该标志置1,否则清零
这个标志在BCD(binary-code decimal) 算术运算中被使用
ZF(bit 5)[Zero Flag] 用的最多 划重点。。
若结果为0则将其置1,反之清零。
经常与CMP或者TEST等指令一起使用
例1: 判断2个值是否相等
MOV EAX,100
MOV ECX,100
CMP EAX,ECX
(CMP指令相当于SUB指令,但是相减的结果并不保存到第一个操作数中 只影响标志寄存器)
例2:判断某个值是否为0
AND EAX,EAX 0 ZF=1
TEST EAX,EAX
(TEST相当于and,但是与运算的结果并不保存到第一个操作数中 只影响标志寄存器)
SF(bit 7) [Sign Flag]
该标志被设置为有符号整型的最高有效位
(0指示结果为正,反之则为负)
意思其实就是,运算完之后看下符号位 是0(正)还是1(负)
当然如果是无符号数运算就不用看了
例子
MOV AL,0x7F MOV AL,0xFE
ADD AL,2 ADD AL,2
OF(bit 11)[OverFlow Flag]
溢出标志OF用于反应有符号数加减运算所得结果是否溢出
可以这样理解:
* 如果是无符号数运算,是否溢出看CF位
* 如果是有符号数运算,是否溢出看OF位
例子:
MOV AL,0x7F
ADD AL,2
DF(bit 10)[Diretion Flag]
这个方向标志控制字符串指令(`MOVS`,CMPS,SCAS,LODS以及`STOS`)。设置DF标志是的串指令自动递减(从高地址向低地址方向处理字符串),清楚该标志则是的串指令自动递增
STD以及CLD指令分别用户设置以及清除DF标志
JCC常见指令
有符号和无符号的区别:
CMP AL,CL
JG 0x12345678
JA 0x12345678