DF标志和串传送指令

 flag标志的第10为为DF(direction flag)(方向标志位,在串传送指令中,控制每次操作后si,di的增减。

df=0 每次操作后si,di递增 

df=1                      递减


串传送指令1:传送一个字节(8位)
格式:movsb

功能:将ds:si指向的内存单元中的字节送入到es:di中,然后根据标志寄存器DF位的值将si和di递减或递增。

分析,movsb指令相关于进行下面的几步操作:
1) ((es)*16 +(di)) =((ds)*16 +(si))  

2) 如果DF =0,则:(si) =(si) +1    (di) =(di) +1
    如果DF =1,则:(si) =(si) -1      (di) =(di) -1。

串传送指令2:传送一个字(16位)
格式:movsw

功能:将ds:si指向的内存单元中的字单元中word送入ds:di中,然后根据标志位DF的值,将si和di递增2或递减2。


movsb和movsw进行的是串传送操作中的一个步骤,一般来说,movsb和movsw都和rep配合使用。
格式:rep movsb            
用汇编语法来描述:
s: movsb
    loop s
在此,rep的作用是根据cx的值,重复执行后面的串传送指令。由于每执行依次movsb指令si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(cx)个字符的传送。
同理rep movsw的功能。

  flag的DF位决定着串传送指令执行后,si和di改变的方向,CPU提供了相应的指令来对DF位进行设置,从而使程序编写者能够决定传送的方向。

8086CPU提供下面两天指令对DF位进行设置:
  cld指令:将标志寄存器的DF位置0;std指令:将标志寄存器的DF位置1。

 

编程:用串传送指令,将data段中的第一个字符串复制到它后面的空间中。
data segment
db 'Welcome to masm!'
   db 16 dup (0)
data ends

分析:
1) 传送的原始位置:ds:si;        对应的信息:data:0
2) 传送的目的位置:es:di;         对应的信息:data:16
3) 传送的长度:cx                    对应的信息:16
4)传送的方向:DF;     因为正向传送(每次串传送指令执行后,si和di递增)比较方便,所以设置DF =0。

assume cs:code
data segment
    db 'welcome to masm!'
    db 16 dup(0)
data ends

code segment
start:    mov ax,data
            mov ds,ax
            mov si,0 ;ds:si 指向 data:0
            mov es,ax
            mov di,16  ;es:di指向data:0010
            mov cx,16 ;rep 循环16次
            cld       ;设置df=0,正向传送
            rep movsb
            mov ax,4c00h
            int 21h
code ends
end start
            

如果cld 改成std;则

  mov si,15

  mov di,31

这点要特别注意

原文地址:https://www.cnblogs.com/youxin/p/2530602.html