鱼C论坛

 找回密码
 立即注册
查看: 2249|回复: 0

[学习笔记] 汇编语言上天之路(54-59)(标志寄存器)

[复制链接]
发表于 2017-7-15 21:35:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第五十四到五十九(标志寄存器)
        标志寄存器就是一个16位的flag的寄存器,每一位都有含义
        15  14  13  12  11  10  9  8  7  6  5  4  3  2  1  0
                        OF  DF  IF 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:[di] = ds:[si]
                如果DF=0 ,si = si+1,di = di+1
                如果DF=1 ,si = si-1,di = di-1
        movsw:
                相当于mov es:[di] = ds:[si]
                如果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:
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1鱼币 +2 收起 理由
小甲鱼 + 2

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 02:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表