《汇编语言》第十一章 标志寄存器

CPU内部有一种特殊的寄存器,它具有3种作用:
1,用来存储相关指令的执行结果
2,用来为CPU执行相关指令提供行为依据
3,用来控制CPU的相关工作方式

8086CPU中,被称为标志寄存器(flag)。8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字 PSW,flag和其它寄存器不一样,其它寄存器用来存放数据,都是整个寄存器具有一个含义,而flag寄存器是按位起作用的,它的每一位都有专门的含义,记录特定的信息

在这里插入图片描述
flag的0,2,4,6,7,8,9,10,11位具有特殊的含义,其它位无意义

11.1 ZF 标志

flag的第6位是ZF,零标志位。它记录相关指令执行后,其结果是否为0,如果结果为0,则zf = 1,如果结果不为0,则zf = 0

计算机中,用1表示逻辑真,用0表示逻辑假,在8086CPU的指令集中,有的指令的执行影响标志寄存器,如add,mul,div,and等,它们大都是运算指令,有的指令对标志寄存器没有影响,如mov,push,pop等,它们大都是传送指令,注意一条指令执行后,执行结果是否会对标志寄存器的标志位产生影响

11.2 PF 标志

flag的第2位是PF,奇偶标志位,它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数,如果1的个数为偶数个,pf=1,如果1的个数为奇数个,则 pf=0

11.3 SF 标志

flag的第7位是SF,符号标志位。它记录相关指令执行后,其结果是否为负,如果为负,sf=1,如果非负,sf=0

计算机中通常用补码表示有符号数据,计算机中的一个数据可以看作无符号数来运算,也可以当作有符号数据运算

如:
00000001B,可看作无符号数1,或有符号数+1
10000001B,可看作无符号数129,也可看作有符号数-127

CPU在执行add等指令时,就已经包含了两种含义,也将得到用同一种信息来记录的两种结果,关键在于程序需要哪一种结果

SF标志位,就是CPU对有符号数运算结果的一种记录,它记录数据的正负,在我们将数据当作有符号数来运算时,可以通过它得知数据的正负,如果将数据当作无符号数来运算时,SF的值则没有意义,虽然相关的指令影响了它的值

11.4 CF 标志

flag的第0位是CF,进位标识符,一般情况下,在进行无符号数进位运算时,它记录了算结果的最高有效位向更高位的进位值,或从更高位的借位值

在这里插入图片描述
当两个数据相加时,可能产生从最高有效位向更高位的进位,如两个8位数据,98H+98H,其结果产生的进位值无法在8位数据中保存,CPU在运算时,并没有丢弃它,而是将其记录在flag的CF位上

mov al,98H
add,al,al

执行后,(al) =30H,CF=1,CF记录了从最高有效位向更高位的进位值

11.5 OF 标志

flag的第11位是OF,溢出标志位,一般情况下,OF记录了有符号数运算的结果是否发生了溢出,如果发生了溢出,OF=1,如果没有,OF=0

CF是对无符号数运算有意义的标志位,OF是对有符号数运算有意义的标志位,对于无符号数,CPU用cf位标记是否产生了进位,对于有符号数运算,CPU用of位来记录是否产生了溢出,且用sf位记录结果的符号

mov al,98
add al,99

add指令执行后,对于无符号数运算,98+99没有进位,cf=0,对于有符号数运算,98+99发生溢出,of=1

cf和of所表示的进位和溢出,是分别对无符号数和有符号数运算而言的,它们之间没有任何关系

11.6 adc 指令

adc是带进位加法指令,它利用了cf位上记录的进位值

格式:adc 操作对象1,操作对象2
如指令adc ax,bx实现的功能是(ax)=(ax)+(bx)+cf

mov ax,2
mov bx,1
sub bx,ax
adc ax,1

执行后,(ax)=4,adc执行时,相当于计算:(ax)+1+cf = 2+1+1

对于cf来说,如果cf的值是被sub指令设置的,那么它的含义就是借位值,如果是被add指令设置的,那么它的含义就是进位值

加法运算可以分两步进行:
1,低位相加
2,高位相加再加上低位相加产生的进位值

