首页 > 代码库 > 标志寄存器(学习汇编)

标志寄存器(学习汇编)

1514131211109876543210
 NTIOPLOFDFIFTFSFZF AF PF CF

使



I/O
权限
标志
占2位




















使




使




使



1.CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都有可能不同)具有以下3种作用。
  (1)用来存储相关指令的某些执行结果;
  (2)用来为CPU执行相关指令提供行为依据;
  (3)用来控制CPU的相关工作方式。
  这种特殊的寄存器在8086CPU中,被称为标志寄存器.本章中的标志寄存器(以下简称flag)使我们学习的最后一个寄存器.
 
2.flag寄存器是按位起作用的,也就是说,它的每一个位都有专门的含义,记录特定的信息.
 
3.flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义;0、2、4、6、7、8、9、10、11位都具有特殊的含义。
 
4.flat的第6位是ZF,零标志位。它记录相关指令执行后,结果是否为0.如果结果为0,那么ZF=1;如果结果不为0,那么ZF=0.
  比如,指令:
  mov ax,1
  sub ax,1
  执行后,结果为0,则ZF=1
  mov ax,2
  sub ax,1
  执行后,结果不为0,则ZF=0
 
5.8086CPU指令集中,大多数的运算指令(进行逻辑或算术运算)会影响标志寄存器,而大多数的传送指令则不会影响标志寄存器。
 
6.flag的第2位是PF,奇偶标志位。他记录指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,则PF=1,反之PF=0.
  比如,指令:
  mov al,1
  add al,10
  执行后,结果为00001011B,其中有3(奇数)个1,则PF=0;
  mov al,1
  or al,2
  执行后,结果为00000011B,其中有2(偶数)个1,则PF=1;
  sub al,al
  执行后,结果为00000000B,其中有0(偶数)个1,则PF=1
 
7.flag的第7位是SF,符号标志位。它记录相关指令执行后,其结果是否为负,如果为负,SF=1;如果非负,SF=0;
 
8.计算机中的一个数据可以看作是有符号数,也可以看作是无符号数。
 
9.SF标志,就是CPU对有符号数运算结果的一种记录,他记录数据的正负。
 
10.CPU字执行add等指令时,是必然影响到SF标志位的值。
 
11.flag的第0位是CF,进位标志位。一般情况下,在进行无符号运算时,他记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
   比如,指令:
   mov al,98H
   add al,al ;执行后:(al)=30H,CF=1 CF记录了从最高有效位行更高位的进位值
   add al,al ;执行后:(al)=60H,CF=0 CF记录了从最高有效位行更高位的进位值
   
   mov al,97H
   sub,al,98H ;执行后:(al)=FFH,CF=1 CF记录了从最高位向更高位的借位值
   sub al,al  ;执行后:(al)=0,CF=0 CF记录了从最高位向更高位的借位值
 
12.在进行有符号运算的时候,如果超过了机器所能表示的范围称为溢出。
 
13.flag的第11位是OF,溢出标志位。一般情况下,OF记录了有符号数运算结果是否发生了溢出。如果发生了溢出,OF=1;反之,OF=0。
 
14.注意CF和OF的区别:CF是针对无符号数运算有意义的标志,而OF是针对有符号数运算有意义的标志。
 
15.adc是带进位加法指令,它利用CF位上记录的进位值。
   指令格式:adc 操作对象1,操作对象2
   功能:操作对象1=操作对象1+操作对象2+CF
   比如指令 adc ax,bx 实现的功能是:(ax)=(ax)+(bx)+CF
 
16.adc所使用的进位值受上一条指令影响,可利用adc执行对任意大数据的加法(通过循环),但注意循环内部不要影响到CF.
 
17.sbb是带借位减法指令,它利用CF位上记录的借位值
   指令格式:sbb 操作对象1,操作对象2
   功能:操作对象1=操作对象1-操作对象2-CF
   比如指令 adc ax,bx 实现的功能是:(ax)=(ax)-(bx)-CF
 
18.cmp是比较指令,功能相当于减法指令,只是不保存结果,但影响flag各个位,其他指令通过识别这些标志位来得知比较结果。
   指令格式:cmp 操作对象1,操作对象2
   功能:计算操作对象1-操作对象2,但并不保存结果,仅仅根据结果对标志位寄存器进行设置。
   比如:指令 cpp ax,ax,做(ax)-(ax)的运算,结果为0,但并不保存到ax中,进影响flag相关各位。指令执行后:ZF=1,PF=1,SF=0,CF=0,OF=0.
 
19.如果因为溢出导致实际结果为负,那么逻辑上真正的结果必然为正。
 
20.flah的第10位是DF,方向标志位.在串处理指令中,控制酶促操作后si,di上网增减.
   df=0 每次操作后si、di递增
   df=1 每次操作后si、di递减
   格式:movsb
   功能:执行movsb指令相当于进行下面几部操作
   (1)((es)*16+(di))=((ds)*16)+(si))
   (2)如果df=0 则:    (si)=(si)+1
                      (di)=(di)+1
      如果df=1 则:    (si)=(si)-1
                      (di)=(di)-1
  例如,用串传送指令进行数据传送。
assume CS:code
data SEGMENT
     DB ‘Welcome to masn!‘
     DB 16 dup (0)
data ENDS
code SEGMENT
   s:MOV AX,data
     MOV DS,AX
     MOV SI,0        ;ds:si指向data:0
     MOV ES,AX
     MOV DI,16       ;es:di指向data:0010
     MOV CX,16       ;(cx)=16,rep循环16次
     CLD             ;设置df=0,正向传送
     REP MOVSB
     MOV AX,4c00h
     INT 21
code ENDS
END  s
 
21.pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中。
 
22.pushf和popf,为直接访问标志寄存器提供了一种方法。