标志寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
如一个flag寄存器为:
0000 0206 (16进制)
拆成(2进制):
0000 0000 0000 0000 0000 0010 0000 0110
(1)CF位(第0位——Carry flag)
作用:若(无符号数)算数操作产生的结果在最高有效位发生进位或借位则将其置1,反之清零。
这个标志通常用来指示无符号整型运算的溢出状态。
运算相关的指令都会影响到标志寄存器。
例:在AL中执行加法,且超出FF。
执行前:
执行结束:
(2)PF位/奇偶校验位(第二位)
如果结果的最低有效字节包含偶数个1位则该位置1,否则清零
例: 0000 0001 0001 1000 :最低有效字节(即最后一个字节,最后8个二进制数)有2个1,是偶数个,此时PF位就是1
PF位的作用:
(3)AF位:
主要在BCD运算中
(4)ZF位(Zero flag)——使用较多
若结果为0则将其置1,反之置零。
经常与CMP或者TEST等指令一起用
例:
(1)判断两个值是否相等:
使用SUB EAX,ECX用于判断EAX和ECX的值是否相等,但是使用SUB的话,EAX的值会被改成相减的结果
可以使用CMP指令:CMP指令相当于SUB,但是相减的结果并不会保存到第一个操作数中
(2)判断某个值是否为0
如使用 AND EAX,EAX 0——>ZF=1
又或者使用TEST指令(TEST指令比较的结果并不会保存到第一个操作数中)
(5)SF位(Sign flag)
设置有符号整型的最高有效位——0表示为正,1表示为负
作用:看一个运算结束的SF位即可判断结果是正的还是负的
(6)OF位(Overflow flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出
可以理解为:
无符号数运算,是否溢出看CF位
有符号数运算,是否溢出看OF位
(7)DF位/方向位(第十位):
第10位从下标开始算:
0000 0000 0000 0000 0000 0010 0000 0110
DF位如果是0的时候,每次执行完MOVS指令后,ESI和EDI的地址都会发生变化。
当DF位是0的时候,ESI和EDI的值都会 +1或者+2或者+4(加几取决于移动了1、2、4个字节)
当DF位是1的时候,ESI和EDI的值都会 -1或者-2或者-4(加几取决于移动了-1、-2、-4个字节)
例:MOVS指令复制内容:MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
正常执行结束,ESI和EDI的值应该变成98和78