解密的memcpy - 这些指令的重点是什么?

时间:2013-12-28 04:53:05

标签: assembly

memcpy函数检查要复制的字节是否小于4.如果是,则使用带

的循环
move byte ptr ds:[edi], al

复制记忆

但是,如果它不使用以下说明:

neg ecx
and ecx, 3

我知道它正在检查0 - ecx是否可被4整除。但我的问题是:

为什么需要使用ec ecx?

edit:
    edx = bytes to copy
    ecx = address
    test edx, edx
    je exit
    xor eax, eax
    mov al, byte_to_copy
    push edi
    mov edi, ecx
    cmp edx, 4
    jb byte_by_byte_copy
    neg ecx
    and ecx, 3
    jnz byte_by_byte_copy
    mov ecx, eax
    shl eax, 8
    add eax, ecx
    mov ecx, eax
    shl eax, 10
    add eax, ecx
    mov ecx, edx
    and edx, 3
    shr ecx, 2
    je byte_by_byte_copy
    rep stos dword [edi]
    test edx, edx
    je exit
    (byte by byte routine copy here)

1 个答案:

答案 0 :(得分:4)

他们所做的实际上是3(x modulo 4)

的廉价计算
x      0 1 2 3 4 5 6 7 8 9 ...
result 3 2 1 0 3 2 1 0 3 2 ...

等等。至于为什么他们获得这个价值......现在你已经提供了代码...我相信他们正在做的是在复制之前检查地址的数据对齐,但是我需要深入研究它深深地说服自己。