您的当前位置:首页正文

MOVS,STOS,REP指令

来源:画鸵萌宠网
MOVS,STOS,REP指令

MOVS

MOVS 指令⽤于将⼀个内存操作数的值“复制”到另⼀个内存操作数,使⽤ MOVS 前要把⽬标内存的地址移⼊ EDI,源⽬标内存移⼊ ESI。(记忆⽅法:D表⽰destination,⽬标;S表⽰source,源)

假设内存 0x0019FF70 的值为1,0x0019FF6C 的值为2,将这两个地址分别存⼊EDI ESI,如图:

执⾏指令,注意 ES:[EDI] 和 DS:[ESI] 的区别,两个段不⼀样。MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]1

结果如下,EDI 指向的内存变成了2。

指令执⾏后,EDI 和 ESI 均+4,这个取决于⽅向标志位,如果D标志为0,则+4,如果D标志为1,则-4。如果内存宽度限定为WORD 或 BYTE,则相应地会±2或±1.

因为 EDI 和 ESI 会⾃动+4,利⽤这个特性,配合 REP 指令可以快速批量修改⼤量内存。STOS

STOS 指令将 AL/AX/EAX 的值存储到 [EDI] 指定的内存单元。STOS BYTE PTR ES:[EDI]STOS WORD PTR ES:[EDI]STOS DWORD PTR ES:[EDI]123

执⾏ STOS BYTE PTR ES:[EDI] 将 0x0019FF6C 的低8位修改为78,同时 EDI 会+1.

REP

REP 指令可⽤于重复执⾏ MOVS 和 STOS,重复次数由 ECX 指定。举例:将栈顶的10个DWORD 复制到 0x402000

MOV ECX,0xA

MOV EDI,CRACKME.00402000MOV ESI,ESP

REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]1234

结果如下,可以看到 ESI,EDI 都增加了28H,也就是⼗进制的40,内存也成功复制了。REP 配合 STOS 则可以快速初始化⼤量内存,⽐如,将 0x402000 开始的40个字节初始化为FFMOV ECX,0A

MOV EDI,CRACKME.00402000MOV EAX,-1

REP STOS DWORD PTR ES:[EDI]1234

结果如下

————————————————

版权声明:本⽂为CSDN博主「hambaga」的原创⽂章,遵循CC 4.0 BY-SA版权协议,转载请附上原⽂出处链接及本声明。原⽂链接:https://blog.csdn.net/kwansy/article/details/105628809

因篇幅问题不能全部显示,请点此查看更多更全内容

Top