Привіт і ласкаво просимо назад.
Зараз ми розглянемо основні арифметичні інструкції SUB. SUB означає віднімання.
Ось кілька прикладів.
SUB призначення, джерело.
Це синтаксис.
SUB - ключове слово.
Отже, ми беремо джерело, віднімаємо від одержувача, а результат записуємо назад
у регістр одержувача.
Приклад:
SUB EAX, EDX.
У цьому випадку ми віднімаємо значення в EDX від значення в регістрі EAX і зберігаємо результат
назад в регістр EAX.
Інший приклад: SUB EDI, 0x2A.
Тут ми віднімаємо значення 0x2A від значення в EDI і зберігаємо результат назад
в регістр EDI. SUB CL, DL.
Тут ми віднімаємо значення молодшого байта регістра EDX від значення молодшого байта регістра
ECX і зберігаємо результат назад у регістр CL.
Розглянемо кілька прикладів.
Отже, відкриваємо наш x64dbg.
Ми будемо використовувати шаблон 1.
А потім перші три інструкції ініціалізують
регістри початковими значеннями.
Тож прокручуємо вниз і починаємо вводити наші інструкції.
Натисни клавішу "пробіл". MOV EAX, 0x1A.
Натисни Enter. Наступна команда: MOV EBX,
0x 3.
Натисни Enter.
Наступна команда: MOV
ECX, 0x2. Натисни Enter.
Далі йдуть SUB EAX,
EBX.
Натисніть Enter, а потім
ADD EAX,
EBX.
Введіть, а потім SUB
ECX, EBX. Натисніть Enter та ADD ECX,
EAX.
Натисніть
Enter, і останню: SUB CL, AL.
Натисни
Enter.
Тепер знайдіть трохи часу, щоб перевірити.
Переконайтеся, що ви правильно ввели інструкції.
Після того, як ви підтвердите, що все правильно,
ми можемо поставити тут точку зупинки, як ми це робили раніше.
Клацніть правою кнопкою миші, Breakpoint, Toggle.
Я це вже зробив, а потім біжу до нього.
Тоді ми переступаємо.
Перша команда - перемістити 1 в EAX. Перейдіть через нього і підтвердіть, що 1 тепер в EAX.
Наступна інструкція - перемістити 3 до EBX. Підійдіть і перевірте, що тепер 3 знаходиться в EBX.
Наступна інструкція - скопіювати або перемістити
2 до ECX Перейдіть і підтвердіть.
Тепер 2 знаходиться в ECX
Тепер переходимо до віднімання: віднімаємо EBX від EAX і зберігаємо результат в EAX.
Отже, EAX дорівнює
3 Відніміть це від 1A.
Тому спочатку перевіримо на нашому калькуляторі.
Наш калькулятор програміста.
Переконайтеся, що ви натиснули на Hex. Спочатку EAX - EAX дорівнює 1A - тому ми вводимо 1A, а потім віднімаємо EBX.
EBX дорівнює 3, і ми отримуємо 17.
Тож давайте почнемо. Переступите через це зараз і подивіться, що відбувається в EAX.
Переступаємо і отримуємо 17.
Далі ми додаємо EBX - ми додаємо EBX до EAX.
Тож давайте знову скористаємося нашим калькулятором.
EAX - це 17-17, а потім ми додаємо EBX-3.
Отримуємо результат 1A і зберігаємо його назад в EAX.
Таким чином, EAX повернеться до рівня 1A. Переступаємо, і дійсно, це 1А. Далі ми віднімаємо EBX від ECX Отже, давайте спробуємо
наш калькулятор.
ECX-ECX дорівнює 2.
Тож ми вводимо 2. Віднімаємо EBX - 3 і отримуємо від'ємне значення 1.
Отже, тут це від'ємне значення 1.
Це чотирибайтовий регістр, тому ми ігноруємо
всі ці додаткові старші байти.
Ми розглядаємо лише чотири байти, тому отримаємо FFFFFFFFF, що означає від'ємну 1, як
ви можете бачити звідси.
Тож давайте переступимо через це і подивимося, що станеться з ECX.
Ви отримуєте від'ємне значення 1, як і очікували.
Далі ми додамо EAX до ECX.
Тож давайте з'ясуємо це зараз.
ECX від'ємний 1.
Отже, ми вводимо FF FFFFFFF,
що є від'ємною 1 для регістра з чотирма
байтами, і додаємо EAX до ECX, що дорівнює 1A.
Тож додаємо 1А.
Дорівнює, і ми отримуємо цей результат.
Але ми розглядаємо тільки чотири байти, тому що це чотирибайтовий
регістр, тому ми повинні отримати 00000019, і це повинно бути збережено назад в ECX.
Тож дивіться ECX тут.
Переступите, і дійсно, ви отримаєте 19.
Отже, ця 1 тут усічена.
Далі ми віднімемо перший байт AL від CL, першого байта CL.
Отже, перший байт CL дорівнює 19, а перший байт AL дорівнює 1A.
Тож давайте з'ясуємо це зараз і спробуємо зробити це на калькуляторі.
Тож ми вводимо CL. КЛ - 19.
Пам'ятайте, що CL - це молодший байт регістра, як ми вже вивчали раніше.
Тому ми ігноруємо всі старші байти.
Ми розглядаємо лише перший байт, навіть якщо старші байти дорівнюють нулю.
Зараз ми обмежені лише одним байтом,
тому CL.
Отже, введіть 19 для CL, а потім ми віднімемо AL, який є молодшим байтом регістра EAX.
Отже, ми віднімаємо
AL.
AL - це
1A - 1A-Enter, і ми отримуємо FF.
Ми ігноруємо всі ці старші байти, оскільки вони усічені.
Чому?
Тому що, як ми вже вивчали раніше, метою є лише один байт.
Отже, усічення відбудеться у самому байті, і ми отримаємо
FF.
Тож ми очікуємо, що CL тут перетвориться на FF.
Тож давайте переступимо через нього, і, дійсно, ми побачимо FF.
Отже, ось як ми виконуємо інструкції віднімання, також відомі як SUB, на мові асемблера.
За бажанням ви можете зберегти його, для цього натисніть на кнопку Файл і виберіть Файл виправлення. Натисніть Patch, а потім тут ви
можете дати йому
ім'я: 04_SUB. EXE. Натисніть "Зберегти". Натисніть Гаразд, і ми зберегли
його.
На цьому відео все.
Дякуємо за перегляд.