汇编语言[王爽]-11 标志位寄存器【条件跳转】

概述

标志位寄存器有三种作用

  1. 存储相关指令的某些执行结果
  2. 为CPU执行相关指令提供行为依据
  3. 控制CPU的相关工作方式

标志位寄存器中存储的数据叫做程序状态字。含义如下:

Untitled

ZF标志:零标志位

位置:第6位

作用:查看结果是否为0

  • 结果为0: ZF=1
  • 结果为1: ZF=0

Untitled

PF标志:奇偶标志位

位置:第2位

作用:查看结果所有bit中1的个数是否为偶数

  • 1的个数为偶数: PF=1

  • 1的个数为奇数: PF=0

    Untitled

SF标志:符号标志位

位置:第7位

作用: 有符号数 ,查看结果是否为负

  • 结果为负: SF=1
  • 结果为正: SF=0

注意,运算时都是进行补码加减,一种结果可以表示有符号数和无符号数两种情况,这取决与我们如何看待,当把结果看做有符号数的时候,SF就表示其正负,否则,SF没有意义

CF标志:进位标志位

位置:第0位

作用: 无符号数 , 结果的最高位是否有进位或者借位

Untitled

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位的记录值

Untitled

可以实现大位数加法

;计算1EF000H-2010000H
mov ax,0001h
mov bx,0f00h
add bx,1000h
adc ax,0020h

sbb指令

带借位的减法指令,利用CF位的记录值

Untitled

可以实现大数减法

;计算003e1000h-00202000h
mov bx,1000h
mov ax,003eh
sub bx,2000h
sbb ax,0020h

cmp指令

cmp是比较指令,相当于减法指令,但是不保存结果,只影响标志位寄存器。

其他指令通过标志位寄存器来得知比较结果。

Untitled

注:仅仅靠 cmp ax,bx sf = 1 不能确定ax<bx,因为存在溢出情况

Untitled

用zf是否=1,来判断两数是否相等,这在任何时候都可用

检测比较结果的条件转移指令

前面学的 jcxz 就是一种条件转移指令,根据cx的值是否为0,来决定是否跳转。

除此之外,还有其他条件转移指令,不过大多根据PSW。

Untitled

例子

Untitled

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

例子

Untitled

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

Untitled

psw=xxxx 0xxx 01xx x1x1

ax=0000 0000 0100 0101b=45h

posted @ 2025-09-15 16:05  Miaops  阅读(15)  评论(0)    收藏  举报