51代码网ORACLEMYSQLSQL SERVER其它数据库java/jspasp/asp.netC/C++/VC++APP应用其它语言服务器应用
您现在的位置: 51代码网 >> C >> 文章正文

RtlMoveMemory是怎样保证当dst与source有重叠时,仍然可以复制或移动

更新时间:2012-3-29:  来源:51代码网

RtlMoveMemory是怎样保证当dst与source有重叠时,仍然可以复制或移动?
RtlFillMemory的作用是什么?

如果source<dst从高地址往低地址复制
如果source>dst从低地址往高地址复制
RtlFillMemory就是memset

 mov     esi,EmmSource
        mov     edi,EmmDestination
        mov     ecx,EmmLength

        cld                               //注意这

        cmp     esi,edi                 ; Special case if Source > Destination
        jbe     overlap
nooverlap:
        mov     edx,ecx
        and     edx,MEMORY_ALIGNMENT_MASK
        shr     ecx,MEMORY_ALIGNMENT_LOG2
        rep     movsd

overlap:
        je      movedone
        mov     eax,edi
        sub     eax,esi
        cmp     ecx,eax
        jbe     nooverlap

        std                         //注意这
        add     esi,ecx
        add     edi,ecx
        dec     esi
        dec     edi
        rep     movsb
        cld
        jmp     short movedone
movedone:
        pop     edi
        pop     esi
      
因为在memmove和memcopy中看到有Rltmovememory的调用,所以研究了一下,对于memmove已经考虑到了当有overlap时,从高位向低位赋值,为什么还要rltmovememroy?

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 赞助商链接
    推荐文章
  • 此栏目下没有推荐文章
  • {
    设为首页 | 加入收藏 | 友情链接 | 网站地图 | 联系站长 |