目录
一、标志寄存器PSW
标志寄存器简称flag
其他寄存器是整个起作用的,而flag寄存器是按位起作用的。
flag寄存器的结构:
1.ZF标志——零标志位
ZF标志为第6位,记录相关指令(如add,sub,mul,div,inc,or,and等)执行后,结果是否为0
若为0,则zf=1;若不为0,则zf=0
2.PF标志——奇偶标志位
PF为第二位,记录相关指令执行后,其结果的所有bit位中1的个数是否认为偶数。
若为偶数,pf=1;若为奇数,pf=0
3.SF标志——符号标志位(有符号运算)
SF为第7位,记录相关指令执行后,其结果是否为负。
若为负,sf=1;若非负,sf=0
4.CF标志——进位标志位(无符号运算)
CF为第0位,记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值
例:
(1)进位
mov al,98h
add al,al ;执行后,(al)=30h,CF=1
add al,al ;执行后,(al)=60h,CF=0
(2)借位
mov al,97h
mov al,98h ;执行后,(al)=FFH,CF=1
sub al,al ;执行后,(al)=0,CF=0
5.OF标志——溢出标志位(有符号运算)
OF是第11位,溢出标志位,记录了有符号数运算的结果是否发生了溢出。
如果发生了溢出,OF=1;如果没有发生溢出,OF=0
二、指令
1.adc指令——带进位加法指令
语法:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
例:adc ax,bx 实现的功能是 (ax)=(ax)+(bx)+CF
用途:对很大的数据进行运算
(1)计算1EF000H+201000H,结果放在ax(高16位中)和bx(低16位中)
mov ax,001EH
mov bx,0F000H
add ax,bx
adc ax 0020H
(2)计算1EF0001000H+2010001EF0H,结果放在ax(最高16位),bx(次高16位),cx(低16位)中
mov ax,001EH
mov bx,0F000H
mov cx,1000H
add cx,1EF0H
adc bx,1000H
adc ax,0020H
2.sbb指令——带借位减法指令
语法:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
例:计算003E1000H-00202000H,结果放在ax,bx中
mov bx,1000H
mov ax,003EH
sub bx,2000H
sbb ax,0020H
3.cmp指令——比较指令
语法:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2,但不保存结果,只设置标志寄存器
(1)无符号数比较
执行:cmp ax,bx
若:
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)
(2)有符号数比较
执行:cmp ah,bh
若:
若sf=1,of=0,则(ah)<(bh)
若sf=1,of=1,则(ah)>(bh)
若sf=0,of=1,则(ah)<(bh)
若sf=0,of=0,则(ah)>=(bh)
4.检测比较结果的条件转移指令
条件转移指令,指可以根据某种条件,决定是否修改IP,如jcxz
大多数条件转移指令都检测标志寄存器的相关标志位,通常和cmp相配合使用
分类:根据无符号数的比较结果进行转移的条件转移指令
根据有符号数的比较结果进行转移的条件转移指令
(1)根据无符号数的比较结果进行转移的条件转移指令
je 等于则转移 zf=1
jne 不等于则转移 zf=0
jb 低于则转移 cf=1
jnb 不低于则转移 cf=0
ja 高于则转移 cf=0且zf=0
jna 不高于则转移 cf=1或zf=1
例:
(1)编程实现:若(ah)=(bh),则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)
cmp ah,bh
je s
add ah bh
jmp short ok
s: add ah,ah
ok: ...
(2)编程实现:统计data段中数值为8的字节的个数,用ax保存统计结果
mov ax,data
mov ds,ax
mov bx,0
mov ax,0
mov cx,8
s: cmp byte ptr [bx],8
jne next
inc ax
next: inc bx
loop s
5.DF标志和串传送指令
(1)DF标志
DF为第10位,方向标志位,在串处理指令中,控制每次操作后si、di的增减
若df=0,每次操作后si、di递增
若df=1,每次操作后si、di递减
如何设置df:
cld:将df设置为0
std:将df设置为1
(2)串传送指令
传送一个字节:movsb
功能:
相当于以下操作:
mov es:[di],byte ptr ds:[si]
如果 df=0
inc si
inc di
如果df=1
dec si
dec di
传送一个字:movsw
一般来说,movsb和movsw都和rep配合使用:
rep movsb
相当于:
s: movsb
loop s
例:
用串传送指令,将data段中的第一个字符串复制到它后面的空间中
data segment
db 'Welcome to masm!'
db 16 dup (0)
data ends
复制的代码如下:
mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb
6.pushf 和 popf
pushf是将标志寄存器的值压栈
popf是从栈中弹出数据,送入标志寄存器中
三、标志寄存器在Debug中的表示
标志 值为1的标记 值为0的标记
of OV NV
sf NG PL
zf ZR NZ
pf PE PO
cf CY NC
df DN UP