CPU提供adc指令的目的,就是进行加法指令的第二步运算的,adc指令和add指令相配合就可以对更大的数据进行加法运算

考虑计算1EF000H + 201000H,将结果放在ax(高16位)和bx(低16位)中

由于两个数据的位数都大于16,用add指令无法进行计算,我们将计算分为两步,先将低16位相加,然后将高16位和进位值相加

mov ax,001EH
mov bx,0F00H
add bx,1000H
adc ax,0020H

adc指令执行后,也可能产生进位值,所以也会对cf位进行设置,有这样的功能,就可以对任意大的数据进行加法运算

11.7 sbb 指令

sbb是带借位减法指令,它利用了CF位上记录的借位值

格式: sbb 操作对象1,操作对象2
如sbb ax,bx实现的功能:(ax) = (ax) - (bx) - CF

考虑计算003E1000H - 00202000H,结果放在ax,bx中

 mov bx,1000H
mov ax,003EH
sub bx,2000H
sbb ax,0020H

11.8 cmp 指令

cmp是比较指令,cmp的功能相当于减法指令,指示不保存结果,cmp指令执行后,将对标志寄存器产生影响,其它相关指令通过识别这些被影响的标志寄存器位来得知比较结果

格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2但不保存结果,仅根据计算结果对标志寄存器进行设置

如:
cmp ax,ax,做(ax) - (ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关位,指令执行后,zf=1,pf=1,sf=0,cf=0,of=0

cmp指令的设置思路:通过做减法运算,影响标志寄存器,标志寄存器的相关位记录了比较的结果

同add,sub指令一样,CPU在执行cmp指令时,也包含两种含义:进行无符号数运算和有符号数运算

cmp指令追求逻辑上的结果的正负,由此来得到两个操作对象的比较信息,所以cmp指令的比较结果,不是仅靠sf就能记录下来的,sf只能记录实际结果的正负

通过sf和of的值来判断比较的结果

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

转移 指能够修改IP,条件 指它可以根据某种条件,决定是否修改IP

jcxz就是一个条件转移指令,它可以检测cx中的数值,如果(cx) = 0,就修改IP,否则什么也不做,所有条件转移指令的转移位移都是[-128,127]

除了jcxz之外,CPU还提供了其它条件转移指令,大多数条件转移指令都是检测标志寄存器的相关标志位,根据检测的结果来决定是否修改IP,这些条件通常和cmp配合使用,就好像call和ret配合使用一样

常用根据无符号数的比较结果进行转移的条件转移指令:

je	等于则转移	zf=1
jne	不等于则转移	zf=0
jb	低于则转移	cf=1
jnb	不低于则转移 cf=0
ja	高于则转移	cf=0且zf=0
jna	不高于则转移	cf=1或zf=1

虽然je的逻辑含义是 相等则转移,但它进行的操作是 zf=1 时则转移,相等则转移这种逻辑含义,是通过和cmp指令配合使用来体现的,因为cmp指令为 zf=1 赋予了 两数相等 的含义
je检测的是zf位置,不管je前面是什么指令,只要CPU执行je指令时,zf=1,那么就会发生转移

11.10 DF标志和串传送指令

flag的第10位是DF,方向标志位,在串处理指令中,控制每次操作后si,di的增减

df = 0,每次操作后si,di递增
df = 1,每次操作后si,di递减

串传送指令 movsb
功能:将ds:si所指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增或递减

字传送指令 movsw
功能:将ds:si指向的内存单元中的字送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2

movsb和movsw进行的是串传送操作中的一个步骤,一般来说,movsb和movsw都和rep配合使用
格式: rep movsb
即:

s:movsb
  loop s

rep的作用就是根据cx的值,重复执行后面的串传送指令,每执行一次movsb指令si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(cx)个字符的传送

由于flag的df位决定串传送指令执行后,si和di改变的方向,所以CPU应该提供相应的指令来对df位进行设置,使程序员能够决定传送的方向
8086CPU提供两条指令对df位进行设置:
cld指令:将标志寄存器的df位设置为0
std指令:将标志寄存器的df位设置为1

11.11 pushf 和 popf

pushf 的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中

pushf和popf为直接访问标志寄存器提供了一种方法

11.12 标志寄存器在debug中的表示

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值