标志寄存器的作用:
- 用来存储相关指令的某些执行结果
- 用来为CPU执行相关指令提供行为依据
- 用来控制CPU的相关工作方式
其中存储的信息通畅被称为程序状态字(PSW)
简称flag
flag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。
而flag寄存器是按位起作用的。也就是说,它的每一位都有专门的含义,记录特定的信息。
flag寄存器的结构
0 CF
2 PF
4 AF
6-11 ZF SF TF IF DF OF
//CPA ZS TI DO
11.1 6 ZF标志 (zero 否,是不是0)
如果是0 zf=1,如果不是0 zf=0
大多运算指令(算术运算,逻辑运算)都是影响标志寄存器的。大多数传送指令是不影响标志寄存器的
运算指令:add sub mul div dec inc or and
传送指令 mov push pop
11.2 2 PF 标志 (判断所有位中,1的个数是不是偶数)
如果是偶数,则PF为1,否则为0
比如
mov al,1
add al,10
结果为00001011 则pf为0
11.3 7 SF标志(是否为负)
是负 sf=1
11.4 0 CF标志(Come in进来)
CF是进位标志位。
在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位,或借位。
11.5 11 OF标志(out 溢出)
!!一定要记住CF是对无符号运算的进位或借位。而OF是看有符号运算是否溢出
11.6 adc 指令
adc是带进位加法指令
它利用了CF位上记录的进位值
指令格式: adc 操作对象1,操作对象2
功能: 操作对象1=操作对象2+操作对象1+CF
加法分两步:1.低位相加2.高位相加加上低位产生的进位
下面的指令和add ax,bx具有相同的结果
add al,bl
adc ah,bh
adc和add相配合就可以对更大的数据进行加法运算
编写一个子程序,对两个128位数据进行相加,结果存在第一个数的内存空间中
分析一个字节8位,一个字16位,所以128位数据需要8个字的空间
程序如下:
add128:push ax
push cx
push si
push di
sub ax,ax ;将cf置为0
mov cx,8
s:mov ax,[si]
adc ax,[di]
mov [si],ax
inc si
inc si
inc di
inc di
loop s
pop di
pop si
pop cx
pop ax
ret
若把加粗处改为add指令,将影响进位。inc和loop不影响cf的值。
11.7 sbb 指令
带错位减法指令,利用CF上的借位值
指令格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2-CF
比如计算 003E1000H-00202000H,程序如下
mov bx,1000h
mov ax,003eh
sub bx,2000h
sbb ax,0020h
11.8 cmp指令
cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。
同add,sub指令一样,CPU在执行cmp指令的时候,也包含两种含义,进行无符号和进行有符号数运算
当of=0时,逻辑上真正结果的正负=实际结果的正负
当of=1时,实际结果为负,逻辑上真正的结果为正;实际结果为正,逻辑上真正的结果为负。
11.9 检测比较结果的条件转移指令
转移 指的是它能够修改IP,而 条件 指的是它可以根据某种条件,决定是否修改IP
所有条件转移指令的转移位移都是[-128,127]
cmp通常和转移指令,相配合使用。
cmp分两种:
1.有符号 影响sf,of,zf
2.无符号 影响zf,cf
下面是常用的根据无符号数的比较结果进行转移的条件转移指令。
je(zf=1) jne(zf=0) jb(cf=1) jnb(cf=0) ja(cf=0且zf=0) jna(zf=1或cf=1)
e:equal 相等
n:not 不相等
b:below
a:above
这些指令可以不与cmp配合使用
11.10 DF标志和串传送指令
DF:方向标志位。在串处理中,控制每次操作后si和di的递增或递减
df=1 递减
df=0 递增
串传送指令:movsb movsw
一般和rep配合使用
cld 置零 std置1作用
正向传送:
mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb(相当于 mov es:[di],byte ptr ds:[si])
逆向传送:
mov ax,0f000h
mov ds,ax
mov si,0ffffh
mov ax,data
mov es,ax
mov di,15
mov cx,16
std
rep movsb
11.11 pushf和popf
将标志寄存器压栈和出栈。
11.12 标志寄存器在Debug中的表示
在寄存器的后面显示