З поверненням.
Отже, у попередньому уроці ми вже використовували функцію scanf.
Давайте відкриємо і подивимось.
Отже, це був ваш сканф, де ми виділили дві області пам'яті для функції.
Другий параметр і перший параметр.
Другий параметр призначений для зберігання номера, який ввів користувач.
І тоді першим параметром буде зберігатися специфікатор формату для scanf.
Потім ви викликаєте scanf, користувач вводить щось, і це зберігається в місці розташування другого параметра,
тобто вашої адреси.
А зараз, у цьому уроці, ми навчимося друкувати значення, яке ввів користувач і яке
зберігається у цьому другому місці.
Для цього нам потрібно скористатися функцією printf.
Як ви пам'ятаєте, функція printf має два параметри.
Функція printf приймає формат %d, специфікатор формату, як перший параметр, і має другий параметр
- число, яке ви хочете надрукувати.
Отже, щоб виштовхнути його у стек, ми виштовхнемо другий параметр першим, і нам потрібно розіменування адреси, тому що
ми хочемо отримати число, що зберігається за цією адресою.
Отже, ми використовуємо двійкове слово ptr і адресу числа у квадратних дужках, а потім натискаємо специфікатор формату для першого
параметра, після чого викликаємо printf.
Якщо ви забули про це, будь ласка, перегляньте попередні уроки, де я вже досить детально розповідав
про ці речі.
Отже, давайте приступимо до реалізації нашої функції printf.
Отже, для функції printf, другого параметра, нам потрібно розіменовувати адресу 405010.
Тож поверніться до карти пам'яті. Це в сегменті BSS, сегмент BSS, 405010.
Ось цей.
Клацніть правою кнопкою миші тут, скопіюйте цю адресу і перейдіть сюди, введіть "push dword ptr hex" і вставте адресу.
Ось так.
Далі йде специфікатор формату.
Тож поверніться до карти пам'яті.
Секундочку.
Дозвольте мені змінити це, щоб перейти до другого дампа, а потім повернутися до сегмента даних і двічі клацнути його, і ви побачите, що ваш
специфікатор формату знаходиться тут.
Ви можете повторно використовувати ту саму адресу, яку ми використовуємо для scanf, тому не потрібно повторно оголошувати іншу адресу пам'яті.
Отже, скопіюйте цю адресу, Copy Address, а потім перейдіть сюди і введіть "push hex", вставте адресу специфікатора формату.
Отже, тепер у вас є значення в стеку і специфікатор.
Далі буде викликано функцію printf.
Отже, давайте візьмемо копію адреси для функції printf.
Ми натискаємо на будь-який виклик, який ми можемо тут знайти, щоб перейти до таблиць переходів, шукаємо функцію printf
і копіюємо її адресу.
Клацни правою кнопкою миші.
Скопіюйте адресу, поверніться до покажчика інструкцій і натисніть на нього.
Прокрутіть вниз до місця розташування.
А тепер тут ми викличемо функцію printf.
Вставте сюди адресу функції printf, і все готово.
Отже, тепер ми можемо поставити тут точку зупинки. Клацни правою кнопкою миші.
Ставимо точку зупинки, перемикаємось і біжимо на місце.
Давайте подивимося на результат.
Переступайте, поки не дійдете до першої інструкції. Це виштовхне адресу цього звалища сюди.
405010.
Це місце, де буде зберігатися номер, який вводить користувач.
Тож ми штовхаємо його до штабеля, стежимо за штабелем.
Тепер ця адреса є в стеку.
Бачиш цей стос?
64-4-4-4 - це ваш -, стек, і ви зберігаєте там адресу, адресу, де буде зберігатися
номер.
Потім він виштовхне специфікатор формату до стеку.
Перейдіть через нього, і ви побачите, що специфікатор формату тепер знаходиться у стеку.
Отже, ваш перший параметр і другий параметр тепер у стеку в готовності до функції scanf.
Отже, давайте викличемо функцію scanf і помітимо, що призупинений стан зміниться на запущений, чекаючи на те,
що ви щось введете.
Тож зараз він працює.
Це означає, що програма чекає, поки ви введете число.
Отже, набираємо 34 і натискаємо Enter.
А потім, коли я натискаю Enter, подивіться, що тут відбувається.
Отже, 34 зберігається тут як гекс 22.
Тож давайте підтвердимо це.
Перейдіть до калькулятора тут.
А ось тут, введіть гекс 22, і побачите, що це 34.
Тож це правильно.
Отже, тепер ви зберегли свій номер у цьому місці.
Далі ми задамо параметри для функції printf.
Отже, зараз ми передамо другий параметр для printf.
Отже, нам потрібно вилучити посилання на 405010. 405010 - ось ця адреса.
А потім ми хочемо отримати звідти слово.
Саме тому ми розмістили тут dword.
Слово D - це чотири байти.
І тоді ми хочемо позначити, що ось ця адреса, ось ця адреса.
Тому ми ставимо ptr, що означає вказівник або адресу.
Отже, вказівник означає, що це адреса.
А потім квадратна дужка означає, що ми хочемо вилучити посилання.
Це означає, що ми хочемо отримати значення, яке зберігається за цією адресою.
Отже, тепер ми збираємося виштовхнути це в стек і подивитися, що станеться в стеку.
Коли я переступлю через нього, ви побачите, що він витягнув звідси значення гекса 22 і виштовхнув його до стеку.
Далі, ми виштовхнемо звідси специфікатор формату. У другому дампі ми маємо 403050, що є специфікатором вашого
формату.
Тож давайте переступимо через це і подивимося на стек.
І тепер ми маємо специфікатор формату у стеку.
Отже, тепер у вас є параметр один і параметр два у стеку.
Перший параметр - специфікатор формату %d.
Другий параметр - це hex 22, значення hex 22.
Отже, це два параметри, які очікують на використання printf.
Отже, давайте викличемо printf і подивимося, що станеться.
І ти отримуєш 34.
Отже, вона виводить на екран 34 після того, як отримає його з цієї області у пам'яті.
Отже, ось як ми можемо використовувати введення і виведення та виводити результати на екран.
Тож зараз я маю для вас виклик.
Чи могли б ви зробити те ж саме, але для струнних?
Це означає для таких струн, як ця.
Тому я хочу, щоб ви спочатку спробували це самостійно, подивившись, чи зможете ви реалізувати це у своєму асемблерному коді.
А потім я поясню вам рішення в наступному відео.
Тим часом, ви можете зберегти це: Patch, Patch file, і назвемо його 20-scanf-printf. exe. Натисніть "Зберегти".
Тож спробуйте.
Як реалізувати свій scanf для пошуку рядків.
До зустрічі в наступному відео.
Дякуємо за перегляд.