标志寄存器一共16位,一共只有0,2,4,6,7,8,9,10,11位有意义
分别是CF(carry),PF(parity),AF,ZF(zero),SF(sign),TF(中断的单步执行标志,不进行详细介绍),IF(屏蔽外中断标志,不进行详细介绍),DF(direction),OF(overflow)
补充:9个有效标志位中,有3个是控制标志位(DF,IF,TF),6个记录位。
1.ZF位
零标志位,记录上一次运算相关指令执行结束后,其结果是否为0
ZF = 0:上一次运算指令执行结果不为0
ZF = 1:上一次运算指令执行结果位0
2.PF标志位
奇偶标志位,记录相关指令执行后其结果的所有bit位中,1的个数为奇数还是偶数
PF = 0:1的个数为奇数
PF = 1:1的个数为偶数
3.SF标志位
符号标识位,记录相关指令执行以后,其结果是否为负数
SF = 0:结果为非负数
SF = 1:结果为负数
注意:SF寄存器只在有符号数计算中有意义,若CPU进行的是无符号计算,则虽然SF的值也会受到影响,但是其值并没有意义
4.CF标志位
进位(借位)标志位,记录相关指令执行以后,其结果(无符号数)是否进位
CF = 0:结果没有进位(借位)
CF = 1:结果存在进位(借位)
注意:CF寄存器针对于的是无符号数的进位
5.OF标志位
溢出符号位,记录相关指令执行以后,其结果(有符号数)是否溢出
OF = 0:没有发生溢出
OF = 1:发生了溢出
注意:OF溢出是指的有符号数的溢出,而CF指的是无符号数的进位,两者之间相互独立, 没有关系
以上标志寄存器衍生指令:
- ADC指令:执行加法的时候加上CF的值;
所以可以利用add,adc指令执行高位数据的加法 - SBB指令: 执行减法时减去CF(带借位的减法指令)
- CMP指令:cmp 1,2 代表的是执行1-2的运算,但是并不保存结果值,只根据结果调整标志位的值。cmp指令伴随条件跳转指令一同使用,可以达到跳转的效果
cmp指令修改标志寄存器的值,搭配条件跳转指令(je,jne,jb,jnb,ja,jna等)根据cmp修改的标志寄存器CF和ZF的值决定是否跳转
6.DF标志位
方向标志位,用于串传送指令中,作用于SI和DI寄存器
DF = 0:SI和DI加一
DF =1:SI和DI减一
注意:修改DF的指令为:cld(将DF置0,用于递加);std(将DF置1,用于递减)
以上两个指令要配合movsb(movsw)指令使用达到串传送效果
- movsb指令是将DS:SI位置处的字节信息传送到ES:DI位置中去,然后再根据DF寄存器的值,对SI和DI进行修改(movsw功能几乎相同,只不过是以字为单位进行传送)
- rep movsb指令,相当于
S: movsb
loop
根据CX的值,重复执行串传送指令
示例代码:
题目:利用串传递指令,将F000H段中的最后16个字符复制到data段中。
assume cs:code, ds:data
data segment
db 16 dup (0)
data ends
code segment
start:
mov ax,0F000H
mov ds,ax
mov si,0FFFFH ;段的最后一个字节
mov ax,data
mov es,ax
mov di,15
mov cx,16
std ;设置DI,SI逆向传输数据
rep movsb
mov ax,4c00H
int 21H
code ends
start end
7.标志寄存器的压栈和出栈:PUSHF和POPF
- 将标志寄存器(16位)压栈PUSHF
- 将标志寄存器出栈POPF
以上两个指令提供了一种直接访问(修改)标志寄存器的方法
实验说明:
将数据段中以0结尾的字符串的所有小写字母变为大写字母
注意!进行转化的是小写字母,而不是其他字符
参考程序:
assume cs:code
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
code segment
start: mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00H
int 21H
letterc: mov cl,ds:[si]
mov ch,0
jcxz done ; 判断取到的字符是否为0
cmp cl,97
jb next ; 小于97则跳转
cmp cl,122
ja next ; 大于122则跳转
and cl,11011111b
mov ds:[si],cl
next: inc si
loop letterc
done: ret
code ends
end start
实验结果:
实验总结:
(1)注意灵活运用条件跳转指令,找出那些小写字母
(2)小写字母转换为大写字母可以and一个二进制数11101111(其ASCii码只在第五位有差别)