Assembly 反编译memcpy-这些说明的意义是什么?
memcpy函数检查要复制的字节是否小于4。如果是,则它使用带有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
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 ...