Привіт і ласкаво просимо назад.
У цьому відео ми побачимо, як можна помістити все це всередину циклу, щоб код виглядав набагато акуратніше,
тому що ми бачимо тут багато повторень.
Наприклад, цей код і цей код, ці два рядки повторюються тут і тут.
Єдине, що, здається, зростає, - це "-".
В іншому все залишається без змін.
Тож це ідеальна ситуація, ідеальний кандидат для циклу.
Отже, давайте розглянемо рішення для циклу.
Отже, у цьому першому рядку, як зазвичай, ми переміщуємо базову адресу на -, таким чином встановлюючи базову адресу
масиву.
Потім ми ініціалізуємо лічильник циклу, який дорівнює -, тому ми ініціалізуємо його нулем, перемістивши в нього нуль.
Далі обчислюємо ефективну адресу масиву -.
Тож саме тут починається цикл.
Цикл починається звідси, з цієї адреси.
А у вашому випадку все може бути інакше.
Отже, ви просто слідуєте тому, що побачите у відладчику пізніше.
Я поясню це на практиці.
Отже, тут ми обчислимо ефективну адресу для нашого першого елемента масиву.
Отже, ми беремо базову адресу,
тут - плюс - помножити на чотири. - дорівнює нулю.
Отже, нуль помножити на чотири дасть нуль. Нуль з плюсом - поверне вам базову адресу.
Отже, індекс масиву буде нульовим.
Отже, ви завантажуєте цю базову адресу в -, яка вказує на перший елемент масиву.
Далі ми розіменовуємо цю базову адресу, отримуємо значення, що там зберігається, і переміщуємо його в -,
таким чином копіюючи значення нульового індексу масиву в -.
Зараз все по-іншому.
Ви збільшуєте -.
Раніше нам доводилося переносити нуль на -, одиницю на -, два на -.
Тепер спрощуємо. Ми використовуємо INC -.
Отже, INC, як ви вже зрозуміли, збільшує лічильник циклу на одиницю.
Так і зараз - спочатку був нульовим.
Коли ми робимо INC -, - стає одним цілим. Тепер ми порівнюємо, чи - дорівнює трьом, оскільки хочемо вийти з циклу.
Якщо це три, ми перевіримо це нижче: стрибайте менше.
Отже, якщо - менше трьох, це буде правдою, і ви знову стрибнете на вершину.
Отже, тут верхня частина є початком циклу.
Інакше він продовжить рух прямо і виконає цикл.
Отже, умовою буде те, куди стрибне цикл.
Менше не вдасться - це де - то три.
Отже, оскільки - зараз менше трьох, стрибок буде меншим.
Отже, стрибок менше означає, що якщо менше трьох, переходимо до циклічного старту. Це і є сенс стрибати менше.
Тому зараз ми йдемо - і так
буде продовжуватися.
А тепер, оскільки - це один, то один помножений на чотири дорівнює чотирьом. Чотири плюс базова адреса дадуть вам наступну
адресу - 3044. А потім він видалить це посилання. Ви візьмете значення, яке дорівнює двом,
перемістите його і збережете в -. Потім збільшуємо на -. - тепер два.
Тож ми знову порівнюємо. Два - це менше трьох.
Так що стрибати буде менше. Ми знову підстрибуємо.
Тепер треба двічі по чотири, вісім. Отже, вісім плюс базова адреса дасть вам 3048. А тепер він розіменовує посилання
3048, отримує значення, що там зберігається, а це три, і переміщує його в -.
Далі йде приріст -.
- тепер стане трьома.
А тепер порівняйте - з трьома. Стрибнути менше не вийде, тому що три - це не менше трьох.
Тож він вийде з циклу.
Таким чином, цикл завершиться.
Ось як ми можемо використовувати цикл для реалізації нашого рішення.
Давайте спробуємо зробити це у x64dbg. Як завжди, відкриваємо наш шаблон один, переходимо
до карти пам'яті, переходимо до сегменту даних, а потім заносимо сюди наш масив: сюди - нуль один, а сюди - нуль два, а сюди - нуль
три. Натисни
"ОК". Отже, ми маємо один, два і три у вигляді масиву.
Тепер переходимо до нашого коду тут і вводимо цей код.
Отже, спочатку ми копіюємо нашу базову адресу. Клацніть правою кнопкою миші, скопіюйте адресу, перейдіть сюди і натисніть MOV -, і вставте туди
базову адресу.
Далі йде MOV
-, нуль.
А тепер ми входимо в наш цикл.
Отже, тут ми набираємо
LEA.
LEA
-, в дужках, -
плюс -, помножити на чотири.
Заходьте.
Далі йде MOV-,-.
Далі йде INC-.
Далі йде
CMP, CMP -, три.
Отже, після введення CMP -, три,
далі йде JL. Джей Ло - нуль.
Отже, нам потрібно вставити базу, адресу циклу.
Тож ми повинні повернутися сюди, шукати цю ділянку лінії.
Це твоя адреса.
Тому ця адреса може бути іншою для вас.
Тут це наведено лише як приклад.
Тож у вашому випадку це буде не ця адреса, або ж це може
бути і не ця адреса.
Тож у вашому випадку ви просто шукаєте цю адресу, цю інструкцію.
Це початок циклу.
Тож просто скопіюйте те, що бачите у своєму кейсі.
Для мене це ось ця, тому я скопіюю цю адресу, а потім перейду сюди і введу інструкцію
JL, 0x, і вставлю туди свою адресу.
Натисни
"ОК". Тож це моя петля.
Тому просто зупиніться на секунду і перевірте, чи правильно ви все ввели.
Переконавшись, що все вірно, збережемо, поки не забули.
Отже, натискаємо кнопку "Зберегти"
і даємо цьому файлу ім'я: 56 LEA loop dot EXE.
Тепер я ставлю точку зупинки і запускаю програму, і вона досягає точки зупинки.
Відійди.
Таким чином, базова адреса зміщується на -.
- тепер має базову адресу. Перемістіть нуль на -.
- тепер дорівнює нулю.
Обчислити ефективну адресу для першого елемента.
Отже - тепер містить адресу першого елемента.
Зніміть посилання на цей елемент, на цю базову адресу,
отримайте значення, що там зберігається, і збережіть його в -.
Тож відійди.
- тепер має один. Збільшити -, переступити.
- тепер стає одним цілим.
Порівняйте - з трьома.
І тут ви бачите, що стрибок відбудеться, тому що - це одиниця.
- один.
Один - це менше трьох.
Таким чином, він перейде до цієї інструкції для другої ітерації циклу.
Отже - один.
Один раз помножити на чотири - це чотири.
Чотири з плюсом - дасть вам - чотири
з плюсом - дасть вам цю адресу.
Тоді ця адреса посилається на цю.
Тож давай переступимо.
Тепер ми розіменовуємо його, щоб отримати значення two і зберегти його в -.
- тепер два. Приріст. Відійди. - тепер два.
Порівняйте - з трьома.
- це два.
Переступите,
і ви побачите, що стрибок відбудеться так, що він підстрибне назад, тому що два менше трьох.
Тож він повернеться сюди.
Отже, тепер він буде обчислювати ефективну адресу для -2.
Отже, двічі по чотири - вісім. Вісім з плюсом - переступай, переступай. Вісім, - зараз 3048.
Далі ми розіменовуємо посилання 3048,
яке знаходиться тут, і отримуємо значення, яке дорівнює трьом, і переміщуємо його на -.
Отже - вже три. Приріст -. - тепер три. Порівняйте - з трьома і подивіться, що вийде.
Тож стрибка не відбудеться.
Як бачите, вона зафарбована сірим кольором.
Це означає, що ми виходимо з циклу.
Ось і все.
Отже, ось як ми можемо
використовувати цикл для написання більш ефективної програми, коротшої програми, щоб прибрати непотрібні повторення в нашому коді.
Отже, використовуючи цикл, ми можемо використати це тільки один
раз.
Нам не доводиться повторювати це так багато разів, і наш код акуратніший, набагато акуратніший. Отже, ви бачите, наскільки корисним є LEA, якщо правильно
використовувати його для доступу до елементів масиву.
Це все для цього відео.
Дякуємо за перегляд.