З поверненням.
Отже, у цьому відео ми реалізуємо функцію scanf для рядків.
Тож давайте зробимо це зараз.
Відкриваємо наш попередній 20-scanner-printf, і можемо продовжувати далі.
Тож зараз тут є деякі зміни, які вам потрібно зробити.
Таким чином, ми можемо використовувати той самий сегмент BSS для зберігання адреси, де будуть зберігатися рядки.
Тож цей можна знайти тут, у розділі BSS.
Рядки будуть зберігатися тут
за адресою пам'яті 405010.
Отже, це місце, де ви будете зберігати рядок.
І тут нам потрібно це змінити.
Отже, нам потрібно зайти
в пам'ять, зайти в дані, а потім зайти
за цією адресою 403050.
Це - %d.
Ми повинні це змінити.
Клацніть правою кнопкою миші, а потім - бінарне редагування.
Тому просто змініть на %-
змініть на %s.
Для струнних, розумієте?
Далі скануємо - тут жодних змін.
Ось це, розіменування - вам потрібно забрати розіменування, тому що ім'я рядка вже є масивом,
вказівником на сам рядок.
Самої адреси вже достатньо, щоб визначити початок рядка, тому вам не потрібно розіменовувати посилання.
Знову ж таки, це вже було детально розглянуто в попередніх уроках по струнним інструментам.
Тож якщо ви забули, будь ласка, поверніться і перегляньте.
Тож тут нам просто потрібно змінити цей код.
Видаліть роз'єднання.
Просто виштовхніть саму адресу до стеку.
Давайте подивимося зараз - через те,
що ми внесли деякі зміни, код переписав попередній, наступний
і зіпсував їх.
Отже, нам потрібно видалити всі ці три.
Виберіть цю опцію, клацніть правою кнопкою миші та бінарно заповніть NOP, щоб очистити їх.
Отже, тепер нам потрібно знову вставити інструкцію для printf.
Це другий параметр printf.
Це перший параметр
printf.
Отже, перший параметр - якщо ви загубилися, можливо, це вам допоможе.
Зараз ми виконуємо
printf("%s", string); ось так.
Отже, нам потрібно ввести адресу рядка і натиснути %s, а потім викликати printf.
Цей - для цифр.
Цей - для струнних.
Різниця лише в тому.
Гаразд, тепер ця команда посилається на проштовхування адреси рядка.
Отже, ми проштовхнули адресу рядка, який при переході за адресою
рядка має бути тут, під BSS, сюди.
405010 - незалежно від того, який рядок буде введено, він буде збережений тут.
І тепер ми штовхаємо це до стеку.
Далі ми натиснемо специфікатор формату, який знаходиться тут - ми щойно натиснули рядок.
Зараз ми це просуваємо.
Тож давайте зробимо це.
Для цього ми використовуємо сегмент даних.
Ми натискаємо %s, тобто копіюємо цю адресу.
Підійдіть сюди і перемістіть адресу до стеку.
Далі ви викличете функцію printf.
Тому просто знайдіть функцію printf.
Перейдіть до таблиці стрибків, натиснувши тут.
А ось функція printf.
Просто клацніть правою кнопкою миші та скопіюйте цю адресу.
Поверніться до вказівника інструкцій і двічі клацніть на ньому, а потім спустіться вниз і викличте
за своєю адресою функцію printf.
Отже, ми готові.
Тому, щоб перепровірити, другий параметр для scanf - де буде зберігатися рядок, який знаходиться тут - рядок, який знаходиться тут - рядок,
який знаходиться тут - рядок,
який знаходиться, вибачте, який знаходиться тут.
BSS, так.
Рядок буде збережено тут за адресою 405010 - буде збережено тут.
І тоді перший параметр - це специфікатор формату, тобто %s, який знаходиться тут, за цією адресою, специфікатор
формату.
Отже, це другий і перший параметр для scanf.
Другий параметр для printf - це адреса, за якою зберігається рядок,
тут.
І перший параметр - це специфікатор формату, який тут - %s, а потім виклик.
Тепер давайте поставимо тут точку зупинки, перемкнемось і побіжимо.
І давайте подивимося на результат.
Тож ми переступаємо.
Тепер він виштовхне адресу
405010 - цю адресу до стеку.
Ця адреса тепер у стеку.
Отже, рядок буде зберігатися тут.
Далі він виштовхне специфікатор формату, що зберігається за цією адресою, 403050,
а саме цей.
Підійдіть і ви побачите його там.
Отже, тепер у нас є перший параметр
і другий параметр у стеку, готові до використання функції scanf.
Тож зараз вона призупинена - коли ми переступимо через неї, ця смуга перетвориться на стан бігу.
Зараз це працює.
Тепер він чекає, поки ви введете свій рядок.
Тож клацніть тут і введіть текст.
Припустимо, я набираю своє ім'я.
Тепер переконайтеся, що ви вводите щось без пробілу, тому що сканер не може прочитати пробіл.
Отже, вам потрібно ввести ім'я або прізвище.
Не вводьте пробіл.
Припустимо, я набираю своє ім'я, Павло, і натискаю Enter. Після того, як я натисну Enter, він
повинен взяти цей рядок і зберегти його
за цією адресою, 405010, яка знаходиться тут.
405010.
Тож будьте напоготові.
Тепер подивіться, що відбувається, коли я натискаю Enter.
І ось, будь ласка, Пол і нульовий термінатор на задньому плані.
Отже, це нульовий термінатор. Далі ми виштовхуємо параметри для функції printf,
тому ми виштовхнемо 405010, ось цей, до стеку.
Це другий параметр для printf. Отже, переступивши через неї, ви побачите, що вона виштовхнула цю адресу до стеку.
Ця адреса містить
моє ім'я, прізвище. Далі ми виштовхнемо перший параметр до стеку.
Перший параметр для printf-перехід і перший параметр там.
Тепер першим параметром для printf є %s у стеку.
Другий параметр, мій рядок, знаходиться у стеку.
Отже, ці два параметри тепер готові до використання командою printf.
Я переступлю через printf, і ви побачите, що станеться.
Тут надруковано моє ім'я.
Отже, ось як ви можете використовувати асемблерний код для введення рядків, а також для виведення рядків.
Тож давайте збережемо це зараз. Файл, патч, патч, патч.
А тут ми можемо назвати це 21-scanf- printf-рядки.
exe.
Натисни "Зберегти".
Отже, ось як це
робиться для
вхідних і вихідних даних від користувача.
Звісно, ви можете вдосконалити цю програму, можливо, давши корисну підказку.
Скажіть: "Будь ласка, введіть номер" або "Будь ласка, введіть ваше ім'я, будь
ласка, введіть ім'я", а потім відскануйте, щоб прочитати ім'я. І тоді, можливо, ви можете сказати: "Будь ласка, введіть
друге ім'я", потім
scanf, щоб ввести друге ім'я, і після цього надрукувати.
Коли закінчите, надрукуйте ім'я та прізвище.
Гаразд.
Ви можете зробити це самостійно, якщо хочете, як вправу.
На цьому відео все.
Дякуємо за перегляд.