参考网上的资料。整理了我认为比较常用的标志位知识点。
一、SF,CF,ZF,OF,PF,ZF 讲解
SF=0(最高位是什么,ZF就是什么)
CF=1(最高位有进位或借位就置1)
ZF=0(结果为0,ZF就置1)
OF=1(两个负数相加变成正数,溢出)
PF=0(反映结果“1”的个数,奇数个“1”就为0,偶数个“1”就为1)
CF(carry flag):进位标志 描述了最近操作是否发生了进位(可以检查无符号操作是否溢出)
ZF(zero flag):零标志 最近操作结果为0(列如 逻辑操作 等)
SF(sign flag):符号标志最近操作结果为负数
OF(overflow flag):溢出标志最近操作导致一个补码溢出 补码溢出通常有两种结果(正溢出或者负溢出)
二、AND OR 运算
CPU按顺序总共有9个标识位(16位CPU)
OF DF IF TF SF ZF AF PF CF
3个状态控制标示为 DF IF TF
6个运算标志位 OF SF ZF AF PF CF
AND指令影响标志位PF、SF、ZF,使CF=0、OF=0
.例如,在同一个通用寄存器自身相与时,操作数虽不变,但使CF置零.
主要用于修改操作数或置某些位为零.
OR 同上。除了进位辅助外,基本都可能受影响,
结果又很大的随机性,谁知道AND\OR 的结果是奇数还是偶数,是不是0,第一位是不是1.
但是一定的是CF OF 进位和溢出必定为0
三、TEST AX,AX
00401098 50 push eax
:00401099 8BCF mov ecx, edi
:00401056 52 push edx
:00401057 8BC8 mov ecx, eax
:00401059 E8021D0100 call 00412D60
:0040105E 85C0 test eax, eax
:00401060 7421 je 00401083
在上述的程序段中,我的不明白是两个ax的直,是相同的还test 干什么
test指令操作是目的操作数和源操作数按位逻辑“与“
运算结果不送回目的操作数
然后根据结果设置SF、ZF、和PF标志位,并将CF和OF
标志位清零。
而JE是当ZF=1时跳转。
即,当eax的值等于0时跳转。
因此说,这里的test就是检测eax的值是不是0
四、[local.1]
在OD里,[local.1] 是 ebp-4 , [local.2] 是 ebp-8 , 以每4个字节递增。
五、XOR AX,AX
等价于 mov ax,0
是异或运算,两数相反为1;两数相同为0。由于这两个数相同,异或后等于清0
由于它比mov eax,0效率高,所以一般用它!