汇编基础09--传送指令

Catalogue
  1. 1. 汇编基础09 – 传送指令

汇编基础09 – 传送指令

指令:MOVS

格式:MOVS OPRD1,OPRD2

功能:把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI

示例

1
2
3
4
5
6
7
8
9
10
11
.586
.MODEL flat,stdcall
.code
main proc
mov edi ,esp
mov dword ptr ss:[esp],0;给edi清零
mov esi ,ebp
movs dword ptr es:[edi],dword ptr ds:[esi];把esi中的数据存储到edi中
mov eax ,eax
main ENDP
END main

寄存器存储的是内存地址,内存地址里存储的是数据

使用loop也可以实现一点内存中的数据传送:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.data
sstr byte "hello selph!",0
tstr byte sizeof sstr dup(0)
.code
main proc
xor esi ,esi
mov ecx ,sizeof sstr
lp:
mov al ,sstr[esi]
mov tstr[esi] ,al
inc esi
loop lp
push 0
call ExitProcess
main endp
END main

指令:STOS

格式:STOS OPRD

功能:把AL/AX/EAX/RAX等中的数据存储到DI/EDI(这种为目的串的地址)中,每次执行后,会根据DF的值进行自动调整

把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI

示例:

1
2
3
4
5
6
7
8
9
10
.586
.MODEL flat,stdcall
.code
main proc
mov eax,11223344
mov edi ,esp
stos dword ptr es:[edi]
mov eax ,eax
main ENDP
END main

将EAX的值放到目的地址中

指令:REP

格式:REP

功能:重复其后的字符串操作指令。重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在LODS前。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
.586
.MODEL flat,stdcall
.code
main proc
mov ecx,4
mov edi ,esp
mov dword ptr ss:[esp],0;给edi清零
mov esi ,ebp
movs dword ptr es:[edi],dword ptr ds:[esi]
rep movsb
mov eax,eax
main ENDP
END main

将esi的4个位传送到edi,每重复一次,往后多传送一位