您的位置:首页 > 其它

DF标志和串传送指令

2012-06-01 13:31 183 查看
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

这点要特别注意
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: