对于stosd,movsb的理解

在TSS相关的代码中,发现通常会有这样一段:

    mov edi,[app_i_param]

    add edi,[app_mem_pos]
    mov ecx,256/4
    cld
    rep stosd
    mov esi,[esp+4]
    cmp esi,0
    jz no_app_params

    。。。。。。。。。。。。。。。

cld会清除方向标记,而std会设置方向标记。

方向标志用于影响字符串指令偏移指针寄存器的方向。这些指令可以与REP前缀一起使用以重复操作。

简而言之,当方向标记为0时,指令将通过在每次迭代后递增指向数据的指针(eax放入要拷贝的内容,edi是递增的,将eax中的内容放入edi指向的地址中,ecx逐步递减为0)

stosd最后一个字母是d表示每次四个字节。

 

关于movsb的一个例子(摘自[转]汇编语言:MOVSB,MOVSW,MOVSD - 挥剑了得失 - 博客园 (cnblogs.com))

   cld   ;方向标志 

     mov   esi, 内存地址1     ;(也就是存放字符串的内存地址) 
     mov   edi, 内存地址2     ;(要移动到目的处的地址) 
     mov   ecx, 要移动的数量 ; 
     rep   movsb 

cld是来控制重复移动时候的esiedi的递增方式。 cld是将方向标志位DF设置为0,每次rep循环的时候,esiedi自动+1。   std是将方向标志位DF设置为1,每次rep循环的时候,esiedi自动-1
rep循环前缀在执行循环的时候,ecx寄存器是每次减1的。和我们的loop循环一样。 

 

posted on 2022-08-21 14:59  oemwang  阅读(253)  评论(0)    收藏  举报

导航