标志寄存器 与 对其产生影响的指令 与 跳转指令

Posted on 2022-03-30  31 Views


标志寄存器结构

标志寄存器
标志寄存器由9个标志位组成,分别为

  • 进位标志位 CF
  • 奇偶标志位 PF
  • 半进位标志位 AF
  • 零标志位 ZF
  • 符号标志位 SF
  • 陷阱标志位 TF
  • 中断允许标志位 IF
  • 方向标志位 DF
  • 溢出标志位 OF

下面将依次介绍每一个标志位的作用

进位标志位 CF 与零标志位 ZF

这两个标志位常常配合产生效果,所以这里放在一起说

CF标志位的作用

在进行无符号运算时,对于出现进位或借位,最高有效位不够的情况,使用CF标志位进行记录。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

ZF标志位的作用

用于记录相关指令执行后,其结果是否为0,如果为0,那么ZF的值为1,否则为0

对CF位与ZF位产生影响的指令

除去除法,自增,自减以外的所有算术运算指令均能对CF位产生影响
除去除法以外的所有算术运算指令均能对ZF位产生影响
比较指令CMP:

  • CF=1 最高有效位向高位有借位,即被减数 小于 减数,不够减的情况
  • CF=0 最高有效为向高位无借位,即被减数 大于等于 减数,够减的情况
  • ZF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
  • ZF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

求补码指令NGE(无论操作数为正还是负,都取反再加一):

  • CF=1  不为0的操作数求补时
  • CF=0  为0的操作数求补时
  • ZF=1 操作数为-128(字节运算)或操作数为-32768(字运算)
  • ZF=0 当求补运算的操作数不为-128(字节)或-32768(字)时

逻辑与指令AND:

  • 执行后CF、ZF标志位置零

逻辑或指令OR:

  • 执行后CF、ZF标志位置零

逻辑异或指令XOR:

  • 执行后CF、ZF标志位置零

测试指令TEST:

  • 执行后CF、ZF标志位置零

根据CF位和ZF位进行跳转的指令

  • jc/jb/jnae指令
    当有进位,即CF标志位为1则跳转

  • jnc/jnb/jae指令
    当没有进位,即CF标志位为0则跳转

  • jz/je指令
    当ZF标志位值为1时跳转

  • jnz/jne指令
    当ZF标志位值为0时跳转

  • jbe/jna指令
    当 CF=1 ZF=1时跳转

  • ja/jnbe指令
    当 CF=0 ZF=0时跳转

  • jle/jng指令
    当SF 不等于 OF ZF=1 时跳转

  • jg/jnle指令
    当SF 等于 OF ZF = 0 时跳转

奇偶标志位 PF

PF标志位用于记录相关指令执行后其结果的所有bit位中1的个数是否为偶数,如果为偶数,则PF=1,如果为奇数,则PF等于0。

对PF位产生影响的指令

算术运算指令与mov指令的影响略

逻辑与指令and / 逻辑或指令or / 逻辑异或指令xor / 测试指令test:

  • PF = 1 结果操作数中的二进制位1的个数为偶数时PF置为1
  • PF = 0 结果操作数中二进制位的1的个数为奇数时PF置为0

根据PF位跳转的指令

  • jp/jpe指令
    当 PF=1 时跳转

  • jnp/jpo指令
    当 PF=0 时跳转

符号标志位 SF

用于记录相关指令执行后其结果是否为负,如果为负 SF=1 ,否则 SF=0 。

对SF位产生影响的指令

所有运算指令均可对SF位产生影响

根据SF为跳转的指令

  • js指令
    当 SF=1 时跳转

  • jns指令
    当 SF=0 时跳转

  • jl/jnge 指令
    当 SF 不等于 OF 时跳转

  • jge/jnl 指令
    当 SF 等于 OF 时跳转

  • jle/jng指令
    当SF 不等于 OF ZF=1 时跳转

  • jg/jnle指令
    当SF 等于 OF ZF = 0 时跳转

陷阱标志位 TF

当TF位被设置为1时,CPU进入单步模式,即CPU每执行一条指令都产生一个单步中断,用于程序的调试

中断允许标志位 IF

决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。

方向标志位 DF

用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

溢出标志位 OF

有符号数溢出标志位,当进行有符号数运算时,若是产生了符号溢出,OF=1,否则OF=0

对OF位产生印象的指令

所有算术运算指令都对OF为产生影响

比较指令CMP:

  • OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
  • OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

求补指令NGE:

  • OF=1 操作数为-128(字节运算)或操作数为-32768(字运算)
  • OF=0 当求补运算的操作数不为-128(字节)或-32768(字)时

测试指令test:

  • 执行后OF位 置0

根据OF位跳转的指令

  • jo 指令
    当 OF=1 时跳转

  • jno 指令
    当 OF=0 时跳转

  • jl/jnge 指令
    当 SF 不等于 OF 时跳转

  • jge/jnl 指令
    当 SF 等于 OF 时跳转

  • jle/jng指令
    当SF 不等于 OF ZF=1 时跳转

  • jg/jnle指令
    当SF 等于 OF ZF = 0 时跳转


欢迎来到parafish的个人博客,这里是一个正在努力的ctfer

路虽远,行则必至