美文网首页
汇编学习11 标志寄存器

汇编学习11 标志寄存器

作者: 官总哦 | 来源:发表于2019-04-28 19:55 被阅读0次

    标志寄存器一共16位,一共只有0,2,4,6,7,8,9,10,11位有意义
    分别是CF(carry),PF(parity),AF,ZF(zero),SF(sign),TF(中断的单步执行标志,不进行详细介绍),IF(屏蔽外中断标志,不进行详细介绍),DF(direction),OF(overflow)

    补充:9个有效标志位中,有3个是控制标志位(DF,IF,TF),6个记录位。

    1.ZF位
    零标志位,记录上一次运算相关指令执行结束后,其结果是否为0
    ZF = 0:上一次运算指令执行结果不为0
    ZF = 1:上一次运算指令执行结果位0

    2.PF标志位
    奇偶标志位,记录相关指令执行后其结果的所有bit位中,1的个数为奇数还是偶数
    PF = 0:1的个数为奇数
    PF = 1:1的个数为偶数

    3.SF标志位
    符号标识位,记录相关指令执行以后,其结果是否为负数
    SF = 0:结果为非负数
    SF = 1:结果为负数
    注意:SF寄存器只在有符号数计算中有意义,若CPU进行的是无符号计算,则虽然SF的值也会受到影响,但是其值并没有意义

    4.CF标志位
    进位(借位)标志位,记录相关指令执行以后,其结果(无符号数)是否进位
    CF = 0:结果没有进位(借位)
    CF = 1:结果存在进位(借位)
    注意:CF寄存器针对于的是无符号数的进位

    5.OF标志位
    溢出符号位,记录相关指令执行以后,其结果(有符号数)是否溢出
    OF = 0:没有发生溢出
    OF = 1:发生了溢出
    注意:OF溢出是指的有符号数的溢出,而CF指的是无符号数的进位,两者之间相互独立, 没有关系

    以上标志寄存器衍生指令:

    • ADC指令:执行加法的时候加上CF的值;
      所以可以利用add,adc指令执行高位数据的加法
    • SBB指令: 执行减法时减去CF(带借位的减法指令)
    • CMP指令:cmp 1,2 代表的是执行1-2的运算,但是并不保存结果值,只根据结果调整标志位的值。cmp指令伴随条件跳转指令一同使用,可以达到跳转的效果

    cmp指令修改标志寄存器的值,搭配条件跳转指令(je,jne,jb,jnb,ja,jna等)根据cmp修改的标志寄存器CF和ZF的值决定是否跳转

    6.DF标志位
    方向标志位,用于串传送指令中,作用于SI和DI寄存器
    DF = 0:SI和DI加一
    DF =1:SI和DI减一
    注意:修改DF的指令为:cld(将DF置0,用于递加);std(将DF置1,用于递减)
    以上两个指令要配合movsb(movsw)指令使用达到串传送效果

    • movsb指令是将DS:SI位置处的字节信息传送到ES:DI位置中去,然后再根据DF寄存器的值,对SI和DI进行修改(movsw功能几乎相同,只不过是以字为单位进行传送)
    • rep movsb指令,相当于
      S: movsb
      \ loop
      根据CX的值,重复执行串传送指令

    示例代码:
    题目:利用串传递指令,将F000H段中的最后16个字符复制到data段中。

    assume cs:code, ds:data
    data segment
      db 16 dup (0)
    data ends
    
    code segment
    start:
      mov ax,0F000H
      mov ds,ax
      mov si,0FFFFH ;段的最后一个字节
      mov ax,data
      mov es,ax
      mov di,15
      mov cx,16
    
      std ;设置DI,SI逆向传输数据
      rep movsb
      mov ax,4c00H
      int 21H
    code ends
    start end
    

    7.标志寄存器的压栈和出栈:PUSHF和POPF

    • 将标志寄存器(16位)压栈PUSHF
    • 将标志寄存器出栈POPF
      以上两个指令提供了一种直接访问(修改)标志寄存器的方法

    实验说明:

    将数据段中以0结尾的字符串的所有小写字母变为大写字母
    注意!进行转化的是小写字母,而不是其他字符
    参考程序:

    assume cs:code
    
    datasg segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
    datasg ends
    
    code segment 
    start:  mov ax,datasg
        mov ds,ax
        mov si,0
        call letterc
        mov ax,4c00H
        int 21H
    
    letterc:    mov cl,ds:[si]
        mov ch,0
        jcxz done ; 判断取到的字符是否为0
        cmp cl,97 
        jb next ; 小于97则跳转
        cmp cl,122
        ja next ; 大于122则跳转
        and cl,11011111b
        mov ds:[si],cl
    next:   inc si
        loop letterc
        
    done:   ret
    
    code ends
    end start
    

    实验结果:

    1234.GIF

    实验总结:
    (1)注意灵活运用条件跳转指令,找出那些小写字母
    (2)小写字母转换为大写字母可以and一个二进制数11101111(其ASCii码只在第五位有差别)

    相关文章

      网友评论

          本文标题:汇编学习11 标志寄存器

          本文链接:https://www.haomeiwen.com/subject/ylrjnqtx.html