Привіт і ласкаво просимо назад.
Сьогодні ми розглянемо інструкцію DIV, або інструкцію поділу.
Отже, це ключове слово, і воно означає "Розділити".
Основна ідея полягає в тому, що результат поділу зберігається в різних місцях.
Отже, коли ви ділите щось на дільник, ви отримуєте результат.
Одне з них буде вашим часткою, а друге - залишком.
Візьмемо, наприклад.
Отже, - це слово, що означає - байти, і ви збираєтеся розділити його за допомогою регістра - значення
в регістрі.
Синтаксис наступний.
У вас є ключове слово DIV, за яким слідує назва реєстру.
Отже, в даному випадку, припустимо, що ми збираємося зробити DIV -, отже, це будуть - операції,
які будуть відбуватися. Кожного разу, коли ви робите занурення, відбуваються операції.
Перша операція полягає у тому, що ви берете -, ділите з регістром - незалежно від того, яке значення
знаходиться у регістрі -, а потім результат ділення зберігається у -.
Отже, - буде молодшим байтом регістра -. І тоді залишок від цього ділення буде збережено
у старшому байті регістра -.
Отже, щоб отримати частку, ми виконуємо цілочисельне ділення.
Отже, коли ви ділите таким чином, ви отримуєте ціле число, а не дріб.
Отже, ви берете ціле число і зберігаєте його у своєму -байте тут.
Для того, щоб отримати залишок, ви виконуєте операцію залишку.
Тому цей символ відомий як залишок.
Іноді її ще називають операцією за модулем або по модулю.
Це означає, що ви отримуєте залишок від поділу.
Отже, зверніть увагу, що результатом є байт.
Параметр - слово - байти - але результатом є байт.
Я теж.
Параметр - це слово або - байт, і ви отримуєте один байт як залишок.
Отже, цей перший приклад відомий
як поділ байтового регістру. Регістр тут містить байт.
Ось чому ми називаємо це поділом байтового регістру.
Погляньмо на наступний поділ - поділ за регістром слів.
Отже, при такому поділі параметр зберігається частково в - регістрі, а частково в - регістрі.
Таким чином, ці аргументи будуть об'єднані, щоб сформувати остаточний аргумент, який буде розділений.
Отже, це - байти.
Це - байти - також відомі як слово і слово.
Отже, коли ви поєднуєте слова разом, ви отримуєте СЛОВО.
Отже, це СЛОВО розділяється словом.
Отже, ви будете ділити, щоб отримати цілий результат. Ділення тут дасть вам цілочисельний результат.
Таким чином, при діленні слова тут ви отримаєте частку від ділення, і цей результат
буде збережено в регістрі -. А решта буде зберігатися у вашому - реєстрі.
Отже, ваш результат - локації.
Тепер давайте подивимося на інший поділ:
поділ регістрів DWORD.
Отже, у цьому випадку ваш параметр зберігається у - регістрах: - та -.
Отже, тут це слово DWORD.
Це ще одне СЛОВО.
Отже, ви отримуєте QWORD.
Отже, QWORD має довжину - байт і розділене регістром DWORD.
Отже, в цьому випадку, знову ж таки, - об'єднуються, щоб отримати остаточний аргумент, який є дуже великим
числом.
А потім цілочисельне ділення дає частку, яка зберігається в -.
Результат зберігається в -, а залишок - залишок
буде збережено в -.
Тож, як бачите, тут діє той самий принцип, що й раніше.
Результат ділення - половина початкового розміру параметра.
Отже, тут параметром є QWORD, а результатом - DWORD.
Гаразд.
Тут це QWORD, а тут ви отримуєте DWORD.
Більше прикладів DIV.
Ось кілька прикладів поділу.
Ви також можете виконати DIV на байт.
Наприклад, тут - це старший байт для регістра -.
Отже, у цьому випадку - це ваш дільник, і ви ділите своє слово за допомогою -, який є байтом.
Таким чином, частка буде зберігатися в -, а залишок буде зберігатися в -.
Інший приклад: DIV -.
Тож у цьому випадку ваше - це дільник.
Це СЛОВО.
І ви ділите QWORD на DWORD, і результат ділення буде збережено в регістрі -, а залишок
буде збережено в регістрі -.
Інший приклад: DIV -. - є молодшим словом регістру -.
Отже, у цьому випадку ви ділите DWORD на слово, і отриманий результат буде збережено
у регістрі -, а залишок буде збережено у регістрі -.
Інший приклад:
DIV hex-.
Отже, це недійсна інструкція.
Параметр вимагає, щоб це був регістр.
Ви не можете вставити сюди константу.
Винятки.
Операція може спричинити помилки, також відомі як винятки.
Наприклад, ділення на нуль.
У цьому прикладі ви переміщуєте гекс - на -, і переміщуєте гекс - на -, потім переміщуєте гекс - на -, потім
робите
DIV -.
Отже, в даному випадку параметр -.
Просто щоб освіжити пам'ять:-:-. І ви ділите
-: - на -.
Отже, - це насправді - - всі нулі - і закінчується на -.
Але коли ви ділите зі знаком -, ви ділите щось
на нуль, і це призведе до помилки ділення на нуль.
Другий приклад.
Це виключення називається
виключенням переповнення частки, і воно трапляється, якщо результат частки занадто великий, занадто великий.
Наприклад, ви переміщуєте цей гекс - на -, а потім переміщуєте гекс "всі -" на -.
Так що параметр зараз - він буде дуже великим.
Це дуже величезна кількість.
Коли ви поєднуєте
це з цим, ви отримуєте параметр QWORD - дуже великий - і тепер ви переходите до -, а потім робите DIV -.
Це означає, що ви берете це величезне
число - це об'єднане з цим - це величезне число ділите на дуже маленький дільник.
Тому результат буде занадто великим, щоб зберігати його у вашому - або -.
Запам'ятайте, що у вас в результаті ділення вийшло - частини.
Коефіцієнт потрібно зберігати у вашому -.
Тепер ваше - занадто мале, щоб зберігати результат ділення,
тому що ділення дасть дуже велике число.
Отже, оскільки - не може зберігати велике число для частки, це викличе виключення переповнення частки.
Гаразд, давайте відкриємо наш x32dbg і спробуємо ввести цей код, щоб побачити виняток.
Отже, відкрийте x32dbg, а разом з ним і ваш шаблон - як і раніше, і ми введемо
ці інструкції і побачимо помилку, яка трапляється при спробі розбиття.
Тож давайте прокрутимо вниз до введення, натиснемо клавішу пробіл і почнемо вводити всі ці інструкції.
Отже, перше - інструкції для ініціалізації різних регістрів.
Отже, перший - це MOV -, hex -. Натисни Enter.
Другий - MOV -, hex -. Натисни Enter. Третій - MOV -, hex -.
Натисни Enter.
І четвертий - DIV -. І натисни Enter.
Отже, це ваш підрозділ.
Тепер ми спробуємо закрити
його і спробувати запустити, але перед цим перевірте, чи правильно ви ввели параметри - інструкції.
Переконавшись, що інструкції введено
правильно, поставте тут точку зупинки, клацнувши правою кнопкою миші, вибравши "Точка зупинки" і "Перемикач".
Я зробив це, а потім побіг до нього.
Тепер давай переступимо.
Він зупинився в точці розриву.
Відійди.
Тепер вона буде рухатися від - до -.
Підійдіть і перевірте
- тепер має -.
Тепер вона буде рухатися від - до -.
Переступаємо, і - тепер має значення -.
Отже, на цьому етапі наш параметр - об'єднаний з -. Це дає вам велике число: нулі, нулі та -.
Щоб освіжити вашу пам'ять, ми робимо
такий поділ: - об'єднується з -, щоб дати вам повний параметр.
Тепер ми будемо ділити, і
частка повинна бути в -, а залишок повинен бути в -.
Тож давайте переступимо через це.
- тепер зберігає -.
Отже, це дільник.
Отже, це велике число - ми розділимо на -, тобто на -.
Тож давайте переступимо через це і подивимося, що з цього вийде.
Поглянь.
Виняток першого попадання, і це виняток: ціле число ділиться на нуль.
Бачиш?
Ось так
ви побачите виняток на нижній панелі завдань тут.
Ось так виглядає виняток.
Тепер давайте спробуємо іншу.
Інший виняток - переповнення коефіцієнта.
Отже, зараз ми перезапустимо програму,
і цього разу повернемося сюди і введемо ваші другі інструкції тут.
Тож натисни пробіл.
Виберіть його, натисніть пробіл і введіть першу цифру.
MOV -, hex-.
Натисни Enter.
MOV -,
hex-.
Натисни Enter.
MOV -, hex
-.
Натисни Enter.
ЗАНУРЕННЯ.
Натисни Enter.
Тепер давайте перевіримо, чи правильно ви все ввели.
Гаразд.
Тепер ми ставимо точку зупинки, як зазвичай, тут.
Я вже це зробив.
Тепер натискаємо на кнопку "Виконати". Він потрапляє в наш брейк-пойнт, і давайте переступимо через нього.
Тепер перша інструкція - рухатися від - до -. Переступай,
і тепер - маєш.
Наступна інструкція полягає в тому, щоб перемістити це велике число сюди.
Перейдіть через це, а тепер підтвердіть - перевірте, чи з'явилися
ці великі цифри...
Далі потрібно переміститися
ось сюди.
Тож переступайте, а тепер - маєте.
Наступна інструкція розділить - з -.
Отже, це буде велике число - QWORD- - тут у поєднанні з -.
Вийде дуже довге число, яке потрібно розділити на -, тобто на -.
Таким чином, отриманий добуток буде збережено в -.
Давайте підійдемо і подивимося, що з цього вийде, і ви отримаєте виняток з першого разу.
Виключення: Переповнення цілого числа.
Отже, цілочисельне переповнення означає, що частка, яка є цілим числом, не може поміститися в -.
Він занадто великий для -.
Тому він переповнюється.
У цьому і полягає сенс
виключення: переповнення множника тут.
Коефіцієнт занадто великий.
У цьому уроці ви дізналися
про інструкцію DIV та параметри різних частин ділення, а також про деякі винятки, які можуть трапитися під час виконання ділення.
Це все для цього відео.
На наступному уроці ми виконаємо вправу -, а після неї - вправу -.
Тож побачимося на наступному уроці.
Дякуємо за перегляд.