HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>В этой статье мы в очередной раз заглянем под капот программного обеспечения. Посмотрим, как выглядят условные операторы и операторы выбора<strong>в ассемблерном графе</strong>.</p>
1 <p>В этой статье мы в очередной раз заглянем под капот программного обеспечения. Посмотрим, как выглядят условные операторы и операторы выбора<strong>в ассемблерном графе</strong>.</p>
2 <h2>Условные операторы</h2>
2 <h2>Условные операторы</h2>
3 <p>В первую очередь рассмотрим код условного оператора:</p>
3 <p>В первую очередь рассмотрим код условного оператора:</p>
4 <p>Данная функция генерирует рандомное число в диапазоне 0-20, сохраняя получаемое значение в переменной А. Когда А больше 15, программа выводит "greater than 15". Когда меньше 15, но больше 10 - выводится "less than 15, greater than 10". Когда меньше 5 - "less than 5", соответственно.</p>
4 <p>Данная функция генерирует рандомное число в диапазоне 0-20, сохраняя получаемое значение в переменной А. Когда А больше 15, программа выводит "greater than 15". Когда меньше 15, но больше 10 - выводится "less than 15, greater than 10". Когда меньше 5 - "less than 5", соответственно.</p>
5 <p>Теперь давайте глянем на ассемблерный граф для условного оператора:</p>
5 <p>Теперь давайте глянем на ассемблерный граф для условного оператора:</p>
6 <p>Можно заметить, что граф структурирован аналогично фактическому коду, так как сам условный оператор выглядит просто: "Если X, то Y, иначе Z". Когда мы посмотрим на первую верхнюю пару стрелок, то увидим, что оператору предшествует сравнение А с 0F - в десятичной системе счисления это 15. Если же А больше либо равно 15, подпрограмма выводит "greater than 15" и возвращается в основную программу. В ином случае происходит сравнение А с 0A (1010). Так продолжается, пока программа не выведет что-либо на экран и не вернётся.</p>
6 <p>Можно заметить, что граф структурирован аналогично фактическому коду, так как сам условный оператор выглядит просто: "Если X, то Y, иначе Z". Когда мы посмотрим на первую верхнюю пару стрелок, то увидим, что оператору предшествует сравнение А с 0F - в десятичной системе счисления это 15. Если же А больше либо равно 15, подпрограмма выводит "greater than 15" и возвращается в основную программу. В ином случае происходит сравнение А с 0A (1010). Так продолжается, пока программа не выведет что-либо на экран и не вернётся.</p>
7 <h2>Оператор выбора</h2>
7 <h2>Оператор выбора</h2>
8 <p>Этот оператор очень похож на оператор условия, но с той разницей, что одна переменная либо выражение сравнивается с несколькими "случаями", которые называют возможными эквивалентностями. Как обычно, сначала смотрим код:</p>
8 <p>Этот оператор очень похож на оператор условия, но с той разницей, что одна переменная либо выражение сравнивается с несколькими "случаями", которые называют возможными эквивалентностями. Как обычно, сначала смотрим код:</p>
9 <p>В данной функции переменная А получает рандомное значение в диапазоне 0-10. Потом А сравнивается с несколькими случаями, применяя switch. Когда значение А будет равняться одному из случаев, на экране появится соответствующее число, после чего произойдёт выход из оператора выбора с последующим возвратом в основную программу.</p>
9 <p>В данной функции переменная А получает рандомное значение в диапазоне 0-10. Потом А сравнивается с несколькими случаями, применяя switch. Когда значение А будет равняться одному из случаев, на экране появится соответствующее число, после чего произойдёт выход из оператора выбора с последующим возвратом в основную программу.</p>
10 <p>Тут есть нюанс: в отличие от условного оператора, этот оператор не следует правилу "Если X, то Y, иначе Z". В данном случае программа ведет себя несколько иначе, сравнивая входное значение с существующими случаями и выполняя лишь тот случай, который отвечает входному значению. Чтобы это понять, лучше рассмотреть 2 первых блока подробней:</p>
10 <p>Тут есть нюанс: в отличие от условного оператора, этот оператор не следует правилу "Если X, то Y, иначе Z". В данном случае программа ведет себя несколько иначе, сравнивая входное значение с существующими случаями и выполняя лишь тот случай, который отвечает входному значению. Чтобы это понять, лучше рассмотреть 2 первых блока подробней:</p>
11 <p>Итак, сначала генерируется рандомное число, которое записывается в А. Потом программа инициализирует оператор выбора, приравнивая временную переменную var_D0 к А. Далее программа осуществляет проверку, что она равна хотя бы одному из имеющихся случаев. Когда var_D0 требуется дефолтное значение, программа идет по зеленой стрелке в секцию, где происходит окончательный возврат из подпрограммы. В обратном случае программа совершает переход в нужный case.</p>
11 <p>Итак, сначала генерируется рандомное число, которое записывается в А. Потом программа инициализирует оператор выбора, приравнивая временную переменную var_D0 к А. Далее программа осуществляет проверку, что она равна хотя бы одному из имеющихся случаев. Когда var_D0 требуется дефолтное значение, программа идет по зеленой стрелке в секцию, где происходит окончательный возврат из подпрограммы. В обратном случае программа совершает переход в нужный case.</p>
12 <p>Когда var_D0 (A) равно 5, код переходит в секцию, показанную выше, выводит "5", а потом переходит в секцию возврата.</p>
12 <p>Когда var_D0 (A) равно 5, код переходит в секцию, показанную выше, выводит "5", а потом переходит в секцию возврата.</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