版权声明:本文为 gfson
原创文章,转载请注明出处。
注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢。
11.1 概述
11.2 标志介绍
- ZF 标志
- ZF 是零标志位。
- 它记录相关指令执行以后,其结果是否为 0。
- 如果结果为 0,则 ZF = 1,如果结果不为 0,则 ZF = 0。
- PF 标志
- PF 是奇偶标志位。
- 它记录相关指令执行以后,其结果的所有 bit 位中 1 的个数是否为偶数。
- 如果 1 的个数为偶数,PF = 1,如果为奇数,那么 PF = 0。
- SF 标志
- SF 是符号标志位。
- 它记录相关指令执行以后,其结果是否为负。
- 如果结果为负,SF = 1,如果非负,那么 SF = 0。
- CF 标志
- CF 是进位标志位。
- 在进行无符号运算时,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
- 如果无符号运算产生了进位或借位,则 CF =1,反之,则 CF = 0。
- OF 标志
- OF 是溢出标志位。
- 在进行有符号运算时,它记录了运算结果是否发生了溢出。
- 如果有符号运算发生了溢出,则 OF =1,反之,则 OF = 0。
- CF 和 OF 的区别:
- CF 是对无符号运算有意义的标志位。
- OF 是对有符号运算有意义的标志位。
- CF 和 OF 所表示的进位和溢出,是分别对无符号运算和有符号运算而言的,它们之间没有任何关系。
11.3 检测点 11.1 - 11.2
- 答案:
- 答案:
11.4 adc 指令
add 和 adc 的配合,完成对较大数据的加法
11.5 sbb 指令
11.6 cmp 指令
11.7 检测比较结果的条件转移指令
11.8 检测点 11.3
- 答案:
(1)
- jb s0
- ja s0
(2)
- jna s0
- jnb s0
11.9 DF 标志和串传送指令
- DF 标志
- DF 是方向标志位。
- 在串传送指令中,控制每次操作后 si、di 的增减。
- DF = 0,每次操作后 si、di 递增。
- DF = 1,每次操作后 si、di 递减。
- 串传送指令
- movsb
- movsb 的功能是将 ds:si 指向的内存单元中的字节送入 es:di 中,然后根据标志寄存器 DF 的值,将 si 和 di 递增或递减。
- movsw
- movsw 的功能是将 ds:si 指向的内存单元中的字送入 es:di 中,然后根据标志寄存器 DF 的值,将 si 和 di 递增或递减。
-
rep 指令
- rep 的作用是根据 cx 的值,重复执行后面的串传送指令。
- 如:
rep movsb
和rep movsw
-
cld 和 std 指令
- cld 指令:将标志寄存器的 DF 位置 0。
- std 指令:将标志寄存器的 DF 位置 1。
-
pushf 和 popf 指令
- pushf:将标志寄存器的值压栈。
- popf:从栈中弹出数据,送入标志寄存器。
11.10 检测点 11.4
- 答案:(ax)=45H
11.11 标志寄存器在 debug 中表示
11.12 实验 11
- 答案:
assume cs:code
stack segment
dw 8 dup (0)
stack ends
data segment
db "Beginner's All-purpose Symbolic Instruction Code.", 0
data ends
code segment
begin: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
mov si, 0
call letterc
mov ax, 4c00h
int 21h
letterc:
push cx
push si
pushf
mov ch, 0
start: mov cl, ds:[si]
jcxz zero
cmp cl, 97
jb next
cmp cl, 122
ja next
sub cl, 20h
mov ds:[si], cl
next: inc si
jmp start
zero: popf
pop si
pop cx
ret
code ends
end begin