汇编学习11 标志寄存器

标志寄存器一共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

实验结果:

汇编学习11 标志寄存器_第1张图片
1234.GIF

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

你可能感兴趣的:(汇编学习11 标志寄存器)