阿西吧 发表于 2017-7-15 21:35:46

汇编语言上天之路(54-59)(标志寄存器)

第五十四到五十九(标志寄存器)
        标志寄存器就是一个16位的flag的寄存器,每一位都有含义
        1514131211109876543210
                        OFDFIF TF SF ZF    AF    PF    CF
        其他空位无特殊意义

        ZF:(zero flag)当运算结果为0时置1,否则为0,当al = 80h时,al+al 进位后al也=0,也会置0
        PF:当运算结果的二进制1的个数为偶数置1,否则置0
        SF:如果当成补码形式,则负数置1,否则置0
        CF:(针对无符号数)如果有进位或者借位,则置1
                98+98 = 130H,这就产生了进位
                97-98 = 197-98 = FF,这就产生了借位
        OF:(针对有符号数)如果超过了有符号的最大范围则会溢出,置1
                进行有符号的运算
                al的范围是-128~127,ax的范围是-32768~32767
                如果al超过了-128或者127就会溢出
        DF:DF为0 ,则每次操作后SI,DI递增(配合movsb)
           DF为1 ,则每次操作后SI,DI递减
       
        adc命令:
                adc x,y = x+y+CF标志位
                这个可以用来进位的加法
                如1EF000H+201000H
                mov ax,001EH
                mov bx,0F000H
                add bx,1000h
                adc ax,0020h

        sbb命令:
                sbb x,y = x-y-标志位
                这个可以用来借位的减法
                如003E1000H - 00202000H
                mov bx,1000H
                mov ax,003EH
                sub bx,2000H
                sbb ax,0020H

        cmp指令(cmp x,y)将x和y相减,只改变flag寄存器的值不改变x,y
          1.进行无符号操作时候:
                ZF = 0,CF = 0,则x > y
                ZF = 0,CF = 1,则x < y
                ZF = 1,CF = 0,则x = y
                (ZF = 1,一定相等,CF = 1,一定X < Y)

          2.进行有符号操作时候:
                SF = 0,OF = 1,X < Y
                SF = 0,OF = 0,X > Y
                SF = 1,OF = 1,X > Y
                SF = 1,OF = 0,X < Y


          je        jmp equal        ZF = 1
          jne   jmp not equal   ZF = 0
          jb    jmp below        CF = 1
          jnb   jmp not below   CF = 0
          ja    jmp above        CF = 0,ZF = 0
          jna   jmp not above        CF = 1或者ZF = 1

        DF标志位:
                DF为0 ,则每次操作后SI,DI递增(配合movsb)
                   DF为1 ,则每次操作后SI,DI递减
        movsb:
                相当于mov es: = ds:
                如果DF=0 ,si = si+1,di = di+1
                如果DF=1 ,si = si-1,di = di-1
        movsw:
                相当于mov es: = ds:
                如果DF=0 ,si = si+2,di = di+2
                如果DF=1 ,si = si-2,di = di-2


        rep配合movsb和movsw:rep movsb/movsw(使用之前要初始化cx)
        相当于s:movsb
              loop s
       
        cld指令:将df置为0
        std指令:将df置为1
               
        pushf:将标志寄存器值去压栈
        popf :将标志寄存器值取出栈

实验11:
**** Hidden Message *****
页: [1]
查看完整版本: 汇编语言上天之路(54-59)(标志寄存器)