章节目录
- 简介
- ZF 标志寄存器
- PF 标志寄存器
- SF 标志寄存器
- CF 标志寄存器
- OF 标志寄存器
- 几条相关指令
- DF 标志寄存器
- PUSHF and POPF 标志寄存器
作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!
简介
8086 CPU 寄存器的结构如下如:
每个标志寄存器都有它特殊的含义,下面我们将一一介绍他们的含义及用途.
ZF
ZF 称为零标志位(Zero Flag). 它记录了相关指令执行后, 其结果是否为 0. 如果结果为 0, 则 ZF=1; 如果结果不为 0, 则 ZF = 0. 至于哪些指令的执行会影响 ZF 标记位, 则要参考该指令的说明了.
示例:
mov ax, 1sub ax, 1// 执行上述指令之后, ZF = 1mov ax, 2sub ax, 1// 执行上述指令之后, ZF = 0
PF
PF 称为奇偶标记位(Parity Flag). 它记录了执行相关指令之后, 其结果的所有 bit 中 1 的个数是否为偶数. 如果 1 的个数为偶数个, 则 PF = 1; 如果为奇数个, 则 PF = 0. (0 是偶数, 因此,如果某个指令执行之后结果为 0 且该指令会影响 PF 标志位, 此时 PF = 1),
示例:
mov al, 1add al, 10// 执行上述指令之后, 结果为 00001011B, 有三个 '1', 则 PF = 0mov al, 1add al, 11// 执行上述指令之后, 结果为 00001100B, 有四个 '1', 则 PF = 1
SF
SF 称为符号标记位(Sign Flag). 它记录了执行相关指令之后, 其结果是否为负数. 如果是负数, 则 SF = 1; 如果不为负数, 则 SF = 0.
CF
CF 称为进位寄存器(Carry Flag). 一般情况下, 在进行无符号数运算的时候, 它记录了运算结果的最高有效位向更高位的进位值, 或从更高位的借位值.
比如, 我们要计算 98H 加 98H 的两个八位数据, 计算结果为 130H. 而 120H 超过了八位寄存器所能存储的最大值, 因此会产生进位.
mov al, 98Hadd al, al // 执行上述指令之后, AL = 30H, CF = 1. add al, al // 执行这条指令之后, AL = 60H, CF = 0
同样的, 当我们要计算 98H 减去 99H 时, 就需要借位.
mov al, 98Hsub 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, 2mov bx, 1sub bx, axadc 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, 1000Hmov ax, 003EHsub bx, 2000Hsbb ax, 0020H // sbb ax, 0020H1 等价于 ax - 0020H - CF.
OF
OF 称为溢出标志位(Overflow Flag). 一般情况, OF 记录了有符号数运算结果是否发生了溢出. 如果发生溢出, 则 OF = 1; 如果没有溢出, 则 OF = 0.
mov al, 98add 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, 8mov bx, 3cmp 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…