flag

  • flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。
  • 而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。

image.png
image.png

ZF标志

  • 在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或算术运算);
  • mov、push、pop等,它们都是传送指令,不会对标志寄存器有影响。

    PF标志

  • flag的第二位是PF,奇偶标志位。它记录指令执行后,结果所有二进制位中1的个数:

    • 偶数:PF=1
    • 奇数:PF=0

      SF标志

  • flag的第7位是SF,符号标志位。

    • 负:SF=1
    • 正:SF=0

      CF标志

  • flag的第0位是CF,进位标志位

  • 一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的错位值。
  • 对于位数位N的无符号数来说,其对应的二进制信息的最高位,即第N-1位的最高有效位,而假想存在的第N位,就是相对于最高有效位的更高位。

    OF标志

  • 如果结果超过了机器所能表示的范围成为溢出。

  • 如果在进行有符号数运算时发生一处,那么运算结果将不正确。
  • CF与OF的区别:

    • CF是对于无符号运算数有意义的标志位
    • OF是对于有符号运算数有意义的标志位

      adc指令

  • adc是带进位加法指令,他利用类CF位上记录的进位值。

  • 计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位)中

    1. mov ax,001eh
    2. mov bx,0f00h
    3. add bx,1000h
    4. adc ax,0020h

    sbb指令

  • sbb是借位减法指令,它利用了CF位上记录的错位值。

    cmp指令

  • cmp是比较指令,功能相当于减法指令,只是不保存结果。

  • cmp指令执行后,对标志寄存器产生影响。
  • 比如:cmp ax,ax
    • 结果为0,但并不在ax中保存,仅影响flag的相关位

image.png

条件转移指令

  • 无符号
  • je 等于则转移 ZF=1
  • jne 不等于则转移 ZF=0
  • jb 低于则转移 CF=1
  • jnb 不低于则转移 CF=0
  • ja 高于则转移 CF=0,ZF=0
  • jna 不高于则转移 CF=1或ZF=1
  • 如果(ah)=(bh)则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)

    1. cmp ah,bh
    2. je s
    3. add ah,bh
    4. jmp short ok
    5. s: add ah,ah
    6. ok: ret

    DF标志和串传送指令

  • flag的第10位是DF,方向标志位。

  • 在串处理指令中,控制每次操作后si,di的增减
  • DF=0:每次操作后si,di递增
  • DF=1:每次操作后si,di递减
  • movsb
    • ((es)16+(di))=((ds)16+(si))
      • DF=0:(si)=(si)+1 (di)=(di)+1
      • DF=1:(si)=(si)-1 (di)=(di)-1
  • movsb和movsw一般配合rep使用
    • rep movsb:rep的作用是根据cx的值,重复执行后面的串传送指令。
  • 8086CPU提供了两条指令对DF位进行设置:
    • cld:将标志寄存器的DF位置0
    • std:将标志寄存器的DF位置1
  • 将data段中的第一个字符串复制到他后面的空间中

    1. data segment
    2. db 'Welcome to tong!'
    3. db 16 dup (0)
    4. data ends
    5. code segment
    6. start:
    7. mov ax,data
    8. mov ds,ax
    9. mov es,ax
    10. xor si,si
    11. mov di,16d
    12. xor bx,bx
    13. mov cx,16d
    14. cld
    15. rep movsb
    16. mov ax,4c00H
    17. int 21H
    18. code ends
    19. end start

    pushf和popf

  • pushf:将标志寄存器的值压入栈

  • popf:将标志寄存器的值弹出,送入标志寄存器中。
  • pushf和popf,为直接访问标志寄存器提供了一种方法