Привіт і ласкаво просимо назад.
Зараз ми розглянемо ще одну конструкцію програмування високого рівня, яка називається розрив (break).
Розрив - це метод, який дозволяє передчасно вийти з циклу.
Навіщо вам це робити?
Наприклад, ви можете мати два сценарії.
По-перше, можливо, ви шукаєте число в серії чисел, і коли ви дійшли до цього числа, ви хочете
зупинитися.
Або другий сценарій може бути таким: ви хочете підсумувати серію
чисел, і як тільки сума перевищить певне число, ви хочете вийти з циклу.
Це простий приклад того, як можна передчасно вирватися із зацикленості.
Розглянемо приклад, в якому потрібно підсумувати всі числа від 0 до 9, але вийти, якщо сума
дорівнює або більша за п'ять.
Отже, зліва - високорівневий псевдокод.
Отже, ми ініціалізуємо регістр - нулем, а регістр - також нулем.
Регістр - буде акумулятором, а - лічильником.
Потім ми використаємо конструкцію програмування високого рівня під назвою цикл
for, яку ми вивчали раніше, щоб перебрати всі значення від 0 до 9.
І для кожного з цих значень ми додамо його до - і збережемо результат назад до -.
Таким чином, ми отримаємо загальну суму.
І якщо сума -, яка зберігається в -, більша або дорівнює п'яти, ви хочете перерватися, це означає, що ви не збираєтеся
продовжувати виконання циклу.
Отже, це один із сценаріїв, де ви будете використовувати конструкцію break для передчасного виходу з циклу.
Тепер, щоб реалізувати це в асемблерному коді, ось один із способів зробити це.
Ви будете переміщати -, нуль; переміщати -, нуль для відповідних інструкцій тут, а потім ви входите в цикл for за
цією адресою, за цією адресою пам'яті.
Усередині цього циклу ви додаєте - і -, а потім порівнюєте, чи дорівнює значення в - п'яти.
Якщо воно дорівнює або більше п'яти, то ви перейдете до адреси поза циклом,
яка знаходиться тут, кінець циклу. Якщо воно не перевищує або не дорівнює, то ви продовжите виконання решти циклу, спочатку
збільшуючи значення в -, лічильнику, а потім порівнюючи, чи дорівнює лічильник десяти. - дорівнює десяти.
А якщо воно менше десяти, ви повернетесь назад, перестрибнете нижче для циклу for і продовжите знову.
Так триватиме доти, доки не виникне ситуація,
в якій це порівняння буде правдивим.
Це означає, що коли ви порівнюєте з п'ятьма, то це вище або дорівнює п'яти.
А отже, якщо стрибок-над-чи-рівно буде істинним, то він вийде з циклу за цією адресою пам'яті.
Спробуємо зробити це у x64dbg.
Відкрийте файл шаблону.
А потім прокрутіть вниз і введіть ці інструкції.
Перемістити -, нуль.
Перемістити -, нуль. ДОДАТИ -, -.
Порівняйте -, -, 5.
Стрибок вище або дорівнює, кінець для циклу.
Отже, цей кінець
циклу - це велика адреса внизу, десь тут.
Тож давайте підемо і скопіюємо одну адресу прямо тут, десь нижче.
Може, візьмемо цей.
Клацніть правою кнопкою миші та скопіюйте цю адресу.
А тут просто введіть JAE, а потім поставте шістку - вставте туди адресу.
Гаразд.
Далі буде приріст -, потім порівняння - з -, що дорівнює десяти, а потім стрибок нижче циклу for.
Це означає повернутися до циклу for.
Отже, цей перехід нижче, ця адреса циклу є адресою цієї інструкції,
ADD -, -.
Тож давайте підемо туди і скопіюємо цю адресу. ADD -, -, клацніть правою кнопкою миші на цій адресі, скопіюйте
адресу, поверніться сюди і введіть JB, перейдіть нижче і введіть там свою
адресу. Вставте його туди, натисніть OK і закрийте.
Тож тепер знайдіть хвилинку, щоб перевірити, чи правильно ви ввели код. Після того, як ви переконалися, що все
ввели правильно, ви можете зберегти його.
Отже, натискаємо Файл, Файл виправлення і даємо йому назву.
Назвемо це 39-обривним циклом. exe. Натисніть кнопку Зберегти, натисніть кнопку ОК, закрийте і зупиніть
це, і давайте відкриємо новостворений файл 39-break-loop. exe. А тепер прокрутіть вниз і переконайтеся, що там
є точка зупинки.
Тепер перейдіть до точки зупинки і почніть трасування.
Відійди. Перемістимо нуль на -, переступимо, перемістимо нуль на -, переступимо.
Тож тепер - і - дорівнює нулю.
Тепер ми додамо - і -.
Тож додайте і збережіть результат назад у -, а потім порівняйте, чи дорівнює сума, яка знаходиться
у -, п'яти. Відійди.
Якщо воно більше або дорівнює п'яти, то ви перейдете за цією адресою, яка знаходиться ззовні.
Тобто вирватися із замкненого кола.
Але в даному випадку це не так, тому ви будете продовжувати і збільшувати -.
Це наступний цикл, а потім збільшуємо -.
- тепер збільшиться до одиниці.
А потім порівняти, чи дорівнює цей лічильник - десяти.
Тож якщо він буде нижче, то ви підстрибнете назад у цикл.
Тож давайте зробимо це зараз.
Він повернеться назад у цикл, а потім додасть - до -.
Тож переступайте, і тепер - один.
Тепер ми знову порівнюємо, чи - дорівнює п'яти, і якщо воно дорівнює п'яти або більше, то воно стрибне.
Якщо ні, то це буде продовжуватися.
Тож ми продовжуємо.
Відійди.
Ви збільшуєте -.
- тепер стає два.
Переступити і повернутися в петлю, а потім знову додати.
Тож тепер - стає три. Порівняйте.
Він ще не перевищує п'ять, тож продовжуйте збільшувати - і порівнювати.
Це все ще менше десяти.
Тож поверніться в цикл, додайте ще раз.
Тож зараз - шість.
Тепер ви порівнюєте - з п'ятьма, і цього разу це вище або дорівнює.
Отже, цей стрибок відбудеться, тому що - дорівнює шести, тому зараз він вискочить з циклу, і тому зараз
- буде зберігати результат прогону, який дорівнює шести.
Ось як ми можемо використовувати конструкцію програмування переривання для передчасного виходу з циклу.
На цьому відео все.
Дякуємо за перегляд.