汇编语言笔记(三): 标志寄存器

章节目录

  1. 简介
  2. ZF 标志寄存器
  3. PF 标志寄存器
  4. SF 标志寄存器
  5. CF 标志寄存器
  6. OF 标志寄存器
  7. 几条相关指令
  8. DF 标志寄存器
  9. PUSHF and POPF 标志寄存器

作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!

简介

8086 CPU 寄存器的结构如下如:

这里写图片描述

每个标志寄存器都有它特殊的含义,下面我们将一一介绍他们的含义及用途.

ZF

ZF 称为零标志位(Zero Flag). 它记录了相关指令执行后, 其结果是否为 0. 如果结果为 0, 则 ZF=1; 如果结果不为 0, 则 ZF = 0. 至于哪些指令的执行会影响 ZF 标记位, 则要参考该指令的说明了.

示例:

  mov ax, 1
  sub ax, 1
  // 执行上述指令之后, ZF = 1

  mov ax, 2
  sub ax, 1
  // 执行上述指令之后, ZF = 0

PF

PF 称为奇偶标记位(Parity Flag). 它记录了执行相关指令之后, 其结果的所有 bit 中 1 的个数是否为偶数. 如果 1 的个数为偶数个, 则 PF = 1; 如果为奇数个, 则 PF = 0. (0 是偶数, 因此,如果某个指令执行之后结果为 0 且该指令会影响 PF 标志位, 此时 PF = 1),

示例:

  mov al, 1
  add al, 10
  // 执行上述指令之后, 结果为 00001011B, 有三个 '1', 则 PF = 0

  mov al, 1
  add al, 11
  // 执行上述指令之后, 结果为 00001100B, 有四个 '1', 则 PF = 1

SF

SF 称为符号标记位(Sign Flag). 它记录了执行相关指令之后, 其结果是否为负数. 如果是负数, 则 SF = 1; 如果不为负数, 则 SF = 0.

CF

CF 称为进位寄存器(Carry Flag). 一般情况下, 在进行无符号数运算的时候, 它记录了运算结果的最高有效位向更高位的进位值, 或从更高位的借位值.

比如, 我们要计算 98H 加 98H 的两个八位数据, 计算结果为 130H. 而 120H 超过了八位寄存器所能存储的最大值, 因此会产生进位.

  mov al, 98H
  add al, al             // 执行上述指令之后, AL = 30H, CF = 1. 
  add al, al             // 执行这条指令之后, AL = 60H, CF = 0

同样的, 当我们要计算 98H 减去 99H 时, 就需要借位.

  mov al, 98H
  sub al, 99H            // 执行这条指令之后, AL = FFH, CF = 1. 
  sub al, al             // 执行这条指令之后, AL = 00H, CF = 0.

ADC 指令

ADC 是带进位加法指令. 它利用了 CF 标志位上记录的进位值.
指令格式: adc num1, num2
功能: num1 = num1 + num2 + CF

示例:

  mov ax, 2
  mov bx, 1
  sub bx, ax
  adc ax, 1
  // 执行上述指令之后, ax = 4. 
  // adc ax, 1 等价于 ax + 1 + CF = 2 + 1 + 1 = 4.

SBB 指令

SBB 是带借位减法, 它利用了 CF 标志位上记录的借位值.
指令格式: sbb num1, num2
功能: num1 = num1 - num2 - CF

示例:

  mov bx, 1000H
  mov ax, 003EH
  sub bx, 2000H
  sbb ax, 0020H 
  // sbb ax, 0020H1 等价于 ax - 0020H - CF.

OF

OF 称为溢出标志位(Overflow Flag). 一般情况, OF 记录了有符号数运算结果是否发生了溢出. 如果发生溢出, 则 OF = 1; 如果没有溢出, 则 OF = 0.

  mov al, 98
  add al, 99
  // 执行上述指令之后, 则会发生溢出. 8 位寄存机能存储的值的范围为 -128-127. 
  // 98 + 99 = 197. 197 超出了 8 位寄存器的存储范围. 因此, CF = 0, OF = 1.  

这里注意 CF 和 OF 的区别:

CF 对无符号数运算有意义
OF 对有符号数运算有意义

几条相关指令

CMP 指令

指令格式: cmp num1, num2
功能: 计算 num1 - num2 但不保存结果. 但根据计算结果对标志寄存进行设置.

示例:

  mov ax, 8
  mov bx, 3
  cmp ax, bx
  // 执行上述指令之后, ZF = 0, PF = 1, SF = 0, CF = 0, OF = 0

常用相关指令

指令 含义 检测的标志位
JE 等于则转移 ZF=1
JNE 不等于则转移 ZF=0
JB 小于则转移 CF=1
JNB 大于等于则转移 CF=0
JA 大于则转移 CF=0 && ZF = 0
JNA 小于等于则转移 CF=1 && ZF = 1

DF

DF 称为方向标志位(Direction Flag). 在串处理指令中, 控制每次操作后 SI, DI 的增减.
DF = 0 每次操作后 SI, DI 递增
DF = 1 每次操作后 SI, DI 递减

PUSHF and POPF

PUSHF 的功能是将标志寄存器的值压栈
POPF 的功能室将标志寄存器的值出栈, 送入标志寄存器中.

欢迎交流任何想法.

End…

发布了27 篇原创文章 · 获赞 31 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zhaoruixiang1111/article/details/81041700