CPU标志寄存器非常复杂,16位、32位、64位CPU的标志寄存器EFLAGS都不一样,16位太旧了,兼容 在32位寄存器内,我就不讲了,详细讲解一下32位寄存器,64位在32位上扩展,我会边学边更新。
1.X86_32的EFLAGS寄存器
- CF:进位标志CF(Carry Flag),如果运算结果的最高位产生了一个进位或借位,其值为1,否则为0。
- PF:奇偶标志PF(Parity Flag),运算结果中“1”的个数的奇偶性,偶数个1,PF=1,反之为0。
- AF:辅助进位标志AF(Auxiliary Carry Flag),这个不太好理解,比如:EAX值为0xNNNNNNNN(红色地方有进位,AF就是1,不管使用的是:EAX、AX、AL)。
- ZF:零标志ZF(Zero Flag),它记录相关指令执行后,结果是否为0;如果结果为0,zf=1,如果结果不为0,zf=0
- SF:符号标志SF(Sign Flag),正负标志位,它记录相关指令执行后,结果是否为负,如果结果为负,zf=1,如果结果非负,zf=0。(说明一下:符号位是程序员确定的,如果是无符号数,就算SF位,如果是无符号数,就不管SF位,想让SF=1,就:MOV EAX,0x1然后SUB EAX,0x2)
- OF:溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。(MOV AL,0x7F, ADD AL,0x1)
CF与OF的区别:
进位标志CF表示无符号数运算结果是否超出范围.
溢出标志OF表示有符号数运算结果是否超出范围. - DF:方向标志DF(Direction Flag),控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。DF=1,ESI,EDI自动递减(从高地址向低地址方向处理字符串),DF=0,ESI,EDI自动递增