十一、标志寄存器:59/77
学破解的,学到上一章即可。学思想的,以下章节重在理解原理,时间紧迫的,可以不练习。学汇编的,希望好好动手操练。
1. 概述
- 8086CPU存储的标志寄存器为16位,存储的信息称为程序状态字
PSW
- 以后称标志寄存器为
flag
- 标志寄存器的每一位都有不同的含义(逻辑0和逻辑1)
- 8086CPU的
flag
结构 - 1、3、5等空位在8086中是不使用的
2. 分类
- 运算指令 (逻辑和算术)大多是影响标志寄存器的
位 | 符号 | 名 | 为1的情况 |
---|---|---|---|
6 | ZF | 零标志位 | 相关指令执行结果为0 |
2 | PF | 奇偶标志位 | 相关指令执行结果偶数 |
7 | SF | 符号标志位 | 相关指令执行结果负数 |
0 | CF | 进位标志位 | 发生借位或进位 |
11 | OF | 溢出标志位 | 发生溢出 |
10 | DF | 方向标志位 | std设置为1,cld设置为0 |
8 | TF | 单步中断标志位 | 开启单步中断 |
补充:
- 二进制奇偶: 二进制的奇偶指的是1的个数,是奇偶。比如2是偶数,但二进制位10B,所以二进制的奇偶为奇
- 有符号数与无符号数: CPU进行运算的时候,天然的能用同一个数来表示有符号数或无符号数的结果。当我们需要有符号数时,关注
SF
;如果需要无符号数,无视SF
即可。是否为有符号数是人为认定的结果- CF:
记录最高有效位向次高有效位的进位,或从更高位的借位值
位数从0开始。有个假想的更高位。这个假想的最高位就是CF
进位
是对于无符号数
而言的。溢出
是对于有符号数
而言的。比如,
0fff ffff
+0000 0000
,对于无符号数而言,正常使用,对于有符号数而言,溢出对符号位就产生了污染.
当成无符号数,看CF
即可。当成有符号数,CF
和OF
都要看
- DF标记& 串传送指令: DF= 1时,每次操作后si、di递减。DF= 0时,每次操作后si、di递增。
格式1:
movsb
功能: 以字节为单位传送
((es)*16 + (di)) <-- ((ds)*16 + (si))
当DF= 1时,每次操作后si、di递减1。
当DF= 0时,每次操作后si、di递增1。
- 传送一个字用
movsw
- 常和
rep
合用。rep movsb
的含义是:重复执行movsb
命令,次数是cx的值。- 编程:
3. Debug程序
- 这是一个Debug程序:
- 其对应的含义:
检测点 11.1 & 11.2
- 检测点 11.1
是否影响flag | 题号 | ZF | PF | SF |
---|---|---|---|---|
是 | 1 | 1 | 1 | 0 |
否 | 2 | 1 | 1 | 0 |
否 | 3 | 1 | 1 | 0 |
否 | 4 | 1 | 1 | 0 |
是 | 5 | 0 | 0 | 0 |
是 | 6 | 0 | 1 | 0 |
是 | 7 | 0 | 1 | 0 |
- 检测点 11.2
序号 | CF | OF | SF | ZF | PF |
---|---|---|---|---|---|
1 | 0 | 0 | 0 | 1 | 1 |
2 | 0 | 0 | 0 | 1 | 1 |
3 | 0 | 0 | 1 | 0 | 1 |
4 | 0 | 0 | 1 | 0 | 1 |
5 | 1 | 1 | 0 | 1 | 1 |
6 | 1 | 1 | 0 | 1 | 1 |
7 | 1 | 0 | 0 | 0 | 0 |
8 | 1 | 0 | 0 | 0 | 0 |
9 | 0 | 1 | 1 | 0 | 1 |
其中第七步,OF我认为发生了溢出,实际上没有溢出。
(al) = 1111 1100B为-4
(al) += 0000 0101B
结果为(al) = 1 0000 0001为1,符号位没有产生污染,所以没有溢出
反思: 看到7位变化了,就下意识认为发生了溢出,这样是不对的
4. adc指令 & sbb指令
adc是带进位 的加法指令,利用了CF上的值
-
adc ax, bx相当于(ax) = (ax) + (bx) + CF
-
执行adc的意义: 由设置
CF
值的指令设置。如果是sub
,它的意义就是借位。如果是add
,它的意义就是进位。 -
🌰低位相加,高位加上其进位
(ax) = 02 98H
(bx) = 03 83H
(ax) + (bx) = 06 1BH
怎么实现的呢?
mov ax, 0298H
mov bx, 0383H
add al, bl ; 此时CF的值变为1
adc ah, bh ; 现在(ax) =<