目录
一、标志寄存器PSW
1.ZF标志——零标志位
2.PF标志——奇偶标志位
3.SF标志——符号标志位(有符号运算)
4.CF标志——进位标志位(无符号运算)
5.OF标志——溢出标志位(有符号运算)
二、指令
1.adc指令——带进位加法指令
2.sbb指令——带借位减法指令
3.cmp指令——比较指令
(1)无符号数比较
(2)有符号数比较
4.检测比较结果的条件转移指令
(1)根据无符号数的比较结果进行转移的条件转移指令
5.DF标志和串传送指令
(1)DF标志
(2)串传送指令
6.pushf 和 popf
三、标志寄存器在Debug中的表示
标志寄存器简称flag
其他寄存器是整个起作用的,而flag寄存器是按位起作用的。
flag寄存器的结构:
ZF标志为第6位,记录相关指令(如add,sub,mul,div,inc,or,and等)执行后,结果是否为0
若为0,则zf=1;若不为0,则zf=0
PF为第二位,记录相关指令执行后,其结果的所有bit位中1的个数是否认为偶数。
若为偶数,pf=1;若为奇数,pf=0
SF为第7位,记录相关指令执行后,其结果是否为负。
若为负,sf=1;若非负,sf=0
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
OF是第11位,溢出标志位,记录了有符号数运算的结果是否发生了溢出。
如果发生了溢出,OF=1;如果没有发生溢出,OF=0
语法: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
语法:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
例:计算003E1000H-00202000H,结果放在ax,bx中
mov bx,1000H
mov ax,003EH
sub bx,2000H
sbb ax,0020H
语法:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2,但不保存结果,只设置标志寄存器
执行: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)
执行: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)
条件转移指令,指可以根据某种条件,决定是否修改IP,如jcxz
大多数条件转移指令都检测标志寄存器的相关标志位,通常和cmp相配合使用
分类:根据无符号数的比较结果进行转移的条件转移指令
根据有符号数的比较结果进行转移的条件转移指令
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
DF为第10位,方向标志位,在串处理指令中,控制每次操作后si、di的增减
若df=0,每次操作后si、di递增
若df=1,每次操作后si、di递减
如何设置df:
cld:将df设置为0
std:将df设置为1
传送一个字节: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
pushf是将标志寄存器的值压栈
popf是从栈中弹出数据,送入标志寄存器中
标志 值为1的标记 值为0的标记
of OV NV
sf NG PL
zf ZR NZ
pf PE PO
cf CY NC
df DN UP