汇编语言[王爽]-11 标志位寄存器【条件跳转】
概述
标志位寄存器有三种作用
- 存储相关指令的某些执行结果
- 为CPU执行相关指令提供行为依据
- 控制CPU的相关工作方式
标志位寄存器中存储的数据叫做程序状态字。含义如下:
ZF标志:零标志位
位置:第6位
作用:查看结果是否为0
- 结果为0:
ZF=1
- 结果为1:
ZF=0
PF标志:奇偶标志位
位置:第2位
作用:查看结果所有bit中1的个数是否为偶数
-
1的个数为偶数:
PF=1
-
1的个数为奇数:
PF=0
SF标志:符号标志位
位置:第7位
作用: 有符号数 ,查看结果是否为负
- 结果为负:
SF=1
- 结果为正:
SF=0
注意,运算时都是进行补码加减,一种结果可以表示有符号数和无符号数两种情况,这取决与我们如何看待,当把结果看做有符号数的时候,SF就表示其正负,否则,SF没有意义
CF标志:进位标志位
位置:第0位
作用: 无符号数 , 结果的最高位是否有进位或者借位
mov al,98h
add al,al ;执行后,(al)=30h, CF=1, CF记录了最高有效位向更高位的进位值
mov al,97h
sub al,98h ;执行后,(al)=FFh, CF=1,CF记录了向更高位的进位值
OF标志:溢出标志位
位置:第11位
作用: 有符号数 , 结果是否溢出
- 发生溢出:
OF=1
- 没有发生溢出:
OF=0
mov al,0F0h
mov al,88h
;执行后,CF=1,OF=1。对于无符号数来说,有进位;对于有符号数来说,溢出
mov al,0F0h
mov al,78h
;执行后,CF=1,OF=0。对于无符号数来说,有进位;对于无符号数来说,无溢出
abc指令
带进位的加法指令,利用CF位的记录值
可以实现大位数加法
;计算1EF000H-2010000H
mov ax,0001h
mov bx,0f00h
add bx,1000h
adc ax,0020h
sbb指令
带借位的减法指令,利用CF位的记录值
可以实现大数减法
;计算003e1000h-00202000h
mov bx,1000h
mov ax,003eh
sub bx,2000h
sbb ax,0020h
cmp指令
cmp是比较指令,相当于减法指令,但是不保存结果,只影响标志位寄存器。
其他指令通过标志位寄存器来得知比较结果。
注:仅仅靠 cmp ax,bx sf = 1 不能确定ax<bx,因为存在溢出情况
用zf是否=1,来判断两数是否相等,这在任何时候都可用
检测比较结果的条件转移指令
前面学的 jcxz
就是一种条件转移指令,根据cx的值是否为0,来决定是否跳转。
除此之外,还有其他条件转移指令,不过大多根据PSW。
例子
DF标志和串传送指令
DF标志:方向标志位
位置:第10位
作用:在串处理指令中,控制每次操作后si,di的增减
df=0
:每次操作后,si,di递增df=1
:每次操作后,si,di递减
串操作指令:
格式: movsb
功能:等价于下面的代码
mov es:[di],byte ptr ds:[si] ;描述
如果df=0
inc si
inc di
如果df=1
dec si
dec di
格式: mpvsw
功能:等价于下面的代码
mov es:[di],word ptr ds:[si] ;描述
如果df=0
add si,2
add di,2
如果df=1
sub si,2
sub di,2
movsb和movsw进行的是串操作的一个步骤,一般和rep指令配合使用。
格式: rep movsb
功能:等价于下面的代码
s:movsb
loop s
可见,rep 的作用是根据cx 的值,重复执行后面的串传送指令。由于每执行一次movsb指令si和 di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(cx)个字符的传送。
cld
指令:将标志寄存器的df位置0
std
指令:将标志寄存器的df位置1
例子
pushf和popf
pushf
:将标志寄存器的值压栈,
popf
:从栈中弹出数据,送入标志寄存器中。
pushf和 popf,为直接访问标志寄存器提供了一种方法。
下面的程序,(ax)=?
mov ax,0
push ax
popf
mov ax,0fff0h
add ax,0010h
pushf
pop ax
and al,11000101b
and ah,00001000b
psw=xxxx 0xxx 01xx x1x1
ax=0000 0000 0100 0101b=45h