nekocave.xyz

# # #
Функция из 8 локальных переменных типа DWORD.
Последовательно копируешь значения из ulong[] в эти переменные. На каждую операцию присвоения генерируется 8 ассемблерных инструкций (я ожидал 2-3).
8 скоуповых переменных (а больше в методе и нет) лежат в стеке... в оперативке!
У тебя 12 регистров общего назначения. Из них используешь 2.




Что это за херня? Кто это говно писал?!
Это буквально какая-то параша!

Сука, надо реально попробовать сделать Attach to current process. Я просто не верю, что это говно реально так конпилится
В общем, вот что на самом деле генерирует код на C# после прогрева. Я не понимаю зачем постоянные cmp eax в начале, но в целом код норм. Но вот на плюсах, например, конпелятор понял, что мне не нужно на самом деле класть данные из памяти в регистры в самом начале. Здесь реально копирование данных.

Все 12 регистров задействуются. Мои хорошие♥

push rdi
push rsi
push rbp
push rbx
sub rsp,28h
mov eax,[rcx+8]
cmp eax,0
jbe near ptr 000000000040012Ah
mov rdx,[rcx+10h]
cmp eax,1
jbe near ptr 000000000040012Ah
mov r8,[rcx+18h]
cmp eax,2
jbe near ptr 000000000040012Ah
mov r9,[rcx+20h]
cmp eax,3
jbe near ptr 000000000040012Ah
mov r10,[rcx+28h]
cmp eax,4
jbe near ptr 000000000040012Ah
mov r11,[rcx+30h]
cmp eax,5
jbe near ptr 000000000040012Ah
mov rsi,[rcx+38h]
cmp eax,6
jbe near ptr 000000000040012Ah
mov rdi,[rcx+40h]
cmp eax,7
jbe near ptr 000000000040012Ah
mov rax,[rcx+48h]
mov rbx,a5a5a5a5a5a5a5a5h
xor rbx,rax
sub rdx,rbx
xor r8,rdx
add r9,r8
mov rbx,r8
not rbx
shl rbx,13h
xor rbx,r9
sub r10,rbx
xor r11,r10
add rsi,r11
mov rbx,r11
not rbx
shr rbx,17h
mov rbp,1FFFFFFFFFFh
and rbx,rbp
xor rbx,rsi
sub rdi,rbx
xor rax,rdi
add rdx,rax
mov rbx,rax
not rbx
shl rbx,13h
xor rbx,rdx
sub r8,rbx
xor r9,r8
add r10,r9
mov rbx,r9
not rbx
shr rbx,17h
and rbx,rbp
xor rbx,r10
sub r11,rbx
xor rsi,r11
add rdi,rsi
mov rbx,123456789ABCDEFh
xor rbx,rdi
sub rax,rbx
mov [rcx+10h],rdx
mov [rcx+18h],r8
mov [rcx+20h],r9
mov [rcx+28h],r10
mov [rcx+30h],r11
mov [rcx+38h],rsi
mov [rcx+40h],rdi
mov [rcx+48h],rax
add rsp,28h
pop rbx
pop rbp
pop rsi
pop rdi
ret
cmp наверное чтобы какой-то нужный флаг установить в true.
А зачем тогда постоянные cmp, jbe? При этом код пишет в регистр ebx, а проверяется eax