Привіт і ласкаво просимо назад.
Отже, на минулому уроці я попросив вас спробувати цю вправу.
Сподіваюся, ви спробували.
Тож зараз я збираюся поділитися з вами рішенням.
Вибачте, я трохи змінив питання.
Параметр для другого параметра, числа, має значення 1337 замість 12.
Тож зробіть цю поправку.
Має бути 1337.
Тож тепер давайте спробуємо це.
Відкриваємо перший шаблон.
Отже, це наш перший шаблон.
Давай відкриємо.
Тепер нам потрібно мати дві комірки пам'яті для зберігання
наших двох параметрів.
Отже, перше, що потрібно зробити - це зберегти номер.
Другий - для зберігання рядка.
Існує не один спосіб вирішити цю проблему.
Спочатку я покажу вам довший шлях,
а потім - коротший.
Довший шлях - зберігати це в пам'яті.
Коротший спосіб - натиснути номер безпосередньо.
Тому спочатку я покажу вам довший шлях.
Гаразд, підемо довшим шляхом.
Отже, ми переходимо до Карти пам'яті, вибираємо Дані, Сегмент даних, і шукаємо дві комірки пам'яті, які ми можемо використати.
Ми використовуємо це.
Ми обираємо його для зберігання нашого номера.
Отже, наше число, яке ми хочемо вивести, буде 1337 цілим числом.
Тому ми зберігаємо його тут. Ми повинні зберігати його в шістнадцятковому вигляді, щоб він перетворив шістнадцяткове число в ціле.
Тож як нам отримати гекс для 1337 року?
Для цього ми можемо скористатися нашим вбудованим калькулятором.
І тут ми можемо просто ввести 1337 під цією колонкою, під цим текстовим полем.
Без підпису: 1337. А гекс для 1337 року - це гекс 539.
Отже, ми маємо зберігати тут 539 у форматі little-endian.
Таким чином, у малому форматі 539 перетвориться на 3905.
Тож давайте зберігати його там зараз.
Клацаємо правою кнопкою миші, Бінарний, Редагувати, і під ним вводимо 3905.
ГАРАЗД.
Тепер ви бачите, що коли ви завантажуєте його в програму або виштовхуєте в стек, вона перетворить
його в 539.
Отже, наступним кроком буде збереження рядка.
Отже, нитка, ми можемо зберігати її тут.
Ми можемо вибрати ці слова для зберігання нашого рядка.
Отже, клацніть правою кнопкою миші на цьому, Бінарний, Редагувати, і під ASCII ми вводимо: Номер: %d. І натисніть "ОК".
Отже, у нас є наша нитка і наш номер.
Тепер, одна річ, на яку слід звернути увагу: коли ви пишете свої рядки тут, ви вибираєте, а потім кодуєте,
редагуєте, вводите свій рядок в поле ASCII тут.
Але коли ви пишете цифри, ви не вводите ASCII.
Ключ під закляттям.
Пам'ятаєте, ми увійшли в 3905.
Що ми зробили, так це клацнули правою кнопкою миші, Бінарний, Редагувати.
Ми не вводимо 539 тут. Ми вводимо 3905 у зворотній ендіанській системі числення.
Ось у чому різниця.
Тепер, коли ми отримали ці рядки в пам'яті, ми готові виштовхнути їх до стеку.
Тож давайте зробимо це зараз.
Спочатку скопіюємо адресу звідси.
І вставте туди свою адресу.
ГАРАЗД.
Скопіюємо іншу адресу.
Ходи сюди.
Паста.
ГАРАЗД. Тож тепер ми маємо ось це.
Зауважте, я припустився помилки.
Я лише проштовхую адресу.
Я натискаю адресу.
Отже, якщо ви виштовхнете адресу до стеку тут, відбудеться те, що вона буде прийнята як параметр
для %d, а це не те, що ми хочемо.
Нам потрібно значення, що зберігається за цією адресою.
Отже, значення, що зберігається за адресою, дорівнює 0539.
Отже, щоб отримати значення, що зберігається за адресою, нам потрібно розіменовувати цю адресу.
Отже, розіменування у програмуванні означає отримання значення, яке зберігається за адресою.
Повторюємо, що значення розіменування у програмуванні полягає в тому, щоб отримати значення, що зберігається за адресою пам'яті.
Тож ми маємо це виправити.
Отже, вибираємо перший, натискаємо пробіл, і нам потрібно поставити ось ці квадратні дужки. Це називається розпізнаванням посилань.
А спереду ми повинні сказати програмі, що це слово, а це адреса.
Отже, dword означає чотирибайтове значення. PTR означає, що це адреса, а квадратна дужка означає, що потрібно розімкнутися, тобто отримати
значення, що зберігається за цією адресою.
Отже, вам потрібно зробити це, тому що це число, а не рядок.
Якщо це рядок, вам не потрібно використовувати таке розіменування.
Ви можете просто натиснути саму адресу.
І програма досить розумна, щоб зрозуміти, що ви посилаєтеся на рядок.
Тепер натисніть "ОК".
І тут вам доведеться переробляти знову, тому що перша інструкція перезаписала нижню інструкцію.
Тож нам потрібно це теж виправити.
Клацніть правою кнопкою миші, Двійковий, Заповнити NOP, щоб
видалити ці два. Натисни ОК.
Потім ми знову робимо NOP.
Тоді тут ми повинні повторити цю інструкцію ще раз.
Клацніть правою кнопкою
миші, скопіюйте адресу,
приходьте сюди.
Штовхай.
І добре.
І тепер у нас є специфікатор формату.
І, нарешті, ми переходимо
до столу для стрибків.
Ми шукаємо відбиток.
Адреса.
Зрозумів.
Поверніться до покажчика інструкцій.
Прокрутіть вниз і введіть ваш виклик для printf.
Ось так.
Отже, ваш код повинен виглядати так.
Тепер ми можемо запустити його і подивитися на результат.
А ти переступай.
Тепер він розіменовує цю адресу, отримує значення і виштовхує його до стеку.
Як бачите, ми отримали 539.
Далі буде виштовхнуто адресу рядка, який містить специфікатор формату.
І тепер він виштовхнув цей специфікатор формату до стеку.
Далі буде викликано функцію printf.
Слідкуйте за екраном, і ви отримаєте свій 1337.
Гаразд.
Тож це довгий шлях.
Існує короткий шлях, як це зробити.
Дозвольте мені спочатку зберегти це.
Тому я просто виправлю цей файл. Латка. І ми назвемо це 16_функція_дві_вправи. exe.
Так.
Коротший спосіб зробити це - просто виштовхнути значення безпосередньо до стеку.
Це означає, що ми штовхаємо число до стеку напряму.
Отже, ми відкладаємо 539 до стеку тут. Тож ми можемо модифікувати його замість того, щоб брати з пам'яті. Ми пересуваємо гекс
539 прямо до стеку.
Через те, що ми змінили інструкцію,
вона зіпсувала всі ці дві інструкції під нею.
Тому ми повинні видалити цю інструкцію і переробити заново.
Клацніть правою кнопкою миші, Бінарний, Заповнити NOP, щоб викреслити їх.
Тепер ми натискаємо цей специфікатор формату правою кнопкою миші, спочатку копіюємо адресу, а потім натискаємо і вставляємо
адресу.
І далі ми викличемо нашу функцію printf. Перейдіть до таблиці переходів, щоб отримати адресу.
Скопіюй звідси.
Поверніться до - і зателефонуйте за нашою адресою, на нашу printf-адресу.
Тепер ставимо точку зупинки.
Ми керуємо ним.
Гаразд.
Тож нам потрібно врятувати
це в першу чергу. Латка.
Спочатку збережи це.
Тому ми називаємо це 17 _функція_дві_вправи.
Потім відкриваємо нашу вправу 17_функція_два_вправи.
І ми ставимо брейк-поінт тут.
Ми керуємо ним. Відійди.
Тепер він виштовхує 539 до стеку, який знаходиться у гексі.
Потім він виштовхне специфікатор формату до стеку, а потім викличе функцію printf
і надрукує 1337.
Тож це коротше рішення.
Тому я покажу вам два способи, щоб ви знали, як використовувати пам'ять для зберігання цілих чисел у зворотному порядку,
тобто у малому кінцевому порядку.
Тоді, якщо вам потрібен простіший спосіб, ви просто уникаєте цієї складності зберігання в little-endian, а потім зберігаєте його, штовхаючи
безпосередньо до стеку.
Отже, є два шляхи.
Іноді потрібно використовувати цей спосіб, іноді - цей.
Це залежить від вашої програми.
Таким чином, певні програми будуть зчитувати номер і зберігати його в пам'яті.
Ось де вам потрібно зберігати його.
Потім інша функція прочитає його з пам'яті.
Це все для цього відео.
Дякуємо за перегляд.