Привіт і ласкаво просимо назад.
Сьогодні ми вивчимо інструкцію MUL.
MUL розшифровується як Multiply.
Приклади MUL.
Це синтаксис.
MUL - це ключове слово, за яким слідує регістр.
Регістром може бути регістр EAX, EBX тощо.
Отже, він бере значення з вказаного вами регістра, множить його на AL і зберігає результат
в AX.
Отже, це однобайтовий регістр.
А потім, коли він зберігає результат назад, він записує його в регістр слів, який складається з двох
байт.
Тому він завжди вдвічі більший за оригінал.
Інший приклад: AX помножити на регістр.
Отже, у цьому випадку AX - це регістр слів, який складається з двох байт.
Коли він перемножується з іншим регістром, результат записується назад у
регістри DX і AX.
Тож частина результату буде в DX.
А інша частина результату буде в AX.
Знову ж таки, це вдвічі більше, ніж розмір оригінального реєстру.
Початковий регістр - це слово, а результат - DWORD.
Наступний - EAX.
EAX.
Отже, у цьому випадку це регістр DWORD.
Отже, ви берете DWORD, значення в регістрі DWORD, перемножуєте з іншим регістром,
і результат множення зберігається назад в EDX:EAX.
Таким чином, частина результату буде в EDX, а інша частина - в EAX.
Отже, ми знову бачимо, що результат вдвічі більший за початковий регістр.
Отже, EDX:EAX.
EDX:EAX означає, що EDX і EAX об'єднані разом.
Зверніть увагу, що розмір результату завжди вдвічі більший за розмір оригіналу.
Отже, якщо оригінал - це байт, то результат - це слово.
Якщо оригінал є словом, результатом буде СЛОВО.
Якщо оригінал має формат DWORD, результатом буде QWORD.
Це означає вісім байт.
Отже, це чотири байти.
Це вісім байт.
Це два байти.
А це - СЛОВО.
Це байт.
І це слово.
Тож давайте розглянемо більше прикладів MUL.
МУЛ.
Ось приклад:
MUL ECX. MUL ECX означає, що ви берете значення з регістра ECX, множите його на будь-яке
значення з регістра EAX, і результат зберігається в EDX:EAX.
Це означає, що частина результату в EDX, а частина в EAX.
Отже, ви об'єднуєте їх разом і отримуєте повний результат.
Інший приклад.
МУЛ СІ.
MUL SI - це коли ви берете значення слова в регістрі SI, яке становить два байти, множите на слово в AX,
яке також становить два байти, і результат множення зберігається в DX:AX.
Таким чином, DX:AX, об'єднані разом, дають повний результат.
Інший приклад: MUL AL.
Отже, у цьому прикладі ви берете те, що є в регістрі
AL, і множите на те, що вже є в AL.
У цьому випадку це лише один байт, помножений на інший байт, і результат зберігається у слові, яке складається
з двох байтів.
Інший приклад.
Це неправильна інструкція, оскільки ви не можете вказати константу.
Ви повинні надати реєстр, який ви збираєтеся використовувати для операції MUL.
Тож зараз ми зробимо кілька вправ.
Тож просто запустіть x64dbg.
Відкрийте x64dbg, а потім відкрийте файл template1. exe-файл.
Прокрутіть вниз і почніть писати свій код тут.
Тепер я збираюся ввести весь цей код сюди.
Перші три команди ініціалізують початкові значення для EDX, EAX та ECX.
Тож почнемо звідси.
Ви натискаєте на нього, натискаєте пробіл і починаєте вводити.
MOV EDX,
гекс A B1E2F
F F F.
Натисни Enter.
Наступний: MOV
E AX, 0x3.
Натисни Enter.
Наступний:
MOV ECX, гекс 2.
Натисни
Enter.
Наступний:
MUL ECX.
Натисніть Enter, а потім MUL ECX.
Натисніть Enter ще раз, а потім MOV AX, hex EE EE.
Натисни Enter.
Наступний:
MUL AX. Натисни Enter.
І остання:
MUL CL. Натисни Enter.
Тепер просто зупиніться на мить і перевірте, чи правильно ви ввели інструкції.
Після того, як ви переконалися, що все правильно, ви можете поставити тут точку зупинки звичайним способом, клацнувши
правою кнопкою миші тут, перейшовши до пункту Breakpoint і натиснувши на Toggle, що я вже зробив.
Потім натисни "Виконати".
Якщо ми зараз досягли точки розриву, давайте переступимо через неї.
Тепер він перенесе це значення в EDX, який знаходиться тут.
Тож ми переступаємо через неї і підтверджуємо, що тепер вона має таке значення.
Наступним буде переміщення 3 в EAX.
Давайте переступимо через нього і перевіримо, що тепер він має таке значення: 3.
Далі ми переїдемо 2 в ECX.
Переступимо через нього і перевіримо, що ECX тепер має значення 2.
Тепер ми виконаємо наше перше MUL-обчислення.
Тож давайте відкриємо ваш калькулятор програміста.
Переконайтеся, що ви натиснули на Hex.
А тепер ми візьмемо все, що є в ECX, помножимо на все, що є в EAX, і результат буде
збережено назад в EDX:EAX.
EDX:EAX.
Просто щоб освіжити вашу пам'ять, він зробить так.
Він візьме все, що є в EAX, помножить на все, що є в ECX, і збереже результат назад в EDX:
EAX.
EDX:EAX.
Тож давайте спочатку спробуємо з калькулятором.
Отже, давайте спочатку введемо те, що знаходиться в EAX, тобто 3.
Потім ми помножимо на те, що знаходиться в ECX, тобто на 2.
Отже, ми вводимо 2, натискаємо і натискаємо рівність, отримуємо 6.
Таким чином, ми очікуємо побачити 6 всередині EDX:EAX.
EDX:EAX.
Поглянь.
Тепер так.
Цей EAX тепер ось такий.
Тож давай переступимо.
І тепер EDX - це все нулі, а EAX - 6.
Таким чином, повний результат знаходиться в EDX:EAX.
Якщо об'єднати це і це, отримаємо 6.
Отже, результат має довжину вісім байт.
Ці вісім нулів об'єднані тут з усіма цими значеннями.
Так ми отримуємо
довгий результат: 0000000000000006.
Це дуже довгий результат.
Це восьмибайтовий результат.
Тому, щоб освіжити вашу пам'ять, восьмибайтовий результат: об'єднайте EDX з EAX, щоб отримати повний результат.
Отже, це восьмибайтовий результат.
Отже, переходимо до наступної інструкції. Він знову помножить ECX на EAX.
Тож тепер перейдемо до нашого калькулятора.
Наш калькулятор тепер показує, що - гаразд, давайте все очистимо.
Що ж зараз є в EAX?
EAX зараз має 6, тому ми вводимо 6 першим.
Отже, він помножить ці 6 на ECX.
Що входить до складу ECX?
ECX дорівнює 2.
Отже, ми множимо на 2, дорівнює, і отримуємо 12.
C - це 12.
Як бачите, у десятковій системі числення це 12; C - гекс для 12.
Тож ми очікуємо побачити результат в EDX та EAX.
Тож EDX все одно дорівнюватиме нулю.
EAX має бути рівним C.
Тож давайте відійдемо від цього і подивимося, що станеться.
EDX дорівнює нулю.
EDX- EAX - EDX дорівнює нулю, а EAX дорівнює C.
Ось і весь результат.
Повний результат - це всі ці нулі в EDX, об'єднані з усіма цими значеннями в EAX.
Ось такий у нас результат.
Наш повний результат, згідно з цим форматом.
Тепер ми перемістимо це значення в AX.
Отже, це значення є двобайтовим або словесним, і AX також є словом.
Отже, AX - це фактично ці два байти, 000C - це і є AX.
Отже, ми перемістимо EEEE у ці два байти.
Підійдіть і переконайтеся, що тепер EEEE знаходиться всередині нижнього слова для EAX.
Тепер ми помножимо все, що знаходиться в AX, на AX, а потім збережемо результат у DX:AX.
Ось така формула.
Формат - він візьме все, що є в аргументі, в регістрі.
У цьому випадку регістр - AX, множимо на сам AX, а потім зберігаємо результат у DX:AX.
Таким чином, частина результату буде в DX, а частина в AX.
Тож давайте спочатку спробуємо це зробити за допомогою калькулятора.
Давайте очистимо вхід.
Отже, давайте подивимося, що є в AX.
AX - це EEEE, тож давайте введемо це: EEEE. І він буде примножуватися з AX.
Помножте на EEEE. EEEE помножте на EEEE і натисніть "дорівнює" - ви отримаєте
таке значення: DEFF6544.
Отже, DEFF буде зберігатися в DX - ці два байти тут - і 6544 буде зберігатися в двох байтах тут, AX, відповідно
до цього формату.
Так, він зберігається частково в DX і частково в AX.
Тож давайте переступимо через цю інструкцію і подивимося, як це відбувається.
І це дійсно
так,
ви бачите, що ви отримуєте частину в DX: DEFF, а частину в AX: 6544.
Щоб освіжити вашу пам'ять: частина в DX, частина в AX.
Отже, частина DX зберігає DEFF, а частина AX - 6544.
Як ми і прогнозували
тут: DEFF 6544.
Гаразд.
Тепер повернімося до останнього.
Останній.
Ми збираємося примножити все, що є в CL.
CL - один байт.
CL має на увазі цей 02.
Це КЛ.
Ми помножимо цей CL на один байт в AL.
Отже, це AL, що дорівнює 44, а результат буде збережено в AX.
Тож це стосується саме цього формату.
Що б не було в регістрі, помножте AL і збережіть його в AX.
Тож спочатку ми спробуємо це зробити на нашому калькуляторі.
Тож відкривайте наш калькулятор. Введіть все, що є в AL.
Отже, АЛ - 44.
Отже, вводимо
4-, спочатку очистимо це. Введіть 44, що відноситься до AL, а потім ми помножимо на все,
що знаходиться в CL.
CL дорівнює 02, тому помножте на 2, і ми отримаємо 88.
Отже, цей 88 має зберігатися всередині AX, тому він буде 0088.
Тож давайте переступимо через це і подивимося, як це відбувається.
Дійсно, ми отримуємо 0088.
Пам'ятайте, що формат один байт помножений на один байт дає два байти. Один байт, помножений на один байт, дає слово - це означає,
що воно вдвічі більше за оригінал.
Отже, в цьому випадку один байт спочатку знаходиться в CL, тобто 02, помножений
на один байт, що знаходиться в AL, і результат зберігається в AX: 0088.
Отже, ось як можна виконувати множення за допомогою інструкції MUL в асемблері.
Тож давайте збережемо це зараз. Файл, Виправлення, клацніть Файл виправлення, а потім тут ви можете дати йому назву. Назвемо його
06-мул. exe і натисніть кнопку Зберегти. Натисни ОК.
На цьому відео все.
Дякуємо за перегляд.