目录:https://blog.csdn.net/qq_43098197/article/details/124532401
标志寄存器
CPU 内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下三种功能:
- 用来存储相关指令的某些执行结果。
- 用来为 CPU 执行相关指令提供行为依据。
- 用来控制 CPU 的相关工作方式。
8086CPU 的标志寄存器有 16 位,其中存储的信息通常被称为程序状态字(PSW)。
标志寄存器不同于其它寄存器有自己的整体含义,标志寄存器是按位来定义含义,即不同的位有不同的作用(含义)。
ZF 标志
- 位置:第 6 位。
- 零标志位:记录相关指令执行后,其结果是否为 0。若非 0 ,则 ZF 为 0,否则 ZF 为 1。
PF 标志
- 位置:第 2 位。
- 奇偶标志位:记录相关指令执行后,其结果的 bit 位中 1 的个数是否为偶数。若是,则 PF = 1,否则 PF = 0。
SF 标志
- 位置:第 7 位。
- 符号标志位:记录相关指令执行后,其结果是否为负数。若为负数,则 SF = 1,否则 SF = 0。
CF 标志
- 位置:第 0 位。
- 进位标志位:一般情况下,在进行无符号数运算时,它记录了运算结果的最高有效位向更高位的进位值,或从更高位借位。
OF 标志
-
位置:?
-
溢出标志位:在进行有符号数运算时,若结果超过了机器所能表示的范围称为溢出。
机器所能表示的范围:1 byte 数据范围 -128~127,2 byte 数据范围 -23768~32767。
CPU 在执行 add 等指令的时候,就包含了两种含义:无符号运算和有符号运算。
- 对于无符号,CPU 用 CF 位来记录是否产生了进位。
- 对于有符号,CPU 用 OF 位来记录是否产生了溢出。
adc 指令
-
带进位加法指令。
-
它利用了 CF 位上记录的进位值实现进位。
-
格式:
adc 操作对象 1, 操作对象 2
-
功能:
adc ax, bx ; (ax)=(ax)+(bx)+CF
sbb 指令
-
带借位减法指令。
-
它利用了 CF 位上记录的借位值实现借位。
-
格式:
sbb 操作对象 1, 操作对象 2
-
功能:
sbb ax, bx ; (ax)=(ax)-(bx)-CF
cmp 指令
- 比较指令。
- 效果和
sub
减法指令一样,只是操作过后的结果并不会记录下来,而会去改变标志寄存器中相应的标志位。 - 格式:
sbb 操作对象 1, 操作对象 2
- 功能:对两个操作数进行比较。
cmp 指令在执行时,有两种含义:无符号数比较、有符号数比较
-
无符号数比较:
ZF = 1 ; (ax) = (bx) ZF = 0 ; (ax) != (bx) CF = 1 ; (ax) < (bx) CF = 0 ; (ax) >= (bx) CF = 0 且 ZF = 0 ; (ax) > (bx) CF = 1 或 ZF = 1 ; (ax) <= (bx)
-
有符号数比较:
ZF = 1 且 OF = 0 ; (ah) < (bh) SF = 1 且 OF = 1 ; (ah) > (bh) SF = 0 且 OF = 1 ; (ah) < (bh) SF = 0 且 OF = 0 ; (ah) >= (bh)
检测比较结果的条件转移指令
jcxz 就是条件转移指令,根据检测 CX 中的数值,决定是否跳转。
常用的根据无符号数的比较结果进行转移的条件转移指令:
指令 | 转移条件 | 检测的相关标志位 |
---|---|---|
je | = = = | ZF = 1 |
jne | ≠ \neq = | ZF = 0 |
jb | < \lt < | CF = 1 |
jnb | ≥ \ge ≥ | CF = 0 |
ja | > \gt > | CF = 0 且 ZF = 0 |
jna | ≤ \le ≤ | CF = 1 或 ZF = 1 |
通常配合 cmp 指令使用,实现 if 的效果。
DF 标志和传送指令
-
位置:第 10 位。
-
方向标志位:在串处理指令中,控制每次操作后 si、di 的增减。
DF = 0,每次操作后 si、di 递增
DF = 1,每次操作后 si、di 递减
movsb
- 格式:
movsb
- 功能:将
ds:si
地址中的值(字节单位)赋值给es:di
地址中,然后根据 DF 标志位进行 si、di 增减 1 的操作。
movsw
- 格式:
movsw
- 功能:将
ds:si
地址中的值(字单位)赋值给es:di
地址中,然后根据 DF 标志位进行 si、di 增减 2 的操作。
cld 与 std
cld 指令
:将标志寄存器的 DF 位置为 0std 指令
:将标志寄存器的 DF 位置为 1
这两个指令相当于设置了数据的传输方向。
0 为正向(递增),1 为逆向(递减)。
通常配合 rep 使用
rep movsb
rep movsw
; 相当于
s: movsb
loop s
s: movsw
loop s
rep 的作用:根据 CX 的值,重复执行后面的串传送指令。