Другие языки программирования и технологии

Вопрос по ассемблеру

Здравствуйте! Есть вопрос по ассемблеру, я начал вникать в него совсем не давно, и есть вопрос. Есть код ассемблеровский:

00007FF74587235E | 45 85 D2 | test r10d,r10d
00007FF745872361 | 75 52 | jne 7FF7458723B5
00007FF745872363 | 48 83 0D A5 5C 00 00 FF | or qword ptr ds:[7FF745878010],FFFFFFFFFFFFFFFF
00007FF74587236B | 41 83 C8 04 | or r8d,4
00007FF74587236F | 25 F0 3F FF 0F | and eax,FFF3FF0
00007FF745872374 | 44 89 05 6D 5E 00 00 | mov dword ptr ds:[7FF7458781E8],r8d
00007FF74587237B | 3D C0 06 01 00 | cmp eax,106C0
00007FF745872380 | 74 28 | je 7FF7458723AA
00007FF745872382 | 3D 60 06 02 00 | cmp eax,20660
00007FF745872387 | 74 21 | je 7FF7458723AA
00007FF745872389 | 3D 70 06 02 00 | cmp eax,20670
00007FF74587238E | 74 1A | je 7FF7458723AA
00007FF745872390 | 05 B0 F9 FC FF | add eax,FFFCF9B0
00007FF745872395 | 83 F8 20 | cmp eax,20
00007FF745872398 | 77 1B | ja 7FF7458723B5
00007FF74587239A | 48 BB 01 00 01 00 01 00 | mov rbx,100010001
00007FF7458723A4 | 48 0F A3 C3 | bt rbx,rax
00007FF7458723A8 | 73 0B | jae 7FF7458723B5
00007FF7458723AA | 41 83 C8 01 | or r8d,1
00007FF7458723AE | 44 89 05 33 5E 00 00 | mov dword ptr ds:[7FF7458781E8],r8d
00007FF7458723B5 | 45 85 DB | test r11d,r11d

Можете объяснить как работает код на примерах c++, или c# языках.. или просто на словах сказать, почему test r10d сравнивает с таким же r10d ?
Проще отлаживать и смотреть что происходит не в дизассемблере, а в дебагере. Например в xdbg, но сложность будет в понимании как работает программа. У меня уже был опыт в работе с дебагерами, поэтому вполне быстро освоился и с этим. У вас скорее всего могут возникнуть проблемы...
test r10d,r10d ;проверка значения на ноль
jne endif;переход на метку если не равно нулю
or qword ptr ds:[7FF745878010],FFFFFFFFFFFFFFFF ;сделать какую то переменную равной 0xFFFFFFFFFFFFFFFF
or r8d,4;установить 2-ой бит в регистре 4 = 100b
and eax,FFF3FF0;сбросить биты согласно маске 1111111111110011111111110000b
mov dword ptr ds:[7FF7458781E8],r8d ;сохранить регистр в котором устанавливали 2-ой бит
cmp eax,106C0;проверка регистра на какие то значения и если равен
je switch1;то переход на метку
cmp eax,20660; --//--
je switch1; --//--
cmp eax,20670; --//--
je switch1; --//--
add eax,FFFCF9B0;добавляют какое то число к регистру
cmp eax,20;сравнивают получившийся результат с числом 32(больше 32 бит)
ja endif;если больше то переход на метку
mov rbx,100010001;устанавливают биты которые интересны
bt rbx,rax;если число в rax равно одному из порядковому номеру бит ресистра rbx(были установленны 0, 4, 8 биты)
jae endif;будет установлен флаг переноса и тогда будет переход как тут еще учавствует равенство для меня не понятно, видимо из предыдущего сравнения
switch1:
or r8d,1;установить нулевой бит в регистре
mov dword ptr ds:[7FF7458781E8],r8d;сохранить регистр
endif:
test r11d,r11d
Александр Янгулбиев
Александр Янгулбиев
15 398
Лучший ответ
Борис Шашков С деббагером x64dbg я знаком.. Но я пытаюсь запустить приложение через него, но кроме загрузки библиотек в журнале ничего не отражается, не процесс загрузки, ничего.. только вот загрузил библиотеки и выводит сообщение...
В test r10d,r10d проводится проверка на ноль, если не равно нулю, будет сделан переход на последнюю строчку, где происходит то же самое но с другой переменной...
Семён Борисов
Семён Борисов
8 452