zoukankan      html  css  js  c++  java
  • 11.标志寄存器

    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,为直接访问标志寄存器提供了一种方法。
    23.标志寄存器在Debug中的表示
  • 相关阅读:
    蓝牙4.0BLE cc2540 cc2541 ios OAD课程(空中固件升级)[原版的,多图]
    ASP.NET文件上传和下载
    onethink和phpwind共享
    折返(Reentrancy)VS线程安全(Thread safety)
    使用更清晰DebugLog开发和调试工具
    MySql分析算法作品索引(马上,只是说说而已B-tree)
    使用shell命令分析统计日志
    刷牙LeetCode思考
    Cocos3d-x 发布第一版
    SSH连接Linux的Server超时
  • 原文地址:https://www.cnblogs.com/zxj159/p/2856538.html
Copyright © 2011-2022 走看看