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
因篇幅问题不能全部显示,请点此查看更多更全内容