目录

  • stos 指令
  • rep指令



今天在od中跟踪数据的时候发现这么一条指令


这实际上是rep 和 stos 2条指令的组合

rep stos dword ptr es:[edi]

stos 指令

(store string data)存储字符串数据

作用是把eax里面的数据,赋值给后面的地址,然后edi + 4,或者是-4,加或减主要看方向标志位DF,DF=0 就是+地址 DF=1就是减地址。下图的D是再ollydbg中的DF标志位显示

opensees指令prp_opensees指令prp


通常情况下系统是让EAX=0,作用是给一段连续空间清零。

例如下面代码,列举了 D = 0 加地址的例子,下面例子中,我把EAX设置为AA,BB,CC,为了验证数据被EAX赋值了,因为es:[edi]里面的数据本身有的默认是0,没法验证是被eax赋值后变成的0,但是我把eax改成AA,BB,CC,就能看到es:[edi]被赋值成了AA,BB,CC

stos dword ptr es:[edi]

上面这条stos指令可以分解后变成下面汇编代码

mov dword ptr es:[edi],eax
add edi , 4

把eax里面的数值 赋值给es:[edi]里,dword是double word是2个word长度,每个word 2个byte字节,2个dword就是4字节,4*8= 32位,就是把eax里面的数据,复制给es:[edi]这个地址里面,占用es:[edi]开始后的32位数据。es:[edi]的地址是0019FAB8,里面内容是C1,eax的值是BB,执行完以后0019FAB8的值会变成eax的值BB。然后edi + 4,指向0019FAB8 +4 = 0019FABC

opensees指令prp_stos_02


opensees指令prp_rep_03

rep指令

(repeat)重复
rep指令作用是重复 后面的指令,是个前缀,例如这里 rep stos,就是重复执行stos指令
rep指令每次执行的时候都从ecx寄存器里面读取值,当ecx大于0,就执行后面语句,执行完以后,会让ecx - 1,然后再执行rep后面的指令。
rep stos dword ptr es:[edi] 拆解后的代码如下

00000001  cmp ecx,0       //先比较 ecx 和 0
00000002  jle 00000005    //如果ecx <= 0就执行 00000005的语句
00000003  stos dword ptr es:[edi]   //ecx >0 就执行 rep 后面的语句 stos
00000004  dec ecx         //让ecx 自减 1
00000005  后面要执行的代码... //rep 下面的指令

rep stos dword ptr es:[edi] 翻译成c++语言的for循环如下

for (int i = ecx ;i>0 ;i--,edi += 4 ){
	stos dword ptr es:[edi] 
}

图解rep
下图所示,ecx = 2 , eax = AA , es:[edi] 的地址是 0019FAC4,数值是000001A0
执行完这一句后,0019FAC4 也会变成 eax的之 AA

opensees指令prp_stos_04


如下图所示,第一个循环后0019FAC4地址的数值变成了AA,寄存器ecx-1 从2变成了1,edi变成了0019FAC4+4 = 0019FAC8 ,执行这句以后 ,es:[edi]的值,也就是地址0019FAC8 也会变成 AA,ecx 自减1之后变成0,结束rep循环 ,向下执行

opensees指令prp_stos_05


0019FAC8 的数值也变成了AA,ecx变为0结束循环向下执行语句test edx,edx.

opensees指令prp_stos_06