[汇编学习笔记][第十一章标志寄存器]

来源:互联网 发布:java web登录次数限制 编辑:程序博客网 时间:2024/05/16 05:24

第十一章 标志寄存器

作用

  • 存储相关指令执行结果
  • 用来为CPU执行相关指令提供行为依据
  • 用来控制CPU的相关工作方式

这种特殊寄存器在8086CPU被称为标志寄存器(flag), 8086标志寄存器有16位

其中存储程序状态字

11.1 ZF标志

  • ZF(zero flag) 在flag的第6位。

  • 它记录相关指令执行后,其结果是否为0.如果结果为0,则ZF=1,否则ZF=0

    • 要注意,在8086CPU中,有的指令影响标志寄存器,大多数是运算指令
    • mov,push,pop,对标志器基本没影响
    • 学一条指令,要关注他会对那些标志寄存器产生影响

11.2 PF标志

  • PF(Parity flag) 在flag的第2位。奇偶校验位。
  • 记录相关指令执行后,结果所有bit位中1的个数是否为偶数
    • 只判断结果的低8位

11.3 SF标志

  • PF(Sign flag) 在flag的第7位。符号标志位。
  • 记录相关指令执行后,结果是否为负
    • 对有符号数起作用

11.4 CF标志

  • CF(Carry Flag) 在flag的第0位,进位标志位。
  • 在进行无符号运算的时候它记录了运算结果的最高有效位向更高位的进位值,或最高位的借位值
    • 对无符号数起作用

11.5 OF标志

  • OF(Overflow Flag) 在flag的第7位。符号标志位。
  • 在进行有符号运算的时候,记录结果是否溢出
    • 对有符号数起作用
    • 在实际ADD中,既可以看作有符号,也可以看作无符号。CF和OF可能都为1,代表无符号的时候进位了,有符号的时候溢出了。

11.6 adc指令

  • 指令格式 adc obj1,obj2
  • 作用 obj1=obj1+obj2+CF

11.7 sbb指令

  • 指令格式 sbb obj1,obj2
  • 作用 obj1 = obj1 - obj2 - cf

11.8 cmp指令

  • 指令个事 cmp obj1,obj2
  • 作用 计算 obj1 - obj2 但不保存结果,仅仅根据结果对标志寄存器进行设置

  • 无符号的运算主要影响 cf,zf 两个标志寄存器

  • 有符号的运算还要涉及到 sf, 和 of
    • 溢出后为负数,溢出前为正数
    • 溢出后为正数,溢出前为负数

以cmp ah,bh为例

  • sf=1 , of=0 :(ah)<(bh)
  • ‘sf=1’ , of=1 :(ah)>(bh)
  • sf=0 , of=1 :(ah)<(bh)
  • sf=0 , of=0 :(ah)>=(bh)

11.9 检测比较结果的跳转指令

  • jcxz : 如果(cx)=0 则跳转

无符号

  • je : 等于则跳转,zf=1
  • jne : 不等于则跳转,zf=0
  • jb : 低于则跳转,cf=1
  • jnb : 不低于则跳转 cf=0
  • ja : 高于则跳转 cf=0zf=0
  • jna : 不高于则跳转 cf=1zf=1

e:equal,n:not,b:below,a:above

11.10 DF标志和串传送命令

  • DF(Direction Flag) 在flag的第10位。方向标志位。
  • DF=0时,si++,di++。DF=1时,si–,di–
  • movsbds:si所指的一个字节赋值给es:di

  • 实际运用

    通过 repmovsb(byte)或movsw(word)来共同使用。cx控制循环次数,DF控制串传送方向。

    • rep movsb
    • rep movsw
    • cld 使df=0 Clear Director
    • std 使df=1 Set Director

11.11 pushf和popf

  • pushf 将标志寄存器的值压栈
  • popf 从栈中弹出数据,送入标志寄存器

11.12 DEBUG中标志寄存器的表示

0 0