Assembly 反编译memcpy-这些说明的意义是什么?

Assembly 反编译memcpy-这些说明的意义是什么?,assembly,Assembly,memcpy函数检查要复制的字节是否小于4。如果是,则它使用带有 move byte ptr ds:[edi], al 复制内存 但是,如果不是,则使用以下说明: neg ecx and ecx, 3 我知道它正在检查0-ecx是否可以被4整除。但我的问题是: 为什么需要neg ecx edit: edx = bytes to copy ecx = address test edx, edx je exit xor eax, eax mov a

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

move byte ptr ds:[edi], al
复制内存

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

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

为什么需要neg 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)

他们所做的基本上是3-(x模4)的廉价计算


等等。至于他们为什么会得到这个值。。。现在您已经提供了代码。。。我相信他们所做的是在通过文字复制之前检查地址的数据对齐方式,但我需要更深入地研究它以使自己相信这一点。

他们所做的基本上是3-(x模4)的廉价计算


等等。至于他们为什么会得到这个值。。。现在您已经提供了代码。。。我相信他们所做的是在通过文字复制之前检查地址的数据对齐方式,但我需要更深入地研究它以使自己相信这一点。

您需要提供更多的代码。您正在使用什么编译器和优化?大多数现代编译器将使用更快的SSE/AVX操作,而不是像这样的
rep stos
。您需要提供更多的代码。您使用的是什么编译器和优化?大多数现代编译器将使用更快的SSE/AVX操作,而不是像那样的
rep stos
,这无疑是原因所在。如果在正确的边界上复制DWORD(甚至QWORD),速度会快得多。这就是最确定的原因。如果在正确的边界上复制DWORD(甚至QWORD),速度会快得多。
x      0 1 2 3 4 5 6 7 8 9 ...
result 3 2 1 0 3 2 1 0 3 2 ...