З поверненням.
У цьому уроці ми розглянемо ще один цикл, який називається цикл while.
Знову ж таки, це високорівнева конструкція програмування - цикл.
Характерною особливістю циклу while є те, що він продовжує працювати до тих пір, поки виконується деяка умова.
Наприклад, за допомогою цього псевдокоду можна підсумувати всі числа від 0 до 9 включно.
Спочатку ми ініціалізуємо - в нуль.
- це лічильник.
А потім ми ініціалізуємо акумулятор, загальний
-, нулем, тому що ми будемо використовувати
його для накопичення поточного підсумку.
Тому починати треба з нуля.
Потім ми переходимо до самого циклу while.
Якщо - менше десяти, виконайте наступні дії.
Спочатку ви берете -, додаєте до - і зберігаєте результат назад у -.
А потім ви збільшуєте - на одиницю.
А потім ви повертаєтеся до циклу і перевіряєте, чи - менше десяти.
Якщо воно все ще менше десяти, ви продовжуєте робити це до тих пір, поки не дійдете до стану, коли - дорівнює десяти.
І коли це станеться, ця умова не спрацює, а отже, він вийде з циклу.
Якщо реалізувати це в збірці, то ось як це буде виглядати.
Ви переносите нуль на -, а потім переносите нуль на -.
Потім ви вводите адресу пам'яті для циклу while, який починається тут.
Ось така інструкція: ви порівнюєте зі значенням - значення для десяти, яке є -, -, якщо воно є.
Тоді ти перевіриш.
Якщо воно більше або дорівнює десяти, ви переходите на цю кінцеву адресу.
Це означає, що ви вийшли з циклу.
В іншому випадку продовжуйте виконувати наступні інструкції.
Ви додаєте - до -, потім збільшуєте -, а потім переходите назад до циклу зверху.
Це безумовний стрибок.
Отже, цикл while - це адреса тут.
Потім знову порівнюєте - з десятьма, і якщо воно більше або дорівнює десяти, то виходите з циклу.
В іншому випадку ви продовжуєте цикл до тих пір, поки не настане умова, при якій - дійсно дорівнює десяти.
У такому випадку цей стрибок "вище або дорівнює" буде істинним, і він вискочить з циклу.
Врешті-решт, у вас є сума всіх ваших чисел від 0 до 9 в регістрі -.
Отже, давайте реалізуємо це у x64dbg.
Відкрийте файл шаблону.
Прокрутіть вниз до цього рядка і введіть весь цей код тут.
Перемістити -, нуль.
Порівняйте
-, A. Стрибок вище або дорівнює.
Отже, тут нам потрібно поставити тимчасову адресу кінця, яку ми не знаємо, тому ми можемо просто
спуститися до чогось нижче і просто скопіювати це, наприклад.
А потім поверніться сюди і вставте цю адресу в оператор jump-above-or-equal.
Вставте сюди скопійовану вами адресу.
Натисни ОК.
Наступним буде ADD -,-.
Потім збільшуємо -, а наступним буде стрибок.
Перехід на адресу циклу while, який є власне самою цією інструкцією.
Тож ми можемо повернутися сюди і скопіювати цю адресу.
Ми копіюємо цю адресу.
А потім спуститися сюди і вставити безумовний перехід, вставити туди адресу, натиснути ОК.
Тепер швидко перевірте, щоб переконатися, що все правильно.
Після того, як ви переконаєтеся, що все правильно, поставте там точку зупинки.
Збережемо цей файл.
Виправте цей файл і назвіть його 38-while-loop. exe.
Припини.
Відкриваємо щойно збережений файл, прокручуємо вниз і відкриваємо цикл while. exe і переконайтеся, що точка переривання там
є.
Якщо ні, просто поставте точку зупинки.
Біжи і переступай, поки ми не прийдемо сюди.
Перенесемо нуль на -, потім перенесемо нуль на -.
Отже, тепер - дорівнює нулю і - дорівнює нулю.
Ми порівнюємо -, чи дорівнює воно десяти, і якщо воно більше або дорівнює десяти, ми вистрибуємо з циклу тут, внизу.
Але в даному випадку - менше десяти, тому воно не буде стрибати.
Він продовжить цикл і додасть - до -.
Давайте переступимо через нього, і тоді приріст -, - тепер дорівнюватиме одиниці.
Потім він повернеться до цієї адреси, знову потрапивши в цикл.
Потім він порівнює - де десять, і якщо воно більше або дорівнює десяти, то вискакує.
Якщо ні, то це буде продовжуватися.
Тож тепер ви додаєте - до -, збільшуєте -, тепер два, підстрибуєте, знову порівнюєте. - дорівнює двом, тому він не буде стрибати.
Він продовжить додавати,
інкремент -. Знову ж таки, - тепер уже три.
Підстрибніть назад, зробіть те ж саме.
Приріст -, - тепер дорівнює чотирьом.
Повертайся нагору.
Кожного разу, коли він зациклюється, він буде додавати - до -.
Так продовжуємо до тих пір, поки - не стане десять.
Слідкуйте за цим значенням тут, -.
Сім, вісім, дев'ять, десять.
Отже - вже десять. А - за десять.
Тож він повернеться сюди і зробить ще одне порівняння: де - це десять.
Тож так, - це десять.
Тож, коли це стосується нас, це правда.
Якщо - дорівнює десяти, то відбудеться стрибок вище або дорівнює, він вискочить з циклу, тому він вискочить
з циклу.
І тепер ваша сума в -, 2D.
Отже, 2D дорівнює -, 45, і ви можете переконатися в цьому, зайшовши в Калькулятор. У 2D тут, і ви можете побачити, що це 45.
Отже, 45 - це загальна сума для всіх чисел від 0 до 9.
Ось як можна реалізувати цикл while, використовуючи високорівневу конструкцію, а потім перетворити її на асемблер.
На цьому відео все.
Дякуємо за перегляд.