一movs指令
movs/movsb/movsw/movsd 数据从字符串移到字符串
movs 目标操作数,源操作数,其中目标操作数m8/m16/m32的[edi],源操作数m8/m16/m32的[esi],ESI和EDI地址要不一样
movs m8,m8 -->movsb
movs m16,m16 --->movsw
movs m32,m32--->movsd
movsd就是先给值,再分别加4,分解就相当于以下这三条指令:
movs dword ptr ds:[edi],dword ptr ds:[esi]
add esi,0x4
add edi,0x4
来看例子:
如图所示,movsd运行前,注意观察ESI EDI以及他们地址分别对应内存的内容
上图是 movsd运行之后的截图,把esi地址对应内存数据给了edi地址对应的内存内容,然后esi和edi各自加了4.
同理,如果是movsw那么先给值(两个字节),再各自加2,movsb那么先给值(一个字节),再各自加1.这里就不多赘述,原理过程和movsd差不多.
二rep指令
rep是重复指令,依赖ecx(计数寄存器),重复了多少次
有了这个指令,上面的例子就可以改成下面这样:
注意, 到这一步了一定要按alt+8进入反汇编窗口,按f11单步步入,按一次ecx就自减1,
直到ecx=0结束
三stos指令
STOS/STOSB/STOSW/STOSD - 存储字符串
stos 目标操作数(源操作数是隐式的默认的al/ax/eax),目标操作数为内存[edi]
如图所示,stosd执行之前,注意观察红框部分,
上图是stosd执行之后,执行前后对比可得出,stosd是把eax的值存储到edi所对应地址的内存里面,然后edi再加4,相当于mov dword pti ds:[edi],eax,add edi,0x4,同理可得出STOSW是先给值(两个字节)再加2,STOSB是先给值(一个字节)再加1.同样stos指令也可和rep搭配使用,方法和上面的movs指令类似,这里就不过多赘述了
今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!
如果觉得《[逆向]汇编movs stos rep指令讲解》对你有帮助,请点赞、收藏,并留下你的观点哦!