#dotnet #microsoft #программирование Функция из 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
Все 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