orange's学习--第三章:h pmtest8.asm的MemCpy函数理解

MemCpy必须指定目的es和源ds段寄存器,通过指定段寄存器完成了把代码段的内存内容复制到了指定的物理地址位置。

; ------------------------------------------------------------------------
; 内存拷贝,仿 memcpy
; ------------------------------------------------------------------------
; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize);
; ------------------------------------------------------------------------
MemCpy:
    push    ebp
    mov    ebp, esp

    push    esi
    push    edi
    push    ecx

    mov    edi, [ebp + 8]    ; Destination
    mov    esi, [ebp + 12]    ; Source
    mov    ecx, [ebp + 16]    ; Counter
.1:
    cmp    ecx, 0        ; 判断计数器
    jz    .2        ; 计数器为零时跳出

    mov    al, [ds:esi]        ; ┓
    inc    esi            ; ┃
                    ; ┣ 逐字节移动
    mov    byte [es:edi], al    ; ┃
    inc    edi            ; ┛

    dec    ecx        ; 计数器减一
    jmp    .1        ; 循环
.2:
    mov    eax, [ebp + 8]    ; 返回值

    pop    ecx
    pop    edi
    pop    esi
    mov    esp, ebp
    pop    ebp

    ret            ; 函数结束,返回
; MemCpy 结束-------------------------------------------------------------

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值