HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: циклы, машинный код, реверс-инжининиринг, ассемблерное представление</p>
1 <p>Теги: циклы, машинный код, реверс-инжининиринг, ассемблерное представление</p>
2 <p>В этой статье мы заглянем под капот циклов. Циклы в программировании относятся к основным концепциям, поэтому реверс-инженер обязан знать, на каких принципах строится программный кода и как читать код ассемблерный.</p>
2 <p>В этой статье мы заглянем под капот циклов. Циклы в программировании относятся к основным концепциям, поэтому реверс-инженер обязан знать, на каких принципах строится программный кода и как читать код ассемблерный.</p>
3 <h2>Цикл for</h2>
3 <h2>Цикл for</h2>
4 <p>В первую очередь рассмотрим цикл for:</p>
4 <p>В первую очередь рассмотрим цикл for:</p>
5 void forloop (int max) { // самый обычный цикл for for (int i = 0; i &lt; max; ++i){ printf("%i \n", i); } }<p>Теперь давайте посмотрим на графическое представление этого цикла, то есть на ассемблерный граф:</p>
5 void forloop (int max) { // самый обычный цикл for for (int i = 0; i &lt; max; ++i){ printf("%i \n", i); } }<p>Теперь давайте посмотрим на графическое представление этого цикла, то есть на ассемблерный граф:</p>
6 <p>Но прежде, чем мы разобъём ассемблерный код на мелкие части, рассмотрим общий вариант. Как видно, когда запускается цикл for, у него существуют 2 варианта: • перейти к блоку справа (отмечено зелёной стрелкой) и вернуться в основную программу; • перейти к блоку слева (отмечено красной стрелкой) и вернуться к началу цикла for.</p>
6 <p>Но прежде, чем мы разобъём ассемблерный код на мелкие части, рассмотрим общий вариант. Как видно, когда запускается цикл for, у него существуют 2 варианта: • перейти к блоку справа (отмечено зелёной стрелкой) и вернуться в основную программу; • перейти к блоку слева (отмечено красной стрелкой) и вернуться к началу цикла for.</p>
7 <p><em>Подробное графическое представление цикла for:</em></p>
7 <p><em>Подробное графическое представление цикла for:</em></p>
8 <p>Поначалу сравнивают переменные i и max, что делается в целях проверки, достигла ли переменная значения максимума. Если переменная i не больше либо не равняется переменной max, подпрограмма идёт по красной стрелке (вниз и влево) и выводит переменную i, потом i увеличивается на 1 и происходит возврат к началу цикла. Когда переменная i больше либо равна max, подпрограмма идёт по зелёной стрелке, то есть выходит из цикла for и возвращается в основную программу.</p>
8 <p>Поначалу сравнивают переменные i и max, что делается в целях проверки, достигла ли переменная значения максимума. Если переменная i не больше либо не равняется переменной max, подпрограмма идёт по красной стрелке (вниз и влево) и выводит переменную i, потом i увеличивается на 1 и происходит возврат к началу цикла. Когда переменная i больше либо равна max, подпрограмма идёт по зелёной стрелке, то есть выходит из цикла for и возвращается в основную программу.</p>
9 <h2>Цикл while</h2>
9 <h2>Цикл while</h2>
10 <p>Теперь посмотрим на цикл while:</p>
10 <p>Теперь посмотрим на цикл while:</p>
11 void whileloop() { // цикл while int A = 0; while (A&lt;10) { A = 0 + (rand()%(int)(20-0+1)) } printf("I'm out!"); }<p>Здесь циклически генерируется случайное число в пределах от 0 до 20. Когда число больше 10, происходит выход из цикла, что сопровождается фразой "I’m out!". В обратном случае работа в цикле продолжится.</p>
11 void whileloop() { // цикл while int A = 0; while (A&lt;10) { A = 0 + (rand()%(int)(20-0+1)) } printf("I'm out!"); }<p>Здесь циклически генерируется случайное число в пределах от 0 до 20. Когда число больше 10, происходит выход из цикла, что сопровождается фразой "I’m out!". В обратном случае работа в цикле продолжится.</p>
12 <p>Что касается машинного кода, то здесь переменная А сначала инициализируется и приравнивается к нулю, а потом инициализируется цикл, а переменная A сравнивается с 16-ричным числом 0A, равным 10 в десятичной системе исчисления. Когда А не больше и не равняется 10, генерируется новое случайное число, записываемое в А, поэтому снова происходит сравнение. Когда А больше либо равняется 10, происходит выход из цикла с возвратом в основную программу.</p>
12 <p>Что касается машинного кода, то здесь переменная А сначала инициализируется и приравнивается к нулю, а потом инициализируется цикл, а переменная A сравнивается с 16-ричным числом 0A, равным 10 в десятичной системе исчисления. Когда А не больше и не равняется 10, генерируется новое случайное число, записываемое в А, поэтому снова происходит сравнение. Когда А больше либо равняется 10, происходит выход из цикла с возвратом в основную программу.</p>
13 <p><em>По материалам статьи "<a>BOLO: Reverse Engineering - Part 1 (Basic Programming Concepts)</a>"</em>.</p>
13 <p><em>По материалам статьи "<a>BOLO: Reverse Engineering - Part 1 (Basic Programming Concepts)</a>"</em>.</p>
14  
14