Привіт і ласкаво просимо назад.
Перш ніж почати кодувати, ви повинні спочатку спроектувати рішення.
Тож давайте прокрутимо вниз і подивимося на можливе рішення.
Отже, тут вам потрібно підказати користувачеві.
Отже, перше, що потрібно зробити - це попросити користувача ввести ім'я.
А потім потрібно відсканувати число і зберегти його у змінній.
Отже, це змінна, яка буде зберігати число.
Потім ви попросите користувача ввести друге число, а також викличете сканер, щоб він
зчитав друге число і записав його у другу змінну з назвою second number.
Після цього він повинен виконати деякі обчислення за лаштунками.
Тобто, він візьме перше число, додасть його до другого і десь збереже.
Після цього програма виведе результат.
Отже, висновок буде в такому форматі:
два плюс чотири дорівнює шість.
Щоб отримати такий вивід, слід використовувати специфікатор формату %d. Перший %d показує перше число,
потім ставиться плюс.
Плюс там відноситься до символу "плюс" тут.
А потім ви використаєте другий специфікатор формату, щоб показати друге число, а потім поставите там символ рівності,
тому що цього вимагає вивід.
І, нарешті, додайте ще один специфікатор формату %d, щоб показати суму.
А потім в кінці додайте символ переходу на новий рядок, який у гексі дорівнює 0x0A.
Тож це піде на новий рядок.
Отже, це високорівневий дизайн рішення.
А потім, коли ви це зробите, спробуйте перетворити їх у асемблерний код.
Отже, це можливе рішення для асемблерного коду.
Для того, щоб реалізувати тут printf, слід спочатку виштовхнути рядок "Введіть перше число" до стеку, а потім
викликати функцію printf.
Отже, функція printf буде використовувати цей параметр для виведення: first
num, "Введіть перше число. " Після цього
ви будете зчитувати число, яке користувач введе у змінну.
Ви зчитуєте число, яке користувач вводить в пам'ять.
Для цього вам потрібно викликати scanf.
Але перед тим, як викликати scanf, вам потрібно виштовхнути пам'ять для першого числа у стек, тому що scanf
вимагає адресу пам'яті для першої змінної num.
А потім вам потрібно виштовхнути специфікатор формату, яким є %d для першого числа, у стек.
Тоді ви покличете сканф.
Отже, це сканф тут.
Ці три інструкції тут для того, щоб реалізувати цей сканф.
Потім ви повторите те ж саме, але для другого числа.
Отже, ви виштовхуєте рядок "second num" до стеку.
Потім ви викликаєте printf, щоб вивести рядок "second num" і другий номер.
Потім ви повторюєте те ж саме для сканфу.
Ви виштовхуєте другу змінну num у стек.
Потім ви виштовхуєте специфікатор формату в стек і викликаєте scanf, щоб прочитати друге число
і зберегти друге число за другою адресою num.
Наступним кроком буде виконання розрахунків.
Для того, щоб виконати обчислення, ми будемо використовувати регістр - для зберігання суми.
Отже, спочатку ми ініціалізуємо його нулем, перемістивши нуль на -.
А потім додаємо перше число до - і зберігаємо результат у -.
- це реєстр.
Потім додаємо друге число до -.
І знову - реєстр.
Отже, перш ніж ви зможете додавати таким чином, ви повинні розіменовувати посилання.
Вам потрібно розіменовувати перше число і друге число, щоб отримати дійсне число, яке зберігається у цих місцях.
Отже, як тільки ви отримаєте суму в -, ви збережете її в пам'яті, перемістивши її за адресою, на яку
вказує sum.
Так ви зберігаєте щось в адресі.
Ви повинні використати символ розіменування, який є квадратною дужкою, і сказати програмі, що
це DWORD, тому що - це регістр довжиною DWORD.
Потім ви повинні сказати, що це адреса, тому ви повинні поставити слово "покажчик", що означає адресу.
Потім квадрат потрібно розіменовувати.
Отже, ви поміщаєте значення в - за адресою в пам'яті.
Далі ви викличете printf, щоб роздрукувати результат у цьому форматі.
Отже, нам потрібно натискати ззаду вперед, тому ми натискаємо sum, другу цифру, першу цифру, а потім натискаємо
цей рядок.
Це і є сенс усього цього: натиснути
друге число, натиснути перше число, натиснути специфікатор формату цього рядка і викликати printf.
Отже, у вас є ще один поштовх, про який я забув тут написати.
Отже, вам потрібно натиснути на вказівник DWORD sum.
Отже, ця команда виштовхує значення, що зберігається за адресою, яка називається sum, до стеку.
Ця команда виштовхує значення, що зберігається за другою адресою, до стеку.
Ця команда виштовхує значення, що зберігається за першою числовою адресою, у стек.
Отже, це знову ж таки розіменування, тому що якщо ви ставите суму саму по собі, вона посилається на рядок, а нам
не потрібен рядок.
Ми хочемо отримати значення, що зберігається за цією адресою.
Тож вам доведеться розіменовувати його ось так.
Знову ж таки, це говорить програмі, що це ціле число. Вказівник повідомляє програмі, що це адреса, а квадратна
дужка вказує програмі, що ви зацікавлені в отриманні значення, яке зберігається за цією
адресою.
Те саме стосується і тут, і тут.
Після цього ви виштовхуєте до стеку перший параметр, який є специфікатором формату, і, нарешті, викликаєте
printf.
Отже, це високорівнева реалізація, дизайн
для вашого рішення.
Отже, в наступному уроці ми застосуємо це в коді, і ми застосуємо це в коді x64dbg.
А ще нам потрібно знайти правильні адреси сегмента даних і сегмента BSS у пам'яті.
Тож ми зробимо це в наступному уроці.
Побачимося.
Дякуємо за перегляд.