C++ 逆向辅助学习----汇编基础 标志寄存器 6

61 篇文章 2 订阅
17 篇文章 2 订阅

标志寄存器
     1. ZF标志
       (1)flag的第6位是ZF,零标志位。
           它记录相关指令执行后,
            结果为0 , ZF = 1
            结果不为0,ZF = 0
                
           比如:
             mov ax,1
             sub ax,1  
           指令执行后,结果为0,则ZF = 1。
                mov ax,2
             sub ax,1  
           指令执行后,结果为1,则ZF = 0。

      (2)对于ZF的值,我们可以这样来看,ZF标记相关指令的计算结果是否为0,
        如果为0,则在ZF要记录下“是0”这样的肯定信息。
        
        - 在计算机中1 表示逻辑真,表示肯定,所以当结果为0的时候 ZF=1,
           表示“结果是0 ”。如果结果不为0,则ZF要记录下“不是0”这样的否定信息。
           
        - 在计算机中0表示逻辑假,表示否定,所以当结果不为0 的时候ZF=0,表示“结果不是0”。
       
        示例
           指令:mov ax,1
                     and ax,0
           执行后,结果为0,则ZF=1,表示“结果是0”。
           指令:mov ax,1
                     or ax,0
           执行后,结果不为0,则ZF=0,表示“结果非0”。

       
           注意:
           在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,
           比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令
           (进行逻辑或算术运算);
           
           有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。

          我们在使用一条指令的时候,要注意这条指令的全部功能,其中包括,
          执行结果对标记寄存器的哪些标志位造成影响。

       
       2.PF标志
         flag的第2位是PF,奇偶标志位。
           它记录指令执行后,结果的所有二进制位中1的个数:
                为偶数,PF = 1;
                为奇数,PF = 0。
       
           示例
            指令:mov al,1
                        add al,10
               执行后,结果为00001011B,其中有3(奇数)个1,则PF=0;
            指令:mov al,1
                         or al,10
               执行后,结果为00000011B,其中有2(偶数)个1,则PF=1;

       
       
       3.SF标志
          (1)flag的第7位是SF,符号标志位。
                   它记录指令执行后,
                结果为负,SF = 1;
                结果为正,SF = 0。
              
          (2)我们知道计算机中通常用补码来表示有符号数据。
             计算机中的一个数据可以看作是有符号数,也可以看成是无符号数。
                比如:
                00000001B ,可以看作为无符号数 1 ,或有符号数+1;
                10000001B ,可以看作为无符号数129,也可以看作有符号数-127。

              这也就是说,对于同一个二进制数据,计算机可以将它当作无符号数据来运算,
              也可以当作有符号数据来运算。

           (3)不管我们如何看待,CPU 在执行add等指令的时候,就已经包含了两种含义,
              也将得到用同一种信息来记录的两种结果。
              
                关键在于我们的程序需要哪一种结果
       
           (4)SF 标志,就是CPU对有符号数运算结果的一种记录 ,它记录数据的正负。
                - 在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。
       
                - 如果我们将数据当作无符号数来运算,SF的值则没有意义,
                   虽然相关的指令影响了它的值。

                - 这也就是说,CPU在执行 add 等指令时,是必然要影响到SF标志位的值的。
                
                    至于我们需不需要这种影响,那就看我们如何看待指令所进行的运算了。
       
            (5)某此指令将影响标志寄存器中的多个标志位,这些被影响的标记位比较
               全面地记录了指令的执行结果,为相关的处理提供了所需的依据。
       
       
                检测点11.1
                sub al,al    al=0h  ZF=1   PF=1  SF=0
                mov al,1     al=1h  ZF=1   PF=1  SF=0
                push ax      al=1h  ZF=1   PF=1  SF=0
                pop  bx      ax=1h  ZF=1   PF=1  SF=0
                add al,bl    al=2h  ZF=0   PF=0  SF=0
                add al,10    al=12h ZF=0   PF=1  SF=0
                mul al       ax=144h ZF=0  PF=1  SF=0            
            
            
            
        4.CF标志
           (1)flag的第0位是CF,进位标志位。
             一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的
              进位值,或从更高位的借位值。
        
           (2)对于位数为N的无符号数来说,其对应的二进制信息的最高位,即第N-1位,
              的最高有效位,而假想存在的第N位,就是相对于最高有效位的更高位。
 
           (3) 我们知道,当两个数据相加的时候,有可能产生从最高有效位向更高位的进位。
                比如,两个8 位数据:98H+98H,将产生进位。
                  由于这个进位值在8位数中无法保存,我们在前面的课程中,就只是简
                  单地说这个进位值丢失了。

               其实CPU在运算的时候,并不丢弃这个进位值,而是记录在
               一个特殊的寄存器的某一位上。
               8086CPU 就用flag的CF位来记录这个进位值。
 
              比如,下面的指令:
                   mov al,98H
                   add al,al  ;执行后: (al)=30H,CF=1,
                                  ;CF记录了最高有效位向更高位的进位值
            
           (4)而当两个数据做减法的时候,有可能向更高位借位。
                比如,两个 8 位数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。
                   而flag的CF位也可以用来记录这个借位值
            
            
        5.OF标志
            如果运算结果超出了机器所能表达的范围,将产生溢出。
            注意,这里所讲的溢出,只是对有符号数运算而言。
            
            
            由于在进行有符号数运算时,可能发生溢出而造成结果的错误。
               则CPU需要对指令执行后是否产生溢出进行记录。
            flag的第11位是OF,溢出标志位。
            
            
            一般情况下,OF记录了有符号数运算的结果是否发生了溢出。
            如果发生溢出,OF=1,
            如果没有,    OF=0。

            
            一定要注意CF和OF的区别:
               CF是对无符号数运算有意义的标志位;
               而OF是对有符号数运算有意义的标志位
            
             比如:
                     mov al,98  
                     add al,99
                   add指令执行后:CF=0,OF=1。
                前面我们讲过,CPU在执行add等指令的时候,就包含了两种含义:
                无符号数运算和有符号数运算。

             - 对于无符号数运算,CPU用CF位来记录是否产生了进位;
            
             - 对于有符号数运算,CPU 用 OF 位来记录是否产生了溢出,
                当然,还要用SF位来记录结果的符号。
       
               我们可以看出,CF 和OF 所表示的进位和溢出,是分别对无符号数和
               有符号数运算而言的,它们之间没有任何关系。
       
       
       
      6.cmp指令
         (1)cmp 是比较指令,功能相当于减法指令,只是不保存结果。
        
            cmp 指令执行后,将对标志寄存器产生影响。
            其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

         (2)cmp指令
            格式:cmp 操作对象1,操作对象2
            功能:计算操作对象1–操作对象2 但并不保存结果,
            仅仅根据计算结果对标志寄存器进行设置。
       
           做(ax)–(ax)的运算,结果为0,但并不在ax中保存,
           仅影响flag的相关各位。
               指令执行后:
                  ZF=1,
                  PF=1,
                  SF=0,
                  CF=0,
                  OF=0。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值