flag 标志寄存器 (16位)

每一位有专门的意义

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  零标志位  结果为0 则ZF=1
       结果为1 则ZF=0     

PF  奇偶标志位 记录了再结果中的所有bit中
        如果1的个数为偶数 PF=1
        如果1的个数为奇数 PF=0 

SF  符号标志位 结果为负数 SF=1
        结果非负   SF=0                                                

CF  进位标志位 在进行N位无符号数的运算时
        最高位N-1位对第N位有借位和进位时  CF=1 木有则CF=0

OF  溢出标志位 记录了有符号运算的结果是否发生了溢出
        何为溢出 判断如下
        1 两个正数相加(或一个正数减一个负数)得到负数,就是溢出了.
        2 两个负数相加得到正数,就是溢出了.
        3 一个正数和一个负数相加不可能溢出

DF  方向标志位 在串处理指令(movsb movsw)中 控制每次操作后 si di的增减
  DF=0  每次操作后 si di递增
  DF=1  每次操作后 si di递减

 

串操作指令

movsb movsw

movsb 功能
是将ds:si指向的内存单元中的字节送入es:di中
然后根据寄存器df位的值 将si和di递增和递减


用汇编语法描述movsb功能如下

      mov es:[di], byte ptr ds:[si] ;8086不支持此指令 
      如果  df=0   方向标志位 df=0 则si di递增 反之递减
     inc si
     inc di
      如果  df=1
     dec si
     dec di

movsw    字单元与movsb原理一样

用汇编语法描述movsb功能如下

      mov es:[di], word ptr ds:[si] ;8086不支持此指令 
      如果  df=0   方向标志位 df=0 则si di递增 反之递减
     add si,2
     add di,2
      如果  df=1
     sub si,2
     sub di,2
一般串操作指令与rep配合使用

rep movsb

汇编解释 其功能 
s: movsb
   loop s
可见rep的作用是根据cx的值 重复执行后面的串操作指令(方向看df)
故  rep movsb 就可以循环实现(cx)个字符的传送 (rep movsw一样的)
而传送的方向是根据df来的 所以cpu提供了可以改变df值的指令
cld  置df为0 递增
std  置df为1 递减

使用串操作指令将 F000H段中的最后16字符复制到data段中

data segment
 db 16 dup(0)
data ends

程序分析
原始地址 F000H:FFFF; 
目的地址 data :000F
传送的长度   16
传送的方向 :因为逆向传送比较方便 所以设置df=1

程序如下:
mov ax,0f000h
mov ds,ax
mov si,0ffffh
mov ax,data
mov es,ax
mov di,15
mov cx,16
std
rep movsb