Привіт і ласкаво просимо назад.
У цьому уроці я познайомлю вас зі структурованим програмуванням.
Проблема.
Невибіркове використання інструкцій переходу може призвести до спагеті-коду.
Спагеті-код - це код, який важко читати і розуміти, і, як наслідок, важко налагоджувати.
Це тому, що стрибок перенесе вас у будь-яку частину програми без будь-якої видимої, очевидної структури.
І тому його називають спагеті-кодом,
так само, як виглядають спагеті, коли вони переплетені одна з одною.
Отже, рішення.
Рішення - це структуроване програмування.
У цьому рішенні ми використовуємо конструкції програмування високого
рівня, HLPC, і реалізуємо їх за допомогою асемблерних переходів.
Прикладами HLPC є блоки if-else та цикли.
Ось приклад високорівневої конструкції програмування.
У цьому випадку це оператор if-else, який зустрічається майже у всіх мовах високого рівня.
А це простий псевдокод.
Це не зовсім програмування на C, але це просто спрощений вираз, щоб дати вам основну концепцію.
Отже, тут ми порівнюємо дві змінні.
У цьому випадку ми використовуємо регістри - і -.
Отже, тут є два блоки коду:
частина if та частина else.
Частина if буде виконана, тільки якщо цей оператор істинний.
Отже, якщо - менше за -, то вона візьме значення з -, збільшить його на одиницю і поверне назад до -, інакше ви візьмете
значення з -, зменшите його на одиницю і повернете назад до -.
А потім ви завершите блок if-else.
Якщо ви збираєтеся реалізувати це на мові асемблера, то, ймовірно, це буде виглядати саме так.
Ми будемо порівнювати - і -, а потім, якщо значення в - більше або дорівнює -, тобто якщо воно вище
- або дорівнює -, то відбудеться перехід на адресу пам'яті else.
Отже, адреса пам'яті else є частиною блоку else.
А тут буде зменшуватися -.
Однак, якщо це не так, якщо - не перевищує або не дорівнює -, то це означає, що - менше або менше його.
У такому випадку він не буде стрибати.
Він провалиться і збільшить значення на -.
І це відповідне твердження в псевдокоді.
Тому зверніть увагу, що нам потрібно реалізувати тут стрибок, щоб код не провалювався, і декремент -.
Отже, вам потрібно вискочити з частини if і перестрибнути через частину else.
Інакше він просто провалиться і зменшиться -.
Отже, нам потрібно мати
два стрибки: один - умовний, інший - безумовний.
Отже, якщо ви пишете код таким чином, завжди пам'ятаючи про високорівневу конструкцію програмування, то ваш асемблерний код буде більш читабельним.
У цьому полягає сенс використання концепцій структурованого програмування у вашому асемблерному коді.
Зауважте також, що якщо ваш оператор if не має частини else, то ви можете опустити цю частину.
Не потрібно перестрибувати, бо іншої частини тут не буде.
Тож це необхідно лише в тому випадку, якщо у вас є інша частина.
Тому про це важливо пам'ятати щоразу, коли ви думаєте про використання операторів if-else в асемблері.
Тепер ми спробуємо реалізувати це в x64dbg.
Отже, відкриваємо шаблон і починаємо вводити наш код.
Тут ми зробимо
порівняння.
Натисніть пробіл і введіть код.
Порівняйте -,-.
Натисни Enter.
Стрибайте вище або дорівнюйте,
інакше. Отже, частина else - це просто адреса пам'яті.
Отже, оскільки ми ще не знаємо, скільки байт зміщення буде потрібно, ми просто тимчасово запишемо сюди довільну адресу.
Пізніше ми його змінимо.
Отже, вводимо - наприклад, ми можемо вибрати
ось це: 00401543, 00401543, 2. Гаразд.
Потім ми збільшимо -, тому вводимо INC - і переходимо до переходу.
І тут ми також не знаємо фактичного зміщення, тому просто беремо будь-яке тимчасове.
Наприклад, 00401548, тому вводимо 00401548 і натискаємо ОК.
Тож тепер ми можемо змінити цю адресу.
Як ви можете бачити, ця частина повинна переходити до інструкції зменшення, яка знаходиться в блоці else.
Отже, в цьому випадку ми переходимо до декременту, в який ми ще не входили.
Отже, тепер нам потрібно ввести декремент: DEC -, -.
Потім ми копіюємо цю адресу сюди,
а ви заходите сюди і змінюєте цю адресу.
Просто вставте його.
Гаразд. Гаразд.
Тепер, якщо ми перевіримо логіку, якщо - більше або дорівнює -, то ми перейдемо до частини декременту, так само як і
тут, якщо ми перейдемо до частини else до декременту.
Однак, якщо - менше, ніж -, то стрибок не відбудеться.
Він буде провалюватися і збільшуватися - так само, як і тут.
Він провалиться і збільшиться -.
Тож тепер ми можемо це врятувати, ми це латаємо.
І давайте дамо йому
ім'я: 36,
structured-pro. X36-структурований проект.
Потім натискаємо "Зберегти".
Тепер відкриваємо нашу нову програму і запускаємо її.
Прокрутіть вниз, переконайтеся, що тут є точка зупинки, і запустіть її.
Переступайте, поки не дійдете до цієї лінії.
Тепер ми змінимо значення в - так, щоб - було менше, ніж -.
Отже, ми можемо двічі клацнути на цьому,
- зареєструватися, і давайте вставимо туди один.
Тепер давайте перейдемо до - і поставимо двійку.
Тож двічі клацніть - і поставте два.
Тож зараз ми порівняємо - і -.
- один.
- це два.
Тож ми будемо порівнювати. Переступите через це, і ви побачите, що стрибок не відбудеться,
тому що - менше, нижче, нижче -.
Це не вище -.
Вона не дорівнює -.
Цей стрибок відбудеться лише тоді, коли він буде вищим або рівним.
Ти ж бачиш.
Тож він не збирається стрибати.
Він піде прямо.
Тож давайте переступимо, і вона буде збільшуватися - на одиницю.
Тож - тепер один.
Тож коли ви переступите через неї, вона стане двома.
І після цього безумовний перехід перестрибне через цю декрементну частину, тому що це частина else.
Тож давай переступимо.
І тепер він перестрибує через частину приросту.
Тож давайте спробуємо перезапустити це.
Але цього разу ми поставимо значення - більше, ніж -.
Тож давайте почнемо спочатку.
Тож давайте повернемося сюди і побіжимо до нашого брейк-пойнту, переступатимемо, поки не дійдемо до порівняння.
Але цього разу ми зробимо так, щоб - стало більшим за -, тому ми додамо два до - і одне до -.
Тож давайте двічі клацнемо на - перший і вставимо туди два.
Натисни ОК.
Потім ми двічі клацнемо на - і введемо туди один і натиснемо ОК.
Тепер ми помітимо, що - це два, а - це один.
Отже, - більше або дорівнює -.
Тож давайте переступимо через порівняння, і зараз ви побачите, що стрибок-якщо-вище-або-рівно відбудеться, відбудеться.
Таким чином, вона перестрибне вище цієї інструкції INC і перейде безпосередньо до інструкції декременту.
Тож давайте зробимо крок і подивимося. Стрибайте і переступайте знову.
А зараз вона зменшилася - на одиницю.
Так - стає одним цілим.
Ось так ми можемо використовувати конструкції програмування високого рівня для реалізації оператора if-else всередині асемблера.
Це все для цього відео.
Побачимося в наступному.
Дякуємо за перегляд.