рджреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ 5 рддрд░реАрдХреЗред рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг

рд╕реНрдЯреЙрдкрд╡реЙрдЪ рджреЗрдЦрдиреА рдореЗрд░реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдХрд┐ рдмрдлрд░ рддреБрд▓рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рд╕реАрдПрд▓рдЖрд░ рд╕реНрдореГрддрд┐ рдХреЗ рджреЛ рдЯреБрдХрдбрд╝реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╡реНрд╣реАрдкреНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрджрд┐ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ)ред
".Net рдореЗрдВ рдмрд╛рдЗрдЯ рдПрд░рд┐рдпрд░реНрд╕ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЛ рдЧреБрдЧрд▓реА рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рднреНрд░рдорд┐рдд рдерд╛: рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд▓реЛрдЧреЛрдВ рдиреЗ LINQ рдпрд╛ Enumerable.SequenceEqual () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдЬреЛ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИред StackOverflow рдкрд░ рднреА, рдпрд╣ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрддреНрддрд░ рдерд╛ред рдпрд╛рдиреА рдлрд╛рд░реНрдо рдХрд╛ рднрдпрд╛рд╡рд╣ рд░реВрдк рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рднреНрд░рдо:

"рдХрдВрдкрд╛рдЗрд▓рд░ рд░рди-рдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдЖрдкрдХреЗ рд▓реВрдк рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред"

рдпрд╣ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдиреЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред
рдореИрдВрдиреЗ C # рд╕реЗ рдЙрдкрд▓рдмреНрдз рдмрдлрд╝рд░реНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдБрдЪ рддрд░реАрдХреЛрдВ рдХрд╛ рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рдзрд┐ рдЪреБрдирдиреЗ рдореЗрдВ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рджреАрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ x86 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕реАрдЖрд░рдЯреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╢реАрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдорд╢реАрди рдХреЛрдб рдХреА рднреА рддреБрд▓рдирд╛ рдХреАред


рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдФрд░ рджреЗрдЦрд╛ рдХрд┐ рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рддрд┐рд╢рдд рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
рддреБрд▓рдирд╛рддреНрдордХрддрд╛ () рдлрд╝рдВрдХреНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрде рдкрд░ рдерд╛, рдФрд░ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред
рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рджреЗрдЦрд╛: рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╡рд░реНрд▓реНрдб рд╡рд╛рдЗрдб рд╡реЗрдм рдкрд░ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЦреБрд╢ рдирд╣реАрдВ рдереЗ: рддрд░реАрдХреЛрдВ рдХреА рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдереА, рд▓реЗрдХрд┐рди рдпреЗ рдЖрдВрдХрдбрд╝реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗ, рдХрд┐рд╕ рдбреЗрдЯрд╛ рдкрд░ рдФрд░ рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рдиреЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИред
рдореЗрд░реА рдЕрдкрдиреА рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ рдХрд┐ рдХреМрди рдФрд░ рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рддреЗрдЬ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдкрд░рд┐рдгрд╛рдо рджрд┐рд▓рдЪрд╕реНрдк рдереЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЙрдкрд╡рд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдВрдд рдореЗрдВ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛ рдЧрдпрд╛ред

рдореИрдВрдиреЗ рдХреНрдпрд╛ рдФрд░ рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ


рдореБрдЦреНрдп рдмрд╛рдд рд╣реИ


рдХреЛрдб .net 4.0 рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рднреА рдирд╡реАрдирддрдо рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛрдЬ 7 x64 рдорд╢реАрди рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддред Microsoft рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯрдбреАрд╢рди 2010 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рдФрд░ рдХреЗрд╡рд▓ x86 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЕрд░реНрдерд╛рддреНред рдпрд╣ 32 рдмрд┐рдЯ рдХреЛрдб рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб 32-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рджреВрд╕рд░реЗ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ .Net рдЗрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рдореМрдЬреВрджрд╛ рдШрдЯрдХреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ 32-рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╡реЗ рдЕрдВрддрд┐рдо рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реЗ, рдмрд╣реБрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 64 рдмрд┐рдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдзреБрдирд┐рдХ 64-рдмрд┐рдЯ x86- рд╕рдВрдЧрдд рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ [32] [2] рдореЗрдВ 32-рдмрд┐рдЯ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ x64 32-рдмрд┐рдЯ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ [3] рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ 32-рдмрд┐рдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ 64 рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА рдХреЛ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдкреНрд░реЛрд╕реЗрд╕рд░ рдЯреАрдПрд▓рдмреА рдЖрдХрд╛рд░, рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХреЗ рдХреИрд╢ рдХреЛ рднреА рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░ рджреЛрдЧреБрдирд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрджрд▓реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕рдВрд░реЗрдЦрдг рд╕реАрдорд╛ рднреА рд╣реЛрддреА рд╣реИред рдкрд░рд┐рд╡рд░реНрддрди [4]ред

рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░


рдореЗрд░реЗ рдореВрд▓ рдХрд╛рд░реНрдп рдореЗрдВ, рдЖрдХрд╛рд░ рдХреЗ 16 рдмрд╛рдЗрдЯ рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ 1 рд╕реЗ 4 * 1024 рдмрд╛рдЗрдЯ рд╕реЗ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред 16 рдмрд╛рдЗрдЯреНрд╕ MD5 рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ, 4 Kb рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдПрдХ рдорд╛рдирдХ рдореЗрдореЛрд░реА рдкреЗрдЬ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ I / O рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ 1 рдмрд╛рдЗрдЯ рд╕реЗ 1/2 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рддрдХ рдХреЗ рдмреНрд▓реЙрдХ рдкрд░ рддреБрд▓рдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣реИрд╢ рди рдХреЗрд╡рд▓ рдЖрдХрд╛рд░ рдореЗрдВ 16 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ, рдмрд▓реНрдХрд┐ 4 рднреА рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 2 рдмрд╛рдЗрдЯреНрд╕ (CRC16, CRC32), рдФрд░ рдореЗрдореЛрд░реА рдкреЗрдЬ рдХреЗрд╡рд▓ 4 рд╣реИрдВ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ, рд▓реЗрдХрд┐рди 2 рдПрдордмреА [2] рдФрд░ 4 рдПрдордмреА рднреАред 1/2 рдПрдордмреА рдмреНрд▓реЙрдХреЛрдВ рдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдмрдбрд╝реЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдереЗ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░рд╛ рд╕рдордп рдЕрд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдЫреВрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕рдордп рди рдирд┐рдХрд╛рд▓реЗрдВ)ред

рдкрд╣рд▓реЗ рд░рдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ 25 рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдкрд╛рдпрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрдХреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ 1-рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдПрдХ рд╣реА рдХрд╛рд░рдХ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛрдб рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ:
private const int CountArrays = 128; //    private const int StartArraySize = 1; //    private const int MaxArraySize = 512 * 1024; //    private const int StepsCount = 25; //  private const int MeasurementsCount = 10; //  


рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рдЪрдХреНрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛:
  double sizeMultiplier = 1; DoInvestigationStep(sizeMultiplier); const int MaxMultiplier = MaxArraySize / StartArraySize; var stepMmltiplier = Math.Pow( MaxMultiplier, 1 / (double)StepsCount ); for (var step = 1; step <= StepsCount; step++) { sizeMultiplier = Math.Pow(stepMmltiplier, (double) step); DoInvestigationStep(sizeMultiplier); } 


рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рд╕рд░рдгреА рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдЧрдИ рдереА:
  var arraySize = (int) (StartArraySize * p_SizeMultiplier); 


рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ



System.Collections.IStructuralEquatable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдпрд╣ C # рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдИ рд╡рд┐рдзрд┐ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ .NET 4 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХрд╛ рдерд╛: рдпрд╣ рдЙрддреНрд╕реБрдХ рдерд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдзреАрдорд╛ рд╣реИред
  private static bool ByteArrayCompareWithIStructuralEquatable(byte[] p_BytesLeft, byte[] p_BytesRight) { IStructuralEquatable eqa1 = p_BytesLeft; return eqa1.Equals(p_BytesRight, StructuralComparisons.StructuralEqualityComparer); } 


LINQ, рдпрд╛ рдмрд▓реНрдХрд┐ Enumerable.SequenceEqual ()


рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рддрд░реАрдХрд╛ рднреА рд╣реИред
  private static bool ByteArrayCompareWithSequenceEqual(byte[] p_BytesLeft, byte[] p_BytesRight) { return p_BytesLeft.SequenceEqual(p_BytesRight); } 


PTvoke, CRT рдореЗрдореНрдХрдореНрдк () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП


рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдордВрдЪ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╛ рдУрд╡рд░рд╣реЗрдб рдХрд╛рдлреА рд╕рдордп рддрдХ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдкрдирд╛ рдЖрдХрд░реНрд╖рдг рдЦреЛ рджреЗрддреА рд╣реИред
рдпрд╣рд╛рдВ рдореИрдВ рдЗрд╕реЗ рдЙрд╕ рд░реВрдк рдореЗрдВ рд▓рд╛рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрд╕рдУ рдкрд░ рдкрд╛рдпрд╛ рдерд╛ред рдпрд╣ рдЗрд╕ рд░реВрдк рдореЗрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред
PInvoke.net рдкрд░ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИред
  [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] private static extern int memcmp(byte[] p_BytesLeft, byte[] p_BytesRight, long p_Count); private static bool ByteArrayCompareWithPInvoke(byte[] p_BytesLeft, byte[] p_BytesRight) { // Validate buffers are the same length. // This also ensures that the count does not exceed the length of either buffer. return p_BytesLeft.Length == p_BytesRight.Length && memcmp(p_BytesLeft, p_BytesRight, p_BytesLeft.Length) == 0; } 


рдорд╛рдереЗ рдкрд░ред рдпрд╛рдиреА рдПрдХ (;;) рд▓реВрдк рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рддреБрд▓рдирд╛


рдпрд╣ рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмреНрдпрд╛рдЬ рдХреА рд╣реИред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╡рд┐рдзрд┐ рдмрд╣реБрдд рддреЗрдЬрд╝ рдирд╣реАрдВ рд▓рдЧрддреА рдереА, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

рд╡реИрд╕реЗ, рдЗрд╕ рддреБрд▓рдирд╛ рдкрджреНрдзрддрд┐ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдПрд▓рдЖрд░ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдХреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╣реБрдд рд╣реА рдкрд╛рда рдЬрд┐рд╕рдореЗрдВ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред
  private static bool ByteArrayCompareWithSimplest(byte[] p_BytesLeft, byte[] p_BytesRight) { if (p_BytesLeft.Length != p_BytesRight.Length) return false; var length = p_BytesLeft.Length; for (int i = 0; i < length; i++) { if (p_BytesLeft[i] != p_BytesRight[i]) return false; } return true; } 


Hafor Stefanson рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐


рд╡рд┐рдзрд┐ рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдХреВрд▓рд┐рдд рд╡рд┐рдзрд┐ рд╕рд░рдгреА рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рдВрднрд╛рд╡рд┐рдд рднрд╛рдЧ рдХреЗ рд▓рд┐рдП 64 рдмрд┐рдЯреНрд╕ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╕рд░рдгреА рдХреА рд╢реБрд░реБрдЖрдд QWORD рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдЧрдардмрдВрдзрди рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ QWORD рд╕рдВрд░реЗрдЦрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рдЧрддрд┐ рдкрд░ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, 32-рдмрд┐рдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, 64-рдмрд┐рдЯ рдмреНрд▓реЙрдХ рдореЗрдВ рддреБрд▓рдирд╛ рдХреЗрд╡рд▓ рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ: рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд░рдЬрд┐рд╕реНрдЯрд░ 32-рдмрд┐рдЯ рд╣реИрдВ, рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдорд╢реАрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 64 рдмрд┐рдЯреНрд╕ рдирд╣реАрдВ рд╣реИред
  // Copyright (c) 2008-2013 Hafthor Stefansson // Distributed under the MIT/X11 software license // Ref: http://www.opensource.org/licenses/mit-license.php. private static unsafe bool UnsafeCompare(byte[] a1, byte[] a2) { if (a1 == null || a2 == null || a1.Length != a2.Length) return false; fixed (byte* p1 = a1, p2 = a2) { byte* x1 = p1, x2 = p2; int l = a1.Length; for (int i = 0; i < l / 8; i++, x1 += 8, x2 += 8) if (*((long*) x1) != *((long*) x2)) return false; if ((l & 4) != 0) { if (*((int*) x1) != *((int*) x2)) return false; x1 += 4; x2 += 4; } if ((l & 2) != 0) { if (*((short*) x1) != *((short*) x2)) return false; x1 += 2; x2 += 2; } if ((l & 1) != 0) if (*((byte*) x1) != *((byte*) x2)) return false; return true; } } 


рдкрд░реАрдХреНрд╖рдг рдкрджреНрдзрддрд┐


рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ


рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ "рдареЗрд▓рд╛" рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛), рдХрдИ рдкрд░реАрдХреНрд╖рдг рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рд╕рд░рдгреАред

рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ "рджрд╛рдВрддреЗрджрд╛рд░" рд╕рд░рдгреА рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ - "рдж рдЬрдЧреНрдб рдПрд░реЗ")ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдИ рд╡рд┐рдХрд▓реНрдк рдереЗ, List<byte[]> рдФрд░ LinkedList<byte[]> , рд▓реЗрдХрд┐рди рд╡рд┐рдХрд▓реНрдк рддрддреНрд╡ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдордп рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ .NET рдореЗрдВ рд╕рд░рдгреА рдпрд╣рд╛рдВ рдЪрдордХ рдирд╣реАрдВ рд╣реИ: рд╕реАрдПрд▓рдЖрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред , рднрд▓реЗ рд╣реА рдпрд╣ рд╢реВрдиреНрдп рдЖрдзрд╛рд░ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд░рдгреА рд╣реИред

рдЯреЗрд╕реНрдЯ рдбреЗрдЯрд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╕рднреА рд╕рд░рдгрд┐рдпрд╛рдБ рдЕрд▓рдЧ рдереАрдВ, рдФрд░ рд╕рд░рдгреА рдХрд╛ рдЕрд▓рдЧ рддрддреНрд╡ рдмрд┐рд▓реНрдХреБрд▓ рдмреАрдЪ рдореЗрдВ рдерд╛ред
рдбреЗрдЯрд╛ рдЬрдирд░реЗрд╢рди рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ
  private static void PrepareTestData(int p_ArraySize) { for (int i = 0; i < CountArrays; i++) { var byteArray = new byte[p_ArraySize]; byteArray[p_ArraySize / 2] = (byte) (i & 0x000000ff); s_arrays[i] = byteArray; } } 



рддреБрд▓рдирд╛ рдХрд░рдирд╛


рдЪреВрдВрдХрд┐ рд╕рднреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рд╕рднреА рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рдиреА рдереА, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬрд┐рд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдорд╛рдкрд╛ рдЧрдпрд╛ рдерд╛, рд╕реЗрдЯ рдХреЗ рд╕рднреА рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рджреЛ рдиреЗрд╕реНрдЯреЗрдб рдЫреЛрд░реЛрдВ рд╣реИрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдХреЛ рдЙрдирдХреЗ рдЕрдВрджрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреЛ рдХреБрдЫ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рд╕рд╛рд░ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  for (int i = 0; i < CountArrays; i++) for (int j = 0; j < CountArrays; j++) Compare( s_arrays[i], s_arrays[j] ); 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ "рд▓реЗрдХрд┐рди" рд╣реИ: рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ "рдЧрдгрдирд╛" рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реАрдПрд▓рдЖрд░ рдХреЛ "рдЧрдгрдирд╛" рди рдХрд░рдиреЗ рдХрд╛ рд╣рд░ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред рдЬрдм рдореИрдВ C ++ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдореИрдВ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЖрдпрд╛ рдерд╛ред "-O3" рдЕрдиреБрдХреВрд▓рди рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рдорд╛рдкрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдордп рдХреЗ рдмрд╛рдж рдпрд╣ рд╢реВрдиреНрдп рд╣реЛ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рд╢реБрд░реВ рд╕реЗ рд╣реА рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рддреБрд▓рдирд╛рддреНрдордХ рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо "рд╕рдВрдЪрд┐рдд" рд╣реЛ рдФрд░ рд╡рд╛рдкрд╕ рдЖрдП, рдФрд░ рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдирджреЗрдЦреА рдХрд┐рдП рдмрд┐рдирд╛ рддреБрд▓рдирд╛
  var result = true; for (int i = 0; i < CountArrays; i++) for (int j = 0; j < CountArrays; j++) { var tmp = Compare( s_arrays[i], s_arrays[j] ); result = result && tmp; } return result; 


рддреБрд▓рдирд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
  var stubLocalVar = p_omparisonMethod(); if (stubLocalVar) throw new InvalidOperationException(); 



рдЪреВрдВрдХрд┐ 5 рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп, "рдЯреЗрдореНрдкрд▓реЗрдЯ" рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдФрд░ рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ:
рдЧрд▓рдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╡рд┐рдзрд┐
  private static bool CompareArraysWithExternalMethod(Func<byte[], byte[], bool> p_Method) { var result = true; for (int i = 0; i < CountArrays; i++) for (int j = 0; j < CountArrays; j++) { var tmp = p_Method( s_arrays[i], s_arrays[j] ); result = result && tmp; } return result; } 


рдпрд╣ рд╡рд┐рдзрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЙрдкреА / рдкреЗрд╕реНрдЯ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрддреНрдпрдзрд┐рдХ рдХреЙрд▓ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдорд╛рдк рд╕рдЯреАрдХрддрд╛ рдХрд╛ рдиреБрдХрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдХрдИ рдХреЙрд▓ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдкрд╛рдБрдЪ рд▓рдЧрднрдЧ рд╕рдорд╛рди рддрд░реАрдХреЗ рдмрдирд╛рдиреЗ рдереЗ:
  private static bool CompareArraysWithUnsafeMethod(); private static bool CompareArraysWithSimplestMethod(); private static bool CompareArraysWithSequenceEqualMethod(); private static bool CompareArraysWithPInvokeMethod(); private static bool CompareArraysWithIStructuralEquatableMethod(); 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕реНрддрд░ рдЕрдзрд┐рдХ рд╣реИ, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ MeasComparisonTime () рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдорд╛рдкрддрд╛ рд╣реИ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдлрдВрдХ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рдЙрд╕рдХрд╛ рд░рдирдЯрд╛рдЗрдо рд╣реИ рдЬрд┐рд╕реЗ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд┐рдзрд┐ рдорд╛рдкрди рдХрд╛рд░реНрдп
  private static long GetMinimalMesuredValue(int p_MeasurementNumber, long p_PreviousValue, long p_MeasuredValue) { var result = p_MeasurementNumber == 0 ? p_MeasuredValue : Math.Min(p_PreviousValue, p_MeasuredValue); return result; } private static long MeasureComparisonTime(Func<bool> p_Method, long p_PreviousTime, int p_MeasurementNumber) { GC.Collect(); GC.Collect(); s_stopwatch.Start(); var stubLocalVar = p_Method(); s_stopwatch.Stop(); if (stubLocalVar) throw new InvalidOperationException(); var result = GetMinimalMesuredValue(p_MeasurementNumber, p_PreviousTime, s_stopwatch.ElapsedTicks); s_stopwatch.Reset(); return result; } 



рдорд╛рдк рдкреНрд░рдХреНрд░рд┐рдпрд╛


рд╕рдордп рдХреЛ рдПрдХ рдорд╛рдирдХ рд╕реНрдЯреЙрдкрд╡реЙрдЪ ( рд╡рд░реНрдЧ System.Diagnostics.Stopwatch ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдкрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ QueryPerformanceCounter () рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЙрдирдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдЯрд┐рдХреНрд╕ рдореЗрдВ: рдЫреЛрдЯреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╕рднреА рдорд╛рдк рд╢реВрдиреНрдп рд╣реЛрдВрдЧреЗред рдЖрд░рдбреАрдЯреАрд╕реАрдЯреА [6] рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЕрдкрдиреА рдЦреБрдж рдХреА "рд╕рд╛рдЗрдХрд┐рд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдерд╛, рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд╣рд▓реЗ рдХреБрдЫ рд░рди рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдЯреАрдХрддрд╛ рд╡рд░реНрддрдорд╛рди рддрдХрдиреАрдХ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдереА, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, ProcessThread.ProctorAffinity рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА, рдЬреЛ рдЗрд╕рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАред рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЖрдзрд╛рд░ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреНрд▓реЙрдХ рдХрд╛рдЙрдВрдЯрд░ рд╣реИред рд╕рднреА рдорд╛рдк 10 рдмрд╛рд░ рджреЛрд╣рд░рд╛рдП рдЧрдП рдереЗ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдВрдЦреНрдпрд╛ 10 рдХреЛ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдиреНрдпреВрдирддрдо рд╕рдордп рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рджрд┐рдП рдЧрдП рдереЗред
рд╕рднреА рдорд╛рдк рд▓реЗрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп
  private static MeasurementsResults DoMeasurements() { MeasurementsResults result; result.SimplestTime = 0; result.SequenceEqualTime = 0; result.PInvokeTime = 0; result.IStructuralEquatableTime = 0; result.UnsafeTime = 0; for (int measurementNumber = 0; measurementNumber < MeasurementsCount; measurementNumber++) { Console.WriteLine("   {0}", measurementNumber); result.SimplestTime = MeasureComparisonTime(CompareArraysWithSimplestMethod, result.SimplestTime, measurementNumber); result.SequenceEqualTime = MeasureComparisonTime(CompareArraysWithSequenceEqualMethod, result.SequenceEqualTime, measurementNumber); result.PInvokeTime = MeasureComparisonTime(CompareArraysWithPInvokeMethod, result.PInvokeTime, measurementNumber); result.IStructuralEquatableTime = MeasureComparisonTime(CompareArraysWithIStructuralEquatableMethod, result.IStructuralEquatableTime, measurementNumber); result.UnsafeTime = MeasureComparisonTime(CompareArraysWithUnsafeMethod, result.UnsafeTime, measurementNumber); } return result; } 



рдорд╛рдк рдХреЗ рдкрд░рд┐рдгрд╛рдо рдФрд░ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдХрд░реНрд╖


рдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдХреБрдЫ рдЕрдВрджрд╛рдЬрд╛ рдерд╛ рдХрд┐ рдХреМрди рд╕рд╛ рддрд░реАрдХрд╛ рд╡рд┐рдЬреЗрддрд╛ рдмрдиреЗрдЧрд╛ рдФрд░ рдХреМрди рд╕рд╛ рдмрд╛рд╣рд░реА рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рд╢рд╛рдпрдж рд╣реА рдореБрдЭреЗ рдорд┐рд▓реЗред рдореЗрд░реА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рдереАрдВред
рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдордп (tics)рд╕рд░рдгреА рдЖрдХрд╛рд░ (рдмрд╛рдЗрдЯреНрд╕)рдЕрд╕реБрд░рдХреНрд╖рд┐рддрдорд╛рдерд╛PInvokeSequenceEqualIStructuralEquatable
276
1
1.7
1
6
10.5
55
276
1
1.7
1
6.3
10.1
55.7
325
2
1.3
1
5.3
11
95.2
374
4
1.1
1
4.8
11.4
121.3
413
8
1
1.3
5
14.1
181.2
412
13
1
1.7
4.7
17.5
252.5
490
23
1
2.3
3.7
22.1
364.8
554
39
1
3.4
3.5
30.1
535.9
691
67
1
4.3
2.9
39.1
727.5
887
114
1
5.6
2.4
50.3
964.1
1212
194
1
4.6
2.1
61.5
1190.9
1875
328
1
4.8
1.8
65.8
1295.8
2897
556
1
5
1.6
71.5
1416.9
4565
942
1
5.3
1.4
76.3
1521.1
7711
1595
1
5.2
1.3
76.2
1521.2
12,482
2702
1
5.4
1.3
79.4
1593.6
20692
4576
1
5.5
1.2
81.2
1626.2
34,369
7750
1
5.6
1.2
82.8
1657.1
58048
13124
1
5.6
1.2
82.9
1661.9
97,511
22226
1
5.6
1.2
83.6
1677.3
173,805
37640
1
5.4
1.1
79.5
1585.7
295,989
63,743
1
5.3
1.1
79.3
1574.9
588,797
107,949
1
4.6
1.1
67.5
1340.9
1010768
182,811
1
4.6
1.1
67
1340.4
1705668
309,590
1
4.6
1.1
67.3
1334.1
2885452
524,287
1
4.6
1.1
67.3
1329.1


рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ:
рдкрд╣рд▓рд╛: CRT рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╕ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдЧрдгрдирд╛ рдХреА рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЪрд░рдг (рдкрд░реАрдХреНрд╖рдг рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░) рдкрд░ рдЗрд╕рдХреА рдЧрддрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЙрд▓ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖред рдмрд╛рдж рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╣реБрдд рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рджреЛрд╣рд░рд╛рдпрд╛, рд▓реЗрдХрд┐рди 1.5 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдкрд░ рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рддреЗрдЬреА рд╕реЗ рдирд┐рдХрд▓рд╛ред

рджреВрд╕рд░рд╛: рдореИрдВрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдХрд┐ IStructuralEquatable рдзреАрдореА рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдиреЗ рдореБрдЭреЗ рдорд╛рд░рд╛: рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереАред

рдбрд╛рдпрдЬреЗрд╕реНрд╕реЗрдореНрдмрд▓рд┐рдВрдЧ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕рд░рд▓рддрдо рдХреЗ рдмреАрдЪ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдЧрдВрднреАрд░ рдЕрдВрддрд░ (рдореБрдЭреЗ "рд▓рд╛рдн" рд╕реЗ рджреЛ рд╕реЗ рддреАрди рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдХреА рдЙрдореНрдореАрдж рд╣реИ) рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯ рдореЗрдВ рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреЗ рдЫреЛрд░реЛрдВ рдФрд░ рдкрд╣реБрдВрдЪ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЙрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ .Net рд╡рд┐рдЬреНрдЮрд╛рдкрдирджрд╛рддрд╛рдУрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ JIT'er рдХреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЦреБрд╢реА рд╕реЗ рдЗрдирдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреНред рд╕реАрдзреЗ рдЙрддреНрдкрдиреНрди рдорд╢реАрди рдХреЛрдбред

рддреБрд▓рдирд╛рдЕрд░реЗрд╕рд╡рд┐рдерд╕реНрдорд┐рдердкреНрд▓реЗрд╕реНрдЯрдореЗрдереЛрдб () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдереНрд░реЗрдбред рд╕реНрд▓реАрдк (60 * 1000) рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛; рд░рд┐рд▓реАрдЬрд╝ рдмрд┐рд▓реНрдб рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдУрд▓рдбрд┐рдмреНрдпреВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрдард╛рдпрд╛ред рд╕реАрдПрд▓рдЖрд░ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрдо рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХрджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА - рддрд╕реНрд╡реАрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреИрд╕рд╛ рд╡рд╣ рд╣реИред

рддреАрд░ рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд░ рд╡рд┐рдВрдбреЛ рдХрд╛рдБрдЯ

Ntdll.NtDelayExecution () рдФрд░ SleepEx () рд╕реЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдкрд░, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рдкрд╛рдпрд╛ рдФрд░, рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЕрдзреНрдпрдпрди рдХреЗ рдмрд╛рдж, рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЕрдкреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рдЧрдпрд╛ред рдореБрдЭреЗ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдерд╛:
  1. рдПрдХ рдПрдХрд▓ RngChkFail рдЪреЗрдХ (рдПрдХ рдмрд╛рд░ рдореЗрдВ рдкреВрд░реЗ рд▓реВрдк рдХреЗ рд▓рд┐рдП) рдХреЗ рдмрдЬрд╛рдп, CLR рдпрд╣ рдЬрд╛рдБрдЪ рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ !!!
  2. рдЪрдХреНрд░ рдЙрд╕ рд░реВрдк рдореЗрдВ рдмрдирд╛ рд░рд╣рд╛ рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рдерд╛: рд╕рдВрдХрд▓рдХ рдиреЗ рдЗрд╕реЗ "рддреИрдирд╛рдд" рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред
  3. рдЗрд╕рд▓рд┐рдП, рддреБрд▓рдирд╛ рдмрд╛рдЗрдЯ рд╕реЗ рдмрдиреА рд░рд╣реА, рд╣рд╛рд▓рд╛рдВрдХрд┐ CLR рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдХреНрд╖рдо рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 4 рдмрд╛рдЗрдЯ (рд░рдЬрд┐рд╕реНрдЯрд░ рдЖрдХрд╛рд░) рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗред
  4. рдПрдХрд▓ рдЙрдкрд╕рдВрд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХрд▓ рд╡рд╛рдкрд╕реА рдХреЗ рдмрдЬрд╛рдп рдФрд░ рд╕реНрдЯреИрдХ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реАрдПрд▓рдЖрд░ рдиреЗ рдЙрдиреНрд╣реЗрдВ рддреАрди рдмрд╛рд░ рдХреЙрдкреА рдХрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб "рд╕реВрдЬрди" рдмрдирд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдорд╢реАрди рдХреЛрдб C # рдХреЛрдб рдХреЛ рд▓рдЧрднрдЧ рдПрдХ рд╕реЗ рдПрдХ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдХреНрдпрд╛ рдЙрд╕рдиреЗ рдХреЛрдб рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдерд╛? рдХреНрдпрд╛ рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ?
  5. рд╕рдВрднрд╡рддрдГ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл (рд╕реВрдЬрди рдХреЛрдб) рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдлрд╝рдВрдХреНрд╢рди рдЗрдирдмрд┐рд▓реНрдб рдирд╣реАрдВ рдерд╛ред


UnsafeCompare () рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╡рд┐рдШрдЯрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореЗрд░реА рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдмрдврд╝ рдЧрдИ рдФрд░ рдореБрдЭреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ред рдореИрдВрдиреЗ CRT рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд┐рдпрд╛ рдерд╛, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдереНрд░реЗрдбред рд╕реНрд▓реАрдк () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╣реЛ рд░рд╣рд╛ рдерд╛ рдХреЗ рд╕рд╛рд░ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдж рддрдХ рд╕рд░рд▓реАрдХреГрдд рд╡рд┐рдШрдЯрди: рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдп рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдереНрд░реЗрдбред рд╕реЛ ()
  private static bool CompareArraysWithUnsafeMethod() { var result = true; for (int i = 0; i < CountArrays; i++) for (int j = 0; j < CountArrays; j++) { Thread.Sleep( 60 * 1000 ); var tmp = UnsafeCompare(s_arrays[i], s_arrays[j]); 



рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рднреА рдмреНрдпрд╛рдЬ рдХрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдЬрдм рддрдХ UnsafeCompare () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдХреЗ рдПрдХ рддрддреНрд╡ рддрдХ рдХрд┐рд╕реА рднреА рдкрд╣реБрдВрдЪ рдХреЗ рдХрд╛рд░рдг рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕рд░рдгреА рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рднреАрддрд░ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдореИрдВрдиреЗ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдЗрд╕ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ред
рд╕реАрдкреАрдпреВ рдбрд┐рд╕реНрдХрд╕ рдХреА рддреБрд▓рдирд╛рдПрдпрд░реНрд░реЗрдЬрд╝рд╡рд┐рдердпреВрдВрд╕рдлреЗрдо рдореЗрдереЛрдб
 ;Address Hex dump Command Comments 001B0B88 55 push ebp ;   001B0B89 8BEC mov ebp, esp 001B0B8B 57 push edi 001B0B8C 56 push esi 001B0B8D 53 push ebx 001B0B8E BF 01000000 mov edi, 1 ; result = true; 001B0B93 33DB xor ebx, ebx ; for (int i = 0; 001B0B95 33F6 xor esi, esi ; for (int j = 0; 001B0B97 B9 60EA0000 mov ecx, 0EA60 ; Thread.Sleep( 60 * 1000 ); 001B0B9C E8 0CFBC161 call clr.ThreadNative::Sleep 001B0BA1 8B15 A8337A03 mov edx, [s_arrays] ; EDX <-- s_arrays 001B0BA7 3B5A 04 cmp ebx, [edx+4] ; Compare(s_arrays.Length,  ) (1) !!! 001B0BAA 73 31 jae short stub_CLR.JIT_RngChkFail 001B0BAC 8B4C9A 0C mov ecx, [ebx*4+edx+0C] ; ECX <-- s_arrays[i] 001B0BB0 3B72 04 cmp esi, [edx+4] ; Compare(s_arrays.Length,  ) (2) !!! 001B0BB3 73 28 jae short stub_CLR.JIT_RngChkFail 001B0BB5 8B54B2 0C mov edx, [esi*4+edx+0C] ; EDX <-- s_arrays[j] 001B0BB9 FF15 F0381400 call near UnsafeCompare 



рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рдШрдЯрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ рдФрд░ рдПрдХ рд╕реНрдХреНрд░реАрди рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реБрдЖ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдбрд┐рдмрдЧрд░ рд╡рд┐рдВрдбреЛ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдирд╣реАрдВ рджрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдПрдХ рдмрдбрд╝реА рдЕрднрд┐рдиреНрди рд╕реВрдЪреА рдердХрд╛рдК рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрддреНрдкрд╛рджрдХ рд╣реИ, рдпрд╣рд╛рдВ рдореИрдВ рдЗрд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рджреЗрддрд╛ рд╣реВрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рдеред
UnsafeCompare ()ред ParametersChecking
 ;a1 ========> ECX ;a2 ========> EDX ;Address Hex dump Command Comments 001B0BF8 55 push ebp ;   001B0BF9 8BEC mov ebp, esp 001B0BFB 57 push edi ;     , , ,  001B0BFC 56 push esi ;     001B0BFD 53 push ebx ; 001B0BFE 83EC 0C sub esp, 0C ;       3*sizeof(DWORD), ..  3  001B0C01 33C0 xor eax, eax ; (!) 001B0C03 8945 F0 mov [ebp-10], eax ; var1 <-- 0 (!) 001B0C06 8945 EC mov [ebp-14], eax ; var2 <-- 0 (!) 001B0C09 85C9 test ecx, ecx ; Compare(a1, null) 001B0C0B 74 0C je short return1 001B0C0D 85D2 test edx, edx ; Compare(a2, null) 001B0C0F 74 08 je short return1 001B0C11 8B41 04 mov eax, [ecx+4] ; eax <-- a1.Length 001B0C14 3B42 04 cmp eax, [edx+4] ; Compare(eax, a2.Length) 001B0C17 74 0A je short argsIsValid return1: 001B0C19 33C0 xor eax, eax ; result <-- 0 001B0C1B 8D65 F4 lea esp, [ebp-0C] 001B0C1E 5B pop ebx 001B0C1F 5E pop esi 001B0C20 5F pop edi 001B0C21 5D pop ebp 001B0C22 C3 ret argsIsValid: ;    



рдлрд╛рд╕реНрдЯрдХреЙрд▓ рдХреЙрд▓рд┐рдВрдЧ рдХрдиреНрд╡реЗрдВрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬреЛ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ [7] [8] рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдкрд╣рд▓рд╛ рдФрд░ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдИрдПрдХреНрд╕рдПрдХреНрд╕ рдФрд░ рдПрдбреАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╣реИрдВ, рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдХреНрд░рдо рдореЗрдВред рдЙрдкрд░реЛрдХреНрдд рд╕реВрдЪреА рдореЗрдВ, рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдХреНрд░рдорд┐рдХ рдЬрд╛рдВрдЪ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдпрд╣ рд▓рдЧрднрдЧ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ C # рдореЗрдВ рдХреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ
  if (a1 == null || a2 == null || a1.Length != a2.Length) return false; 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреА рдЧрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ: рдЙрдирдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рд╡реЗ рднреНрд░рдорд┐рдд рд╣реИрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдПрдХ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдореИрдВрдиреЗ C # рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд▓реЙрдЬрд╝ рдФрд░ рдкреЙрдЗрдВрдЯрд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЗрд╕реА рддрд░рд╣ рдХреА рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреАрдВред
  private static unsafe int func1(byte[] param1) { fixed (byte* p = param1) { return *p; } } 


рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд▓рд╛рдЬреНрдорд╛
 ;param1 ========> ECX Address Hex dump Command Comments $ ==> 55 push ebp ;   $+1 8BEC mov ebp, esp $+3 50 push eax ; (!) $+4 33C0 xor eax, eax ; (!) $+6 8945 FC mov [ebp-4], eax ; var1 <-- 0 (!) $+9 85C9 test ecx, ecx ; Compare(param1, null) $+B 74 06 je short param_is_null $+D 8379 04 00 cmp dword ptr [ecx+4], 0 ; Compare(param1.Length, 0) $+11 75 07 jne short not_zero_len param_is_null: $+13 33D2 xor edx, edx $+15 8955 FC mov [ebp-4], edx ; var1 <-- 0 $+18 EB 0C jmp short ret_1 not_zero_len: $+1A 8379 04 00 cmp dword ptr [ecx+4], 0 $+1E 76 10 jbe short call.JIT_RngChkFail $+20 8D49 08 lea ecx, [ecx+8] ; ecx <-- param1.BufferPointer $+23 894D FC mov [ebp-4], ecx ; var1 <-- ecx ret_1: $+26 8B45 FC mov eax, [ebp-4] ; eax <-- var1 $+29 0FB600 movzx eax, byte ptr [eax] ; eax <-- *eax $+2C 8BE5 mov esp, ebp ;   $+2E 5D pop ebp $+2F C3 ret call.JIT_RngChkFail: $+30 E8 B3BDC861 call clr.JIT_RngChkFail $+35 CC int3 



рдЙрдкрд░реЛрдХреНрдд рд╕реВрдЪреА рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд▓реЙрдЬ рдореЗрдВ рдЪрд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдИрдПрдХреНрд╕рдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рд╕реБрд▓рдн рдерд╛ (рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ 0x26 рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рд▓реЗрдХрд┐рди рдЕрд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдлрд╝рд╕реЗрдЯ рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реНрдЯреИрдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ [ ebp-4] (рдЗрд╕реЗ var1 рдХрд╣рддреЗ рд╣реИрдВ)ред рдЪрд░ рдХреЛ рддреБрд░рдВрдд рд╢реВрдиреНрдп рд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдлрд╕реЗрдЯ 0x15 рдкрд░, рд╢реВрдиреНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ var1 рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрд╕ рдХреНрд╖рдг рддрдХ рд╢реВрдиреНрдп рдкрд╣рд▓реЗ рд╣реА рд╡рд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдерд╛ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ UnsafeCompare.CPU Disasm.ParametersChecking рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреА рдЧрдИ рд▓рд╛рдЗрдиреЗрдВ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреА рд╣реИрдВ, рдпрд╣ рд╕рдВрдХрд▓рди рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдкрд░реЛрдХреНрдд рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдХреЛ рддреАрди рдЪрд░рдгреЛрдВ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкрд╣рд▓рд╛, рд╕рд░рдгреА рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рд╢реВрдиреНрдп рдХреА рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ (jne рдХрдорд╛рдВрдб рдХреЗрд╡рд▓ ZF рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреА рд╣реИ), рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рд╢реВрдиреНрдп рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП ( jbe ZF рдФрд░ CF рджреЛрдиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ)ред рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдЕрдЬреАрдм рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реАрдПрдордкреА рдХрдорд╛рдВрдб рдХреЛ рджреЛ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╢рд░реНрдд рдХреВрдж рдЭрдВрдбреЗ рдХреЛ рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЖрдк рдореЗрдВ рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЖрднрд╛рд░реА рд╣реВрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдкрдврд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡реНрдпрд░реНрде рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдореЗрд░реА рдЦреБрджрд╛рдИ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рдереАред

рдкреНрд░рдпреЛрдЧ рдЖрдЧреЗ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рддреБрд▓рдирд╛рдЕрдзрд┐рдЧреНрд░рд╣ рдХреА рд╕реНрдерд┐рд░ рдзрд╛рд░рд╛
 argsIsValid: 001B0C23 8379 04 00 cmp dword ptr [ecx+4], 0 ; Compare(a1.Length, 0)       001B0C27 75 07 jne short a1Len_NonZero ;   001B0C29 33C0 xor eax, eax 001B0C2B 8945 F0 mov [ebp-10], eax ; var1 <-- 0 001B0C2E EB 10 jmp short a1Len_Zero a1Len_NonZero: 001B0C30 8379 04 00 cmp dword ptr [ecx+4], 0 ; Compare(a1.Length, 0)  ()     001B0C34 0F86 B5000000 jbe call.JIT_RngChkFail ;     001B0C3A 8D41 08 lea eax, [ecx+8] ; eax <-- a1.BufferPointer 001B0C3D 8945 F0 mov [ebp-10], eax ; var1 <-- eax a1Len_Zero: 001B0C40 837A 04 00 cmp dword ptr [edx+4], 0 ; Compare(a2.Length, 0)       001B0C44 75 07 jne short a2Len_NonZero ;   001B0C46 33D2 xor edx, edx 001B0C48 8955 EC mov [ebp-14], edx ; var2 <-- 0 001B0C4B EB 10 jmp short part3 a2Len_NonZero: 001B0C4D 837A 04 00 cmp dword ptr [edx+4], 0 ; Compare(a2.Length, 0)  ()     001B0C51 0F86 98000000 jbe call.JIT_RngChkFail ;     001B0C57 8D52 08 lea edx, [edx+8] ; edx <-- a2.BufferPointer 001B0C5A 8955 EC mov [ebp-14], edx ; var2 <-- edx 



рд╕рдВрдХрд▓рдХ рдиреЗ рдпрд╣рд╛рдВ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреНред рд╕рдВрдХрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд▓реЙрдЬ рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд╡реИрд╕реЗ рднреА рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рд╢реНрдЪрд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛:
 part3: ; ECX <======= a1 ; EDX <======= a2.BufferPointer ; var1 <======= a1.BufferPointer ; var2 <======= a2.BufferPointer 001B0C5D 8B45 F0 mov eax, [ebp-10] ; eax <-- var1 001B0C60 8BF0 mov esi, eax ; esi <-- eax 001B0C62 8B45 EC mov eax, [ebp-14] ; eax <-- var2 001B0C65 8BF8 mov edi, eax ; edi <-- eax 001B0C67 8B41 04 mov eax, [ecx+4] ; eax <-- a1.Length 001B0C6A 8945 E8 mov [ebp-18], eax ; var3 <-- eax 


рдлрд┐рдХреНрд╕реНрдб рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдЪрд░ рд╕реЗ рд▓реЗрдХрд░ рдЗрдВрдбреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рддрдХ рд╕реАрдзреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕рдВрдЪрд╛рдпрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧреБрдкреНрдд рдЬрд╛рджреБрдИ рдЕрд░реНрде рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рддрд░рд╣ (рдИрдПрдХреНрд╕рдПрдХреНрд╕ рдХреЛ рднреЗрдЬрдирд╛) рджрд┐рдЦрддрд╛ рд╣реИред
8 рдмрд╛рдЗрдЯ рд▓реВрдк
 001B0C6D 33C9 xor ecx, ecx ;   <-- 0 001B0C6F 8BD8 mov ebx, eax ; ebx <-- a1.Length 001B0C71 85DB test ebx, ebx 001B0C73 79 03 jns short ebx_greaterZero 001B0C75 83C3 07 add ebx, 7 ;  ,  7 ebx_greaterZero: 001B0C78 C1FB 03 sar ebx, 3 ; ebx <-- a1.Length / 8 001B0C7B 85DB test ebx, ebx 001B0C7D 7E 1D jle short fourBytesComparing for8_body: 001B0C7F 8B06 mov eax, [esi] 001B0C81 8B56 04 mov edx, [esi+4] 001B0C84 3B57 04 cmp edx, [edi+4] 001B0C87 75 04 jne short setResult_jumpReturn 001B0C89 3B07 cmp eax, [edi] 001B0C8B 74 04 je short for8_increment setResult_jumpReturn: 001B0C8D 33C0 xor eax, eax ; result <-- 0 001B0C8F EB 56 jmp short return2 ; goto return for8_increment: 001B0C91 41 inc ecx 001B0C92 83C6 08 add esi, 8 001B0C95 83C7 08 add edi, 8 for8_expression: 001B0C98 3BD9 cmp ebx, ecx 001B0C9A ^ 7F E3 jg short for8_body 



рдЪрдХреНрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрдХреНрд░ рдХрд╛рдЙрдВрдЯрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрдПрдХреНрд╕рдПрдХреНрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рд╕реАрдорд╛ рдореВрд▓реНрдп рдИрдмреЗрдХреНрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдЬреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рднреА рд╣реИред рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рд▓реВрдк рд╕реНрдерд┐рддрд┐ рдХреА рдкрд╣рд▓реА рдЬрд╛рдВрдЪ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдореБрдЦреНрдп рд▓реВрдк рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИред рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЪрдорддреНрдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрд░рдИрдПрдХреНрд╕ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдпрд╛ рд╕рдВрдЧрдд рдореЛрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддред QWORD рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП DWORD рдЖрдХрд╛рд░ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдб рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкрд╣рд▓реЗ рд╕рд░рдгреА рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рднрд╛рдЧреЛрдВ рдХреЛ рдИрдПрдХреНрд╕рдПрдХреНрд╕, рдПрдбреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рдерд╛ред

рдпрд╣ рд╣рдбрд╝рддрд╛рд▓реА рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдиреЗ CMPSD рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЗрд╕рдХрд╛ "рд╕рдВрдХреНрд╖рд┐рдкреНрдд" рд░реВрдк, рдЬреЛ рдЙрдЪрд┐рдд рдЭрдВрдбреЗ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рддреЗ рд╣реБрдП esi рдФрд░ edi рдкрддреЗ рдкрд░ рд░рдЦреЗ DWORD рдмреНрд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░ рдХрдИ рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛: рдпрд╣рд╛рдБ рдкрд░ mov рдХрдорд╛рдВрдб 2 рдФрд░ 3 рдмрд╛рдЗрдЯреНрд╕ рдЖрдХрд╛рд░ рдореЗрдВ рд╣реИ, cmp рдХрдорд╛рдВрдб 2 рдФрд░ 3 рдмрд╛рдЗрдЯреНрд╕ рдЖрдХрд╛рд░ рдореЗрдВ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ CMPSD рдХрдорд╛рдВрдб рдХрд╛ рдЖрдХрд╛рд░ (рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ) рдХреЗрд╡рд▓ 1 рдмрд╛рдЗрдЯ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд ред рджреЛ рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 2 рдмрд╛рдЗрдЯреНрд╕ред рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдИрдЖрд░рдПрдХреНрд╕ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдРрд╕реА рдорд╛рддреНрд░рд╛ рдмрдиреА рд░рд╣рддреА рд╣реИ, рддреЛ DWORD рдЖрдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 fourBytesComparing: 001B0C9C F745 E8 0400000 test dword ptr [ebp-18], 00000004 ; ZF <-- (var3 & 4) == 0 001B0CA3 74 10 je short length_lowerThenFour 001B0CA5 8B06 mov eax, [esi] 001B0CA7 3B07 cmp eax, [edi] 001B0CA9 74 04 je short dwords_equals ;   ,     001B0CAB 33C0 xor eax, eax 001B0CAD EB 38 jmp short return2 dwords_equals: 001B0CAF 83C6 04 add esi, 4 001B0CB2 83C7 04 add edi, 4 


рдпрджрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдорд╛рддреНрд░рд╛ рдмрдиреА рд░рд╣рддреА рд╣реИ, рддреЛ WORD рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 length_lowerThenFour: 001B0CB5 F745 E8 0200000 test dword ptr [ebp-18], 00000002 ; ZF <-- (var3 & 2) == 0 001B0CBC 74 10 je short length_lowerThenTwo 001B0CBE 0FBF06 movsx eax, word ptr [esi] 001B0CC1 66:3B07 cmp ax, [edi] 001B0CC4 74 04 je short words_equals ;   ,     001B0CC6 33C0 xor eax, eax 001B0CC8 EB 1D jmp short return2 words_equals: 001B0CCA 46 inc esi 001B0CCB 46 inc esi 001B0CCC 47 inc edi 001B0CCD 47 inc edi 


рдпрджрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдорд╛рддреНрд░рд╛ рдмрдиреА рд░рд╣рддреА рд╣реИ рддреЛ BYTE рдЖрдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 length_lowerThenTwo: 001B0CCE F745 E8 0100000 test dword ptr [ebp-18], 00000001 ; ZF <-- (var3 & 1) == 0 001B0CD5 74 0B je short 001B0CE2 001B0CD7 0FB606 movzx eax, byte ptr [esi] 001B0CDA 3A07 cmp al, [edi] 001B0CDC 74 04 je short 001B0CE2 ;   ,     001B0CDE 33C0 xor eax, eax 001B0CE0 EB 05 jmp short return2 001B0CE2 B8 01000000 mov eax, 1 


рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдирд╛ рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдирд╛:
 return2: 001B0CE7 8D65 F4 lea esp, [ebp-0C] 001B0CEA 5B pop ebx 001B0CEB 5E pop esi 001B0CEC 5F pop edi 001B0CED 5D pop ebp 001B0CEE C3 ret JIT_RngChkFail: 001B0CEF E8 C4B1DB61 call clr.JIT_RngChkFail 001B0CF4 CC int3 


рдореЗрдордХреИрдВрдк () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реАрдЖрд░рдЯреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рди рдХреЗрд╡рд▓ рджреЛ рдмрдлрд╝рд░реНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдмрдВрдз рдХрд╛ рднреА рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред

рдбрд┐рдмрдЧрд░ рджреНрд╡рд╛рд░рд╛ рд╣реБрдХ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ C: \ Windows \ SysWOW64 \ msvcrt.dll рд╕рдВрд╕реНрдХрд░рдг 7.0.7601.17744 рдХреЛ рдЖрдзрд╛рд░ рдкрддреЗ 0x76C20000 рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдбреАрдмрдЧрд░ рдЬрд╛рдирдХрд╛рд░реА Windows

рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдХреЛрдб рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рдеред

рддреИрдпрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдиреЗ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рдирдХ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдПрдХ рдЕрдЬреАрдм рдирд┐рд░реНрджреЗрд╢ рдерд╛, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдпрд╛рдо рдЕрджреНрднреБрдд рд╣реИрдВред "рд▓рдВрдмреА" рдХреВрдж рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣рдбрд╝рддрд╛рд▓реА рдереА, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 32 рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд╡рд┐рдЪ рдбрд░рд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рдЕрдЬреАрдм рдирд┐рд░реНрджреЗрд╢:
 76C37975 . 8BFF mov edi, edi ; <--(!)    INT msvcrt.memcmp(buf1,buf2,count) 76C37977 . 55 push ebp 76C37978 . 8BEC mov ebp, esp 


рдпрд╣ рдХрд┐рд╕реА рднреА рдЭрдВрдбреЗ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛, рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╢реВрдиреНрдп рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдирдУрдкреА, рд▓реЗрдХрд┐рди рдЖрдХрд╛рд░ рдореЗрдВ 2 рдмрд╛рдЗрдЯреНрд╕ред рдбрд┐рдмрдЧрд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдХреЛрдб рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдп рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рд░реЗрдордВрдб рдЪреЗрди рдХреЗ рдмреНрд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬрд▓реНрджреА рд╕реЗ рдорд┐рд▓ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдирдУрдкреА рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред
рдпрд╣ рдПрдХ рд╣реЙрдЯ-рдкреИрдЪ рдкреЙрдЗрдВрдЯ рд╣реИред
рдПрдордУрд╡реА рдИрдбреАрдЖрдИ, рдИрдбреАрдЖрдИ рдирд┐рд░реНрджреЗрд╢ рдПрдХ рджреЛ-рдмрд╛рдЗрдЯ рдПрдирдУрдкреА рд╣реИ, рдЬреЛ рдПрдХ рдХреВрдж рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдкреИрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдордХреНрдЦреА рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЖрд╢рдп рдпрд╣ рд╣реИ рдХрд┐ MOV EDI, EDI рдирд┐рд░реНрджреЗрд╢ рдХреЛ рджреЛ рдмрд╛рдЗрдЯ JMP $ -5 рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рддреБрд░рдВрдд рдкрд╣рд▓реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкрд╛рдВрдЪ рдмрд╛рдЗрдЯреНрд╕ рдкреИрдЪ рд╕реНрдкреЗрд╕ рдХреЛ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдлреБрд▓ рдЬрдВрдк рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдЪ рдмрд╛рдЗрдЯреНрд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рдЬреЛ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдлрдВрдХреНрд╢рди рдХреЛ рдХрдВрдЯреНрд░реЛрд▓ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред
blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx


рд▓рдВрдмреА рдЫрд▓рд╛рдВрдЧ рдФрд░ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕реНрд╡рд┐рдЪ
 Address Hex dump Command Comments 75A9797C . 8B7D 10 mov edi, [ebp+10] ; edi <-- length 75A9797F . 8BC7 mov eax, edi 75A97981 . 83E8 00 sub eax, 0 ; 75A97984 . 0F84 E7070100 je msvcrt.zeroResult_GoReturn ; (length == 0)=> {result <-- 0, goto return;} (!)      ;    ;    75A979BC . 83FF 1F cmp edi, 1F ; Switch (cases 1..1F, 32. exits) 75A979BF . 77 5B ja short msvcrt.75A97A1C 75A979C1 . FF24BD 1F8AA975 jmp near [edi*4+msvcrt.75A98A1F] ; (!)       (!)      ;    ;    75A98A1F . 1C7AA975 dd msvcrt.75A97A1C ; (00)   ,  jump     75A98A23 . E88AA975 dd msvcrt.75A98AE8 ; (01) 75A98A27 . CA8AA975 dd msvcrt.75A98ACA ; (02) 75A98A2B . 8C8BA975 dd msvcrt.75A98B8C ; (03) 75A98A2F . 0A7AA975 dd msvcrt.75A97A0A ; (04) 75A98A33 . 088FA975 dd msvcrt.75A98F08 ; (05) 75A98A37 . B88AA975 dd msvcrt.75A98AB8 ; (06) 75A98A3B . 758BA975 dd msvcrt.75A98B75 ; (07) 75A98A3F . F479A975 dd msvcrt.75A979F4 ; (08) 75A98A43 . 238FA975 dd msvcrt.75A98F23 ; (09) 75A98A47 . 9F8AA975 dd msvcrt.75A98A9F ; (0A) 75A98A4B . A18BA975 dd msvcrt.75A98BA1 ; (0B) 75A98A4F . DE79A975 dd msvcrt.75A979DE ; (0C) 75A98A53 . 3A8FA975 dd msvcrt.75A98F3A ; (0D) 75A98A57 . FD8AA975 dd msvcrt.75A98AFD ; (0E) 75A98A5B . ED8EA975 dd msvcrt.75A98EED ; (0F) 75A98A5F . C879A975 dd msvcrt.75A979C8 ; (10) 75A98A63 . 518FA975 dd msvcrt.75A98F51 ; (11) 75A98A67 . BA8EA975 dd msvcrt.75A98EBA ; (12) 75A98A6B . 6A98A975 dd msvcrt.75A9986A ; (13) 75A98A6F . 8990A975 dd msvcrt.75A99089 ; (14) 75A98A73 . CD98A975 dd msvcrt.75A998CD ; (15) 75A98A77 . D58EA975 dd msvcrt.75A98ED5 ; (16) 75A98A7B . 8598A975 dd msvcrt.75A99885 ; (17) 75A98A7F . 1899A975 dd msvcrt.75A99918 ; (18) 75A98A83 . E898A975 dd msvcrt.75A998E8 ; (19) 75A98A87 . 698FA975 dd msvcrt.75A98F69 ; (1A) 75A98A8B . 9D98A975 dd msvcrt.75A9989D ; (1B) 75A98A8F . 3399A975 dd msvcrt.75A99933 ; (1C) 75A98A93 . 0099A975 dd msvcrt.75A99900 ; (1D) 75A98A97 . 848FA975 dd msvcrt.75A98F84 ; (1E) 75A98A9B . B598A975 dd msvcrt.75A998B5 ; (1F)    



рдкреВрд░реЗ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдмрдбрд╝реА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗрд╡рд▓ рджреЛ рдЪреАрдЬреЗрдВ рд░реБрдЪрд┐ рдХреЗ рдереАрдВ:




рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдХреЛрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдереНрд░реЗрдб.рд╕рд▓реАрдк () рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рдЯреНрд░реЗрд╕рд┐рдВрдЧ рд╢реБрд░реВ рд╣реБрдИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╣рд▓реЗ рдЯреНрд░реЗрд╕ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрд╕рдлрд▓ рд░рд╣рд╛: рдЯреНрд░реЗрд╕ рд▓реЙрдЧ рдмрд╣реБрдд рдмрдбрд╝рд╛ (рд▓рдЧрднрдЧ 100 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ) рдирд┐рдХрд▓рд╛, рдЬрд┐рд╕рдиреЗ рд╕рдВрднрд╡рддрдГ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ DllMain () рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕ рдмрд╛рдд рдХреА рднреА рд╕рдВрднрд╛рд╡рдирд╛ рдереА рдХрд┐ рдХреБрдЫ CLR рдХреЛрдб рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдереЗ, рд╢рд╛рдпрдж JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдбред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╢реБрд░реВ рд╣реБрдЖ: рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдкреА рдХрд╛ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд░рд╛рд░рдВрдн рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рдЧрднрдЧ рд╕рдордЧреНрд░ рддрд╕реНрд╡реАрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ Thread.Sleep () рдФрд░ рдлрд┐рд░ рд╕реЗ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ memcmp () рдореЗрдВ рдПрдХ рдФрд░ рдХреЙрд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдХреАредрдирддреАрдЬрддрди, рдореБрдЭреЗ рд╕реМ рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рдорд┐рд▓ рдЧрдИрдВред

рдЯреНрд░реЗрд╕ рд▓реЙрдЧ рд╡рд┐рдВрдбреЛ

рдЯреНрд░реЗрд╕ рд▓реЙрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛:
 main 00480AEA call 0031C19C ESP=0016F368 ;    main clr.628C3B5F call near [eax+14] ESP=0016F248 ; (1) ;    main 00480B87 mov eax, [ebp-1C] EAX=00313880 main 00480B8A mov eax, [eax+14] EAX=0031391C main 00480B8D mov ecx, [eax] ECX=75A97975 ; (2) main 00480B8F push dword ptr [ebp+0C] ESP=0016F328 main 00480B92 push dword ptr [ebp+8] ESP=0016F324 main 00480B95 push edi ESP=0016F320 main 00480B96 push dword ptr [ebp-10] ESP=0016F31C main 00480B99 mov dword ptr [ebp-2C], 0 main 00480BA0 mov [ebp-28], esp main 00480BA3 mov dword ptr [ebp-24], 480BB0 main 00480BAA mov byte ptr [ebx+8], 0 main 00480BAE call ecx ESP=0016F318 ; (3) main msvcrt.memcmp mov edi, edi -------- Logging stopped 

рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рд▓реЙрдЧ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╕реАрдПрд▓рдЖрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдЪреБрдиреМрддреА рдореЗрдВ рдХрд╛рдлреА рдЕрдкреНрд░рддреНрдпрдХреНрд╖рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдВрдХреНрд░рдордг рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЗрдХрд╛рдИ рдХреЛ рдЙрд╕рдХреЗ рдорд┐рд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдЫреЛрдбрд╝рддреА рд╣реИред рдпрд╣ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдХреА рд╕реАрдорд╛ рдХреЗ рдмрд╛рд╣рд░ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭрджрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╡реЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧрдгрдирд╛ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛, рдХрдо рд╕реЗ рдХрдо рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдореЗрдВ рдЕрдВрддрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрдо рд╕реЗ рдХрдо рд╕рдордп рдмрд┐рддрд╛рдПрдЧрд╛ред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдкреВрд░реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдВрддрд░ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдПрдХ рд▓реВрдк рдореЗрдВ рдмреНрд▓реЙрдХреЛрдВ рд╕реЗ рдХреА рдЬрд╛рдПрдЧреАред

рдЪреВрдВрдХрд┐ рдЙрдЪрд┐рдд рд╕рдордп рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдФрд░ рдЯреНрд░реЗрд╕ рд▓реЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдирд┐рд╢рд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд░реНрд╡реЛрддреНрддрдо рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдЬрдирд░реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд╕рднреА рд╕рд░рдгрд┐рдпрд╛рдБ рдкрд╣рд▓реА рдмрд╛рдЗрдЯ рд╕реЗ рд╢реБрд░реВ рд╣реЛ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╕рднреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд▓реВрдк рдХреЗ рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреА рдЧрдИ рд╣реЛ ред
рд╕рдВрд╢реЛрдзрд┐рдд рд╕рд░рдгреА рддреБрд▓рдирд╛ рд╕рдорд╛рд░реЛрд╣
  private static bool CompareArraysWithPInvokeMethod() { var result = true; for (int i = CountArrays - 1; i >= 0; i--) //    for (int j = 0; j < CountArrays; j++) { var tmp = ByteArrayCompareWithPInvoke(s_arrays[i], s_arrays[j]); result = result && tmp; } return result; } 



рдкрд╣рд▓рд╛ рдирд┐рд╢рд╛рди (рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛)
 main msvcrt.memcmp mov edi, edi main msvcrt.75A97977 push ebp ESP=0041EC74 main msvcrt.75A97978 mov ebp, esp EBP=0041EC74 main msvcrt.75A9797A push esi ESP=0041EC70 main msvcrt.75A9797B push edi ESP=0041EC6C main msvcrt.75A9797C mov edi, [ebp+10] EDI=00080000 ; edi <-- count main msvcrt.75A9797F mov eax, edi EAX=00080000 ; eax <-- edi main msvcrt.75A97981 sub eax, 0 ; if (eax == 0) {result <-- 0; return;} main msvcrt.75A97984 je msvcrt.zeroResult_GoReturn main msvcrt.75A9798A dec eax EAX=0007FFFF main msvcrt.75A9798B je msvcrt.75A98C10 main msvcrt.75A97991 dec eax EAX=0007FFFE main msvcrt.75A97992 je msvcrt.75A9E610 main msvcrt.75A97998 dec eax EAX=0007FFFD main msvcrt.75A97999 je msvcrt.75A9E5DF main msvcrt.75A9799F dec eax EAX=0007FFFC main msvcrt.75A979A0 je msvcrt.75A98BD2 main msvcrt.75A979A6 mov ecx, [ebp+0C] ECX=034C53B8 ; ecx <-- buf1 main msvcrt.75A979A9 mov eax, [ebp+8] EAX=05C41038 ; eax <-- buf2 main msvcrt.75A979AC push ebx ESP=0041EC68 main msvcrt.75A979AD push 20 ESP=0041EC64 ;        main msvcrt.75A979AF pop edx EDX=00000020, ESP=0041EC68 ;--------------------------------   main msvcrt.75A979B0 cmp edi, edx main msvcrt.75A979B2 jae msvcrt.75A993A7 main msvcrt.75A993A7 mov esi, [eax] ESI=4241403F main msvcrt.75A993A9 cmp esi, [ecx] main msvcrt.75A993AB jne msvcrt.75AA80E7 ;   main msvcrt.75AA80E7 movzx esi, byte ptr [eax] ESI=0000003F main msvcrt.75AA80EA movzx ebx, byte ptr [ecx] EBX=00000001 main msvcrt.75AA80ED sub esi, ebx ESI=0000003E ;      DWORD' main msvcrt.75AA80EF jne msvcrt.75AA8178 main msvcrt.75AA8178 xor ebx, ebx EBX=00000000 ;     ebx main msvcrt.75AA817A test esi, esi main msvcrt.75AA817C setg bl EBX=00000001 main msvcrt.75AA817F lea ebx, [ebx+ebx-1] main msvcrt.75AA8183 mov esi, ebx ESI=00000001 main msvcrt.75AA8185 test esi, esi main msvcrt.75AA8187 jne msvcrt.75A98AB1 main msvcrt.75A98AB1 mov eax, esi EAX=00000001 main msvcrt.75A98AB3 jmp msvcrt.75A97A1E main msvcrt.75A97A1E pop ebx EBX=00852AE0, ESP=0041EC6C main msvcrt.return1 pop edi ESP=0041EC70, EDI=034C53B8 main msvcrt.75A97A20 pop esi ESP=0041EC74, ESI=034C53B0 main msvcrt.75A97A21 pop ebp ESP=0041EC78, EBP=0041ECC4 main msvcrt.75A97A22 ret ESP=0041EC7C 



рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреА рдирдЬрд░ рдХреЛ рдпрд╣рд╛рдВ рдкрдХрдбрд╝рддреА рд╣реИ, рд╡рд╣ рд╣реИ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ, рдпрд╛рдиреАред рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрд╣рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рдЧрд┐рдирддреА [0..4] рдХреЗ рднреАрддрд░ рд╣реИ, рдХрд╛рдлреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рд╣реИред рдХреЛрдИ рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реНрд╡рд┐рдЪ рдХреНрд▓реЙрдЬрд╝ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдпрд╛ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╡рд╣рд╛рдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдЪреЗрдХ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдШрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╕реНрд╡рд┐рдЪ рдерд╛ред рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдХрд╛рдлреА рдЙрдЪрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реВрдк рдЖрд░рдВрднреАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреВрд╕рд░реА рдЪреАрдЬ рдЬреЛ рддреБрд░рдВрдд рдореЗрд░реА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрддреА рд╣реИ рд╡рд╣ edx рд░рдЬрд┐рд╕реНрдЯрд░ (рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдореЗрдВ 0x20 рдирдВрдмрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдерд╛ред рдпрд╣ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХрд▓рди рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдпрд╣ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд░реНрде рд╣реИ: рд╕реНрдЯреИрдХ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдкрд╣реБрдВрдЪ рд╣рдореЗрд╢рд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рд╣реЛрддреА рд╣реИред рдореИрдВ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджреНрдпрдо рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЗрдирд▓рд╛рдЗрди рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рд╣реИред

рдмрдлрд╝рд░реНрд╕ рдореЗрдВ рджреЛрд╣рд░реЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдЕрдВрддрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, 0x75AA8178 рдкрддреЗ рдкрд░ рд╕рдВрдХреНрд░рдордг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реНрд░реЛрдд рдмрдлрд╝рд░реНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдПрд╕рдЖрдИрдЖрдИ рдФрд░ рдИрдмреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдВрддрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд┐рд░ рдЗрди рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдкреВрд░реЗ рдбрдмрд▓ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЙрд╕ рдмрд╛рдЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ DWORD рдореЗрдВ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рдЕрдиреБрд░реЗрдЦрдг рд▓реЙрдЧ рдореЗрдВ рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдиреБрдХреНрд░рдорд┐рдХ рдбрдмрд▓ рд╢рдмреНрдж рдмрд╛рдЗрдЯ рддреБрд▓рдирд╛
 ;Address Hex dump Command Comments 75AA80E7 > 0FB630 movzx esi, byte ptr [eax] 75AA80EA . 0FB619 movzx ebx, byte ptr [ecx] 75AA80ED . 2BF3 sub esi, ebx ;      DWORD' 75AA80EF .- 0F85 83000000 jne msvcrt.75AA8178 ;       ebx 75AA80F5 > 0FB670 01 movzx esi, byte ptr [eax+1] 75AA80F9 . 0FB659 01 movzx ebx, byte ptr [ecx+1] 75AA80FD . 2BF3 sub esi, ebx 75AA80FF .- 0F84 1EF9FEFF je msvcrt.75A97A23 ;    75A97A23 > 0FB670 02 movzx esi, byte ptr [eax+2] 75A97A27 . 0FB659 02 movzx ebx, byte ptr [ecx+2] 75A97A2B . 2BF3 sub esi, ebx 75A97A2D .- 74 15 je short msvcrt.75A97A44 ;    75A97A44 > 0FB670 03 movzx esi, byte ptr [eax+3] 75A97A48 . 0FB659 03 movzx ebx, byte ptr [ecx+3] 75A97A4C . 2BF3 sub esi, ebx 75A97A4E .- 0F84 5F190000 je msvcrt.75A993B3 ;  -   75A97A54 . 33DB xor ebx, ebx ;     ebx 75A97A56 . 85F6 test esi, esi 75A97A58 . 0F9FC3 setg bl 75A97A5B . 8D5C1B FF lea ebx, [ebx+ebx-1] 75A97A5F . 8BF3 mov esi, ebx 75A97A61 .- E9 4D190000 jmp msvcrt.75A993B3 ;    75A993B1 . |33F6 xor esi, esi 75A993B3 > |85F6 test esi, esi 75A993B5 .-|0F85 F6F6FFFF jne msvcrt.75A98AB1 



рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЕрдиреБрдХреНрд░рдорд┐рдХ рддреБрд▓рдирд╛ рджреЛрд╣рд░реЗ рд╢рдмреНрджреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдмрд╛рдЗрдЯ рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреБрдЫ рдЕрдЬреАрдм рд╣реИ, рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рднреА рдЕрдЬреАрдм рд╣реИред

рдкрд╣рд▓реЗ рджреВрд╕рд░реЗ рдЯреНрд░реЗрд╕ рдХреЗ рд▓реЙрдЧ рдХреЛ рджреЗрдЦреЗрдВ: рд▓реВрдк рдХреЗ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ 8 рджреЛрд╣рд░реЗ рд╢рдмреНрджреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ: рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд▓реВрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдУрд░, рдкреНрд░рддреНрдпреЗрдХ рддреБрд▓рдирд╛ рдХреЗ рдмрд╛рдж, рдареАрдХ рдЙрд╕реА рдмреЗрдХрд╛рд░ рдХреЛрдб рдХреЛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: 0: esi рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ esi рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ред рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХреБрдЫ рдореИрдХреНрд░реЛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ Microsoft C рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ред
рджреВрд╕рд░рд╛ рдирд┐рд╢рд╛рди (рдХреЗрд╡рд▓ рд▓реВрдк)
 ;--------------------------------   main msvcrt.75A979B0 cmp edi, edx main msvcrt.75A979B2 jae msvcrt.75A993A7 main msvcrt.75A993A7 mov esi, [eax] ESI=00000000 main msvcrt.75A993A9 cmp esi, [ecx] main msvcrt.75A993AB jne msvcrt.75AA80E7 main msvcrt.75A993B1 xor esi, esi main msvcrt.75A993B3 test esi, esi main msvcrt.75A993B5 jne msvcrt.75A98AB1 main msvcrt.75A993BB mov esi, [eax+4] main msvcrt.75A993BE cmp esi, [ecx+4] main msvcrt.75A993C1 jne msvcrt.75AA811F main msvcrt.75A993C7 xor esi, esi main msvcrt.75A993C9 test esi, esi main msvcrt.75A?993CB jne msvcrt.75A98AB1 main msvcrt.75A993D1 mov esi, [eax+8] main msvcrt.75A993D4 cmp esi, [ecx+8] main msvcrt.75A993D7 jne msvcrt.75A97A9A main msvcrt.75A993DD xor esi, esi main msvcrt.75A993DF test esi, esi main msvcrt.75A993E1 jne msvcrt.75A98AB1 main msvcrt.75A993E7 mov esi, [eax+0C] main msvcrt.75A993EA cmp esi, [ecx+0C] main msvcrt.75A993ED jne msvcrt.75A97B1F main msvcrt.75A993F3 xor esi, esi main msvcrt.75A993F5 test esi, esi main msvcrt.75A993F7 jne msvcrt.75A98AB1 main msvcrt.75A993FD mov esi, [eax+10] main msvcrt.75A99400 cmp esi, [ecx+10] main msvcrt.75A99403 jne msvcrt.75A97BA4 main msvcrt.75A99409 xor esi, esi main msvcrt.75A9940B test esi, esi main msvcrt.75A9940D jne msvcrt.75A98AB1 main msvcrt.75A99413 mov esi, [eax+14] main msvcrt.75A99416 cmp esi, [ecx+14] main msvcrt.75A99419 jne msvcrt.75A97C29 main msvcrt.75A9941F xor esi, esi main msvcrt.75A99421 test esi, esi main msvcrt.75A99423 jne msvcrt.75A98AB1 main msvcrt.75A99429 mov esi, [eax+18] main msvcrt.75A9942C cmp esi, [ecx+18] main msvcrt.75A9942F jne msvcrt.75AA1172 main msvcrt.75A99435 xor esi, esi main msvcrt.75A99437 test esi, esi main msvcrt.75A99439 jne msvcrt.75A98AB1 main msvcrt.75A9943F mov esi, [eax+1C] main msvcrt.75A99442 cmp esi, [ecx+1C] main msvcrt.75A99445 jne msvcrt.75A97CFC main msvcrt.75A9944B xor esi, esi main msvcrt.75A9944D test esi, esi main msvcrt.75A9944F jne msvcrt.75A98AB1 main msvcrt.75A99455 add eax, edx EAX=031353B8 main msvcrt.75A99457 add ecx, edx ECX=031353B8 main msvcrt.75A99459 sub edi, edx EDI=0007FFE0 main msvcrt.75A9945B jmp msvcrt.75A979B0 



рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рдмрдбрд╝реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░, рдЗрд╕ рдХреЛрдб рдиреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ ~ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 10% рдмрджрддрд░ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдореЗрдореЛрд░реА рд╕реЗ рд░реАрдб рдСрдкрд░реЗрд╢рдВрд╕ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИ рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд░рдЬрд┐рд╕реНрдЯрд░ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдЧрдВрднреАрд░ рдЕрдВрддрд░, рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдореИрдВ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджреНрдпрдо рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХрдордЬреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдо рдШрдбрд╝реА рдХреА рдЧрддрд┐ рд╡рд╛рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рджреЗрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


  1. рдпрджрд┐ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЫреЛрдЯреЗ (7 рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рдХрдо) рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд▓реЗрддреЗ рд╣реИрдВ (рдмрд╛рдЗрдЯ рдХреА рддреБрд▓рдирд╛ рд▓реВрдк рдореЗрдВ), рдмрдбрд╝реЗ рд╡рд╛рд▓реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рд╕рдм рдЪрд╛рд▓рд╛рдХ рд╣реИред
  2. .Net CLR . , JIT- , , CLR ┬л┬╗ . . JIT- , . тАФ C++- Intel, , (AMD Intel) .
  3. C-RunTime , , C- тАУ MS VC. ┬л ┬╗ (http://rsdn.ru/article/optimization/optimization.xml): ┬л , , ┬╗.



  1. Intel┬о 64 and IA-32 Architectures Software Developer Manuals .CHAPTER 2. Intel ┬о 64 Architecture
  2. AMD64 Architecture Programmer's Manual Volume 1 : Application Programming CHAPTER 1 Long Mode
  3. Intel┬о 64 and IA-32 Architectures Optimization Reference Manual . CHAPTER 3. Alignment
  4. Windows Internals, Sixth Edition, Part 1, CHAPTER 5 Processes, Threads, and Jobs
  5. Windows Internals, Sixth Edition, Part 2, CHAPTER 10. Memory Management
  6. Intel┬о 64 and IA-32 Architectures Software Developer Manuals. CHAPTER 17. TIME-STAMP COUNTER
  7. MSDN Magazine 2005, May: Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects
  8. Joe Duffy, Professional .NET Framework 2.0 (Programmer to Programmer). Chapter 3: Inside the CLR, Just-In-Time (JIT) Compilation




21.03.2014 4:37



рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЧрд▓рдд рд╕реНрд░реЛрдд рдкреЛрд╕реНрдЯ рдХрд┐рдП рдереЗред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛, рдпрд╛ рднрд╛рдЧ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд╕реНрд░реЛрдд рдХреЛрдб рд▓реЗрдЦ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдереЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдЙрдиреНрд╣реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛, рд╡реЗ рд▓реЗрдЦ рд╕реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдереЗред
рдореИрдВрдиреЗ рд╕рд╣реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╣рд╛рдВ
рд░рдЦреАрдВ рдЬрдмрдХрд┐ рдореИрдВ рдЯрд╛рдЗрдкреЛ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рд░рд╣рд╛ рдерд╛, рд╕рд▓рд╛рджреАрди рдиреЗ рдЧрд┐рдЯрд╣рдм рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдФрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ , рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди рдмрд╕ рджреЗрдЦреЛред

25 рдорд╛рд░реНрдЪ 2014 рдХреЛ рд╕реБрдмрд╣ 6:37 рдмрдЬреЗ рддрдХ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред


рд▓реЛрдХрдкреНрд░рд┐рдп рдорд╛рдВрдЧ рд╕реЗ, рдореИрдВрдиреЗ рд╢реЛрдз рдХрд┐рдпрд╛ RtlCompareMemory()ред

рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП SuppressUnmanagedCodeSecurity рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ memcmp()рдФрд░ рдпрд╣ RtlCompareMemory()
рдЙрддреНрд╕реБрдХ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдореЛрдб рдФрд░ рдХрд░реНрдиреЗрд▓-рдореЛрдб рджреЛрдиреЛрдВ рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕реАрдЖрд░рдЯреА рд╕реЗрдЯ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ред
рдпрджрд┐ рд╕реНрдореГрддрд┐ рдХреЗ рджреЛрдиреЛрдВ рдмреНрд▓реЙрдХ рдирд┐рд╡рд╛рд╕реА рд╣реИрдВ, рддреЛ RtlCompareMemory рдХреЗ рдХреЙрд▓рд░ рдХрд┐рд╕реА рднреА IRQL рдкрд░ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд┐рд▓реНрд▓реА рдХреЗ рддрд╣рдд рдкрд░рд┐рдгрд╛рдо
     Unsafe MemCMP RtlCompareMemory   1 279 1 : 001,7 1 : 003,2 1 : 008,8 1 : 001,0 1 278 1 : 001,8 1 : 003,2 1 : 008,9 1 : 001,0 2 325 1 : 001,3 1 : 002,9 1 : 006,1 1 : 001,0 4 374 1 : 001,1 1 : 002,6 1 : 009,0 1 : 001,0 7 422 1 : 001,0 1 : 002,5 1 : 007,0 1 : 001,1 12 426 1 : 001,0 1 : 002,5 1 : 006,9 1 : 001,7 19 490 1 : 001,0 1 : 002,2 1 : 006,0 1 : 001,9 32 560 1 : 001,0 1 : 002,0 1 : 005,3 1 : 002,7 54 622 1 : 001,0 1 : 002,0 1 : 005,4 1 : 003,8 89 802 1 : 001,0 1 : 001,7 1 : 004,3 1 : 004,7 147 1092 1 : 001,0 1 : 001,5 1 : 003,7 1 : 004,0 242 1571 1 : 001,0 1 : 001,4 1 : 003,0 1 : 004,2 398 2328 1 : 001,0 1 : 001,4 1 : 002,7 1 : 004,5 657 3664 1 : 001,0 1 : 001,2 1 : 002,2 1 : 004,6 1082 5519 1 : 001,0 1 : 001,2 1 : 002,1 1 : 005,0 1782 8554 1 : 001,0 1 : 001,2 1 : 002,1 1 : 005,3 2936 13520 1 : 001,0 1 : 001,2 1 : 002,0 1 : 005,5 4837 21771 1 : 001,0 1 : 001,2 1 : 002,0 1 : 005,6 7967 35464 1 : 001,0 1 : 001,2 1 : 001,9 1 : 005,7 13124 58073 1 : 001,0 1 : 001,2 1 : 001,9 1 : 005,7 21618 96457 1 : 001,0 1 : 001,2 1 : 001,9 1 : 005,7 35610 167952 1 : 001,0 1 : 001,1 1 : 001,8 1 : 005,4 58656 285282 1 : 001,0 1 : 001,1 1 : 001,8 1 : 005,3 96617 534712 1 : 001,0 1 : 001,1 1 : 001,6 1 : 004,7 159146 924569 1 : 001,0 1 : 001,1 1 : 001,6 1 : 004,5 262143 1520968 1 : 001,0 1 : 001,1 1 : 001,6 1 : 004,5 


рдбреАрдмрдЧрд░ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрд╕реНрдХрд░рдг



рд╕рдорд╛рд░реЛрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдЫреЛрдЯрд╛ рдирд┐рдХрд▓рд╛, рдпрд╣ рд╕рдм рдпрд╣рд╛рдВ рд╣реИ, рдХрдЯ рдХреЗ рддрд╣рддред рдлрд╝рдВрдХреНрд╢рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЙрдкрд╕рд░реНрдЧ ( cmps*) рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛рддреНрдордХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред рдореЗрдореЛрд░реА рдХреА рддреБрд▓рдирд╛ рд╕реАрдзреЗ рдХреНрд░рдо рдореЗрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ DF рдзреНрд╡рдЬ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ cldред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рд╕рд░рд▓рддрд╛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред
рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдЖрдЧреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ DWORDs рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛:
 repe cmpsd ;    ecx  DWORD'; 

рдЬрд╛рд╡рд╛ рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  while ( ( 0 != ecx ) & ( 0 == Compare( (DWORD) RAM[esi], (DWORD) RAM[edi] ) ) ) { --ecx; edi += 4; esi += 4; } 

рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рдЬрдм рдЖрдк рд╢рдмреНрджреЛрдВ рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдЯ рдХреЗ рддрд╣рдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд▓рд╛рдЬреНрдорд╛
  push esi ;      push edi cld ; DF <-- 0 mov esi, [esp+0C] ; esi <-- Source1 mov edi, [esp+10] ; edi <-- Source2 mov ecx, [esp+14] ; ecx <-- SIZE_T shr ecx, 2 ; ecx <-- (ecx >> 2) (    4) jz short smaller_4 ; repe cmpsd ;    ecx  DWORD'; jne short not_zero ; if ( !ZF ) goto not_zero; smaller_4: mov ecx, [esp+14] ; ecx <-- SIZE_T and ecx, 00000003 ; ecx &= 3 jz short return_SIZE_T ; if ( ZF ) goto return_SIZE_T; repe cmpsb ;     jne short found_difference return_SIZE_T: mov eax, [esp+14] ; eax <-- SIZE_T pop edi ;    pop esi ret 0C ; return eax not_zero: sub esi, 4 ; esi -= 4 sub edi, 4 ; edi -= 4 mov ecx, 4 ; ecx -= 4 repe cmpsb ;     found_difference: dec esi ; --esi sub esi, [esp+0C] ; esi <-- (esi - Source1) mov eax, esi ; eax <-- esi pop edi ;    pop esi ret 0C ; return eax 

Source: https://habr.com/ru/post/In214841/


All Articles