Привіт і ласкаво просимо назад.
У цьому уроці ми розглянемо IMUL та IDIV, операції множення та ділення зі знаком.
Раніше ми вже писали про це.
Ми розглянули беззнакову версію multiply, яка виглядає як MUL, а також беззнакову версію
DIV.
Тож зараз ми розглянемо підписану версію.
Як працюють IMUL та IDIV.
IMUL, IDIV знають про знак чисел.
Він запам'ятовує знак числа.
Спочатку він перетворює його на додатне, множить або ділить, а потім повертає результат до початкового знаку, використовуючи
представлення доповнення двійки.
Отже, давайте розглянемо синтаксис IMUL.
Спочатку йде синтаксис IMUL, за яким слідує регістр.
Отже, припустимо, що у нас є значення, число, у регістрі -, а потім ми множимо з іншим регістром, який також
є байтовим регістром, наприклад, - .
Результат буде збережено у файлі - . Отже, якщо байт помножити на байт,
результатом буде слово, два байти.
Також, якщо ви візьмете слово, помножите на регістр слів, то результат буде збережено в - : - .
Це означає, що ми об'єднали два різні реєстри слів, щоб отримати результат.
Також, якщо взяти регістр DWORD, помножити на інший регістр DWORD, то результат
буде збережено у - : - .
Конкатенація двох DWORD-реєстрів.
Отже, принцип той самий, що й у MUL, який ми вивчали раніше.
Немає ніякої різниці.
Це те саме.
Різниця лише в тому, що цей знає про знак.
Тож перед тим, як розмножуватися, він спочатку перевірить знак.
Якщо це від'ємне число, він спочатку перетворить його на додатне, а потім виконає ту саму
операцію, що й множення або ділення без знака.
А після того, як він отримає результат, він перетворить його назад у вихідний знак, використовуючи представлення доповнення
двох.
Це єдина відмінність.
В іншому, множення відбувається точно так само.
Візьмемо приклад. Спочатку розглянемо приклад IMUL.
Припустимо, у нас є від'ємне число 9C. Отже, 9C - це представлення доповнення двійки для
від'ємного 64.
Отже, якщо ми перенесемо його до - , то отримаємо від'ємне число.
І якщо ми помножимо це від'ємне число на додатне, то отримаємо від'ємний результат.
Так.
Отже, ми переміщуємо 19 до - , а потім називаємо IMUL - .
Це означає, що ми беремо - , множимо на - , і результат буде збережено в - .
- буде від'ємним числом, F63C.
Тож давайте подивимося на калькулятор.
Ми відкриємо наш калькулятор і спробуємо прорахувати.
Сюди, подивимось.
Отже, це калькулятор для програмістів.
Отже, вводимо 64.
Тепер спочатку перевіримо 9C, тому виділимо цей байт тут.
Ми можемо натиснути на нього, щоб змінити байт.
Отже, 9C - це байт, тому ми
змінюємо його на байт.
Отже, ми вводимо 9C, 9C, і ви одразу бачите, що це від'ємне число, тому що перший значущий
біт дорівнює одиниці.
Тепер, якщо ви хочете знати, як перетворити це на додатне число, ми повинні натиснути на це.
Отже, 9C - це насправді 64.
Якщо воно перетворилося на додатне, ви клацніть ще раз, і воно знову перетвориться на від'ємне 64.
Отже, 9C дорівнює від'ємному 64.
Клацніть на ньому ще раз, і 64 буде позитивним числом для 64.
Отже, як я вже казав, перед тим, як виконати множення, припустимо, що це 9С. Тепер, перш ніж виконувати множення, IMUL, дивіться
тут, ми повинні спочатку перевірити знак.
Отже, в цьому випадку знак є від'ємним числом.
Тепер перше, що ви робите, це перетворюєте його на додатне число, перетворюєте його на додатне число.
Щоб натиснути, треба
натиснути ось це.
Стає 64.
Тепер ви хочете помножити на 19.
19 - додатне число.
Так.
Отже, ви хочете помножити на 19.
Як ви це робите?
Спочатку ви змінюєте на слово, тому що результат буде збережено у - , яке є словом.
Потім ви множите на 19, одну дев'ятку.
Як бачите, одна дев'ятка є додатним числом, оскільки старший біт дорівнює нулю,
і результат дорівнює дев'яти
C4. Тепер дев'ять
C4 є додатним числом.
Тепер ми знаємо, що знак повинен бути від'ємним числом, тому нам потрібно перетворити дев'ять
C4 назад у представлення доповнення до двійки для від'ємних дев'яти C4.
Отже, нам потрібно натиснути на це, і ми отримаємо F63C, F63
C.
Ось як це працює.
Отже, F63C є від'ємним числом, як ви можете бачити звідси.
Гаразд, тепер давайте спробуємо це всередині x64dbg і подивимося, як це працює.
Тож запустіть x64dbg і відкрийте шаблонний файл.
А потім прокрутіть вниз і введіть ці інструкції.
Спочатку переміщуємо
- , гекс 9C в - . Клац.
Гаразд.
Потім
MOV - , гекс 19.
Гаразд.
А потім ми ІМУЛЮЄМО
- . Клац.
Гаразд.
Отже, тепер давайте поставимо тут точку зупинки.
Я вже це зробив.
Тепер натисни на "Запустити".
Ти б'єш по нашому брейк-пойнту, і ми переступаємо.
Перемістіть 9C на - .
Отже - має зараз 9С, як ви можете бачити звідси.
А потім, якщо ви клацнете правою кнопкою миші, скопіюєте його і введете у свій калькулятор, ви побачите,
що це від'ємне число.
Це - , і одиниця, яка показує, що це від'ємне число.
Далі переміщуємо 19 на - .
Тож давай переступимо.
А тепер - має 19, 6, 19.
Ми перевіряємо і бачимо.
Скопіюйте це і вставте сюди.
І ви можете бачити, що останній байт тут показує, що це додатне число.
Чому?
Тому що це нуль.
Старший біт - це нуль.
Тепер ми перейдемо до IMUL - , і результат буде збережено в - .
- це два байти.
009
C. Це два байти.
Отже, IMUL - .
Давай переступимо.
І тепер результат зберігається тут як F63
C.
F63 C.
Так само, як і в нашому калькуляторі F63
C.
Так.
Отже, тепер ми перевіримо цей F63
C.
Зрозумів.
Зайдіть у наш калькулятор і вставте сюди, і ви побачите, що це - , і це від'ємне число.
Чому?
Тому що цей, найстарший біт, дорівнює одиниці.
Ось як працює IMUL.
На цьому відео все.
У наступній статті ми розглянемо інші приклади.
Дякуємо за перегляд.