当前位置: 首页> 汽车> 维修 > 汇编语言:cld, std, movsb, movsw, rep, rep movsb, rep movsw 指令

汇编语言:cld, std, movsb, movsw, rep, rep movsb, rep movsw 指令

时间:2025/7/12 9:35:32来源:https://blog.csdn.net/d704791892/article/details/141526180 浏览次数: 1次

一. DF 标志

        标志寄存器的第 10 位是 DF(Direction Flag),方向标志位,在串行处理指令中,控制每次操作后 si,di 的增减。

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

        df = 1 时,每次操作后 si,di 递减

 1. cld 指令

        cld (clear df) 指令,清空 df 标志位,执行该指令后,df = 0.

        指令格式为:cld        ;设置 df = 0, 正向传送

2. std 指令

        std (set df) 指令,设置 df 标志为,执行该指令后,df = 1

        指令格式为:std        ;设置 df = 1, 逆向传送

tips: si (source index,源变址寄存器):用于存放偏移地址

       di (destination index, 目的变址寄存器):用于存放偏移地址

3. 示例
assume cs:code
code segment
start:cld     ;设置 df = 0,在 debug 中,用 UP 表示 df = 0 std     ;设置 df = 1,在 debug 中,用 DN (down) 表示 df = 1mov ax, 4c00hint 21h
code ends
end start

二. movsb 指令

1. movsb 指令功能

        movsb (move string byte) 指令,即按 字节 传送数据的字符串传送指令。功能是将 ds:si 指向的内存字节单元的数据送入 es:di 指向的内存字节单元中,然后根据标志寄存器中的 df 标志位的值,如果 df = 0,si 和 di 递增,如果 df = 1,si 和 di 则递减。

2. movsb 指令 CPU 工作原理

        在 8086 CPU 中执行 movsb 指令,相当于执行以下指令

(1)mov al, [si]
         mov [di], al  

(2)如果 df = 0
        inc si
        inc di
        如果 df = 1
        dec si
        dec di

3. 示例
assume cs:code, ds:data
data segmentdb 'welcome to masm!'db 16 dup (0)
data ends
code segment
start:mov ax, datamov ds, axmov si, 0   ;指向第一个字符串开始的首地址mov es, axmov di, 16  ;指向目的首地址cld         ;设置 df = 0,正向传送movsb       ;es:[di] = ds:[si], 因为 df = 0,然后 (si) = (si) + 1, (di) = (di) + 1;movsb 指令执行后,第二个字符串为 'w', si = 1, di = 17std         ;设置 df = 1,逆向传送mov si, 15  ;指向第一个字符串的尾地址mov di, 31  ;指向目的尾地址movsb       ;es:[di] = ds:[si], 因为 df = 1, 然后 (si) = (si) - 1, (di) = (di) -1;movsb 指令执行后,第二个字符串为 'w',14个0,'!', si = 14, di = 30mov ax, 4c00hint 21h
code ends
end start

三. movsw 指令

1. movsw 指令功能

        movsw (move string word) 指令,即按 字 传送数据的字符串传送指令。功能是将 ds:si 指向的内存字单元的数据送入 es:di 指向的内存字单元中,然后根据标志寄存器中的 df 标志位的值,如果 df = 0,si 和 di 都加 2,如果 df = 1,si 和 di 则都减 2。

2. movsw 指令 CPU 工作原理

        在 8086 CPU 中执行 movsw 指令,相当于执行以下指令

(1)mov ax, [si]
         mov [di], ax  

(2)如果 df = 0
        add si, 2
        add di, 2
        如果 df = 1
        sub si, 2
        sub di, 2

3. 示例
assume cs:code, ds:data
data segmentdb 'welcome to masm!'db 16 dup (0)
data ends
code segment
start:mov ax, datamov ds, axmov si, 0   ;指向第一个字符串开始的首地址mov es, axmov di, 16  ;指向目的首地址cld         ;设置 df = 0,正向传送movsw       ;mov ax ds:[si]; mov es:[di] ax, 因为 df = 0,然后 add si, 2; add di, 2;movsw 指令执行后,第二个字符串为 'we', si = 2, di = 18std         ;设置 df = 1,逆向传送mov si, 14  ;指向第一个字符串的倒数第二个字节地址mov di, 30  ;指向目的倒数第二个字节地址movsw       ;mov ax ds:[si]; mov es:[di] ax, 因为 df = 1,然后 sub si, 2; sub di, 2;movsw 指令执行后,第二个字符串为 'we',12个0,'m!', si = 12, di = 28mov ax, 4c00hint 21h
code ends
end start

四. rep

        在汇编语言中,rep 的作用是根据 cx 的值,循环执行跟在其后的指令,直到 cx = 0 时为止。

五. rep movsb

1. rep movsb 指令功能

        根据 cx 的值,循环将 ds:si 内存字节单元的数据送入 es:di 内存字节单元中,直到 cx = 0 时为止。

2. rep movsb 指令 CPU 工作原理

        在 8086 CPU 中执行 rep movsb 指令,相当于执行以下指令

s: movsb
    loop s

3. 示例
assume cs:code, ds:data
data segmentdb 'welcome to masm!'   ;偏移地址:0-15db 16 dup (0)           ;偏移地址:16-31db 16 dup (0)           ;偏移地址:32-47
data ends
code segment
start:mov ax, datamov ds, axmov si, 0   ;指向第一个字符串开始的首地址mov es, axmov di, 16  ;指向目的首地址cld         ;设置 df = 0,正向传送mov cx, 16  ;要复制的字符串有16个字节rep movsb   std         ;设置 df = 1,逆向传送mov cx, 16  ;要复制的字符串有16个字节mov si, 15  ;指向第一个字符串的尾地址mov di, 47  ;指向目的尾地址rep movsb   mov ax, 4c00hint 21h
code ends
end start

六. rep movsw  

1. rep movsw 指令功能

        根据 cx 的值,循环将 ds:si 内存字单元的数据送入 es:di 内存字单元中,直到 cx = 0 时为止。

2. rep movsw 指令 CPU 工作原理

        在 8086 CPU 中执行 rep movsw 指令,相当于执行以下指令

s: movsw
    loop s

3. 示例
assume cs:code, ds:data
data segmentdb 'welcome to masm!'   ;偏移地址:0-15db 16 dup (0)           ;偏移地址:16-31db 16 dup (0)           ;偏移地址:32-47
data ends
code segment
start:mov ax, datamov ds, axmov si, 0   ;指向第一个字符串开始的首地址mov es, axmov di, 16  ;指向目的首地址cld         ;设置 df = 0,正向传送mov cx, 8   ;要复制的字符串有16个字节, movsw 从 ds:si 内存字单元(2个字节)的数据送入 es:di 内存字单元中,所以 cx = 8rep movsw   std         ;设置 df = 1,逆向传送mov cx, 8  ;要复制的字符串有16个字节, movsw 从 ds:si 内存字单元(2个字节)的数据送入 es:di 内存字单元中,所以 cx = 8mov si, 14  ;指向第一个字符串倒数第二个字节地址mov di, 46  ;指向目的倒数第二个字节地址rep movsw   mov ax, 4c00hint 21h
code ends
end start

关键字:汇编语言:cld, std, movsb, movsw, rep, rep movsb, rep movsw 指令

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: