Привіт і ласкаво просимо назад.
У цьому уроці ми дізнаємося про арифметичний зсув, який використовується для множення та ділення.
Існує два види арифметичного зсуву: беззнаковий
і знаковий.
Давайте розглянемо множення та ділення без знаку.
По-перше, зсув вліво означає множення на два, а зсув вправо - ділення на два.
Наприклад, якщо ми хочемо помножити це число на два, ми перемістимо його на - перший.
І коли ми зсуваємося вліво, SHL означає зсув вліво - на одиницю.
Отже, коли ми робимо зсув вліво - на одиницю, ми зсуваємо всі біти на одну позицію вліво. Це має ефект множення
на два.
Отже, ми отримуємо вісім.
Зсув вправо означає ділення на два.
Наприклад, якщо у нас вісім переміщено в -, і ми робимо зсув вправо на одиницю, що означає переміщення
кожного біта на одну позицію вправо, це має ефект ділення на два.
Тож їх стане чотири.
Отже, давайте спробуємо це зараз і подивимося, що станеться, коли ми спробуємо зробити це в x64dbg.
Відкриваємо наш перший шаблон.
Перейдіть сюди і введіть ці інструкції.
MOV -,
чотири, зсув вліво -, один.
Тож давайте поставимо точку зупинки, що я вже зробив, і запустимо.
Він потрапляє в наш брейк-пойнт, і давайте переступимо через нього.
Переступайте через нього і переступайте через
цей MOV - чотири.
І ми бачимо, що маємо чотири в -.
Тепер зсуваємося вліво - на одиницю, і отримуємо вісім.
Тож це має ефект примноження.
Отже, тепер ми маємо вісім у -. Давайте зробимо цю частину тут, де ми зсуваємося вправо - на одиницю.
Отже, тут давайте поставимо інструкцію зсуву вправо
- на одиницю.
Потім ми переступаємо, і тепер бачимо - стає знову чотири.
Тож це має ефект поділу.
Отже, зсув вправо означає ділити.
Тож давайте розглянемо інший сценарій, де ми підписали множення та ділення. Для знакових множення і ділення ми не можемо використовувати
зсув вліво або вправо,
тому що зсув вправо призведе до помилки. Зсув вліво працює для підписаних і непідписаних.
Зсув
вправо працює тільки для непідписаних.
Отже, для поділу ми повинні використовувати інструкцію SAL та інструкцію SAR.
Тож давайте подивимося, як це працює.
Отже, SAL означає зсув арифметики вліво, що означає знакове множення на два, а SAR означає зсув арифметики вправо,
що означає знакове ділення на два.
Наприклад, якщо ми перемістимо це число 0xFC, що є від'ємною четвіркою, і виконаємо SAL -
одиницю, то отримаємо множення.
Таким чином, від'ємні чотири стануть від'ємними вісьмома, тобто 0xF8.
Ще один приклад для арифметики зсуву вправо, що означає
знакове ділення на два.
Отже, припустимо, що у нас є число, від'ємне вісім, яке має вигляд 0xF8.
Якщо ми зробимо SAR, це змістить кожен біт на один біт вправо.
І ми отримуємо від'ємне чотири, що означає ділити.
Отже, давайте спробуємо це зараз у нашому x64dbg.
Отже, тут ми пропускаємо один рядок і ставимо сюди,
переходимо, переходимо в - 0xFC, а потім робимо SAL - один, SAL - один.
Гаразд.
Зараз ми тут.
Давай переступимо.
Отже, коли ми переступаємо через ці інструкції, ми переміщуємо FC на -.
Так що ж таке ФК?
Відкрийте свій калькулятор, калькулятор програміста.
Встановіть значення byte, а потім встановіть значення hex і введіть FC. І ми бачимо, що FC дорівнює від'ємній четвірці, отже, ми маємо від'ємну
четвірку тут у -.
Зараз ми будемо робити SHL - один.
Вибачте, це має бути SAL.
Я помилився.
Вибач.
Давайте виправимо це на SAL один.
Гаразд.
Отже, як ви можете бачити, коли я вводжу SHL one, x64dbg виправляється на SAL.
Це означає, що SAL і SHL працюють однаково для підписаних.
Тож давайте почнемо з цього.
Тож ми переступаємо через це і натискаємо F8.
Так що ж таке F8?
Давайте подивимося на клавішу F8 у нашому калькуляторі.
Отже, очистимо ввід, переконаємося, що він все ще байтовий, перейдемо до шістнадцяткового режиму і наберемо F8.
Як бачите, F8 - це від'ємна вісімка, тому вона працює.
Отже, SHL і SAL рівні.
Він може працювати як для знакових, так і для беззнакових чисел.
А як щодо поділу? Поділ для знакових чисел, нам потрібно використовувати SAR.
Отже, зараз ми введемо SAR. Оскільки у нас вже є від'ємна вісімка,
ми вже маємо
від'ємну вісімку, тому зараз ми зробимо SAR - одиницю, яка ділиться на два.
Тож давайте зробимо це зараз.
SAR - один.
Тож давайте переступимо через це.
І ми бачимо,
ми бачимо
ФК. Так що ж таке ФК?
Поверніться до свого калькулятора.
Очистіть вхід, переконайтеся, що це байт,
і введіть FC. А FC дорівнює від'ємним чотирьом.
Отже, як ви бачите, якщо ми робимо SAR, він зберігає від'ємне число. ПС. Якщо ми спробуємо провести SHR тут, то отримаємо дивний
результат.
Ви не отримаєте від'ємне число.
Тому для ділення потрібно використовувати SAR, якщо
це знакове число. Давайте збережемо це зараз.
Отже, натискаємо Файл, Файл виправлення і називаємо його 47_47
dash arithmetic_shifting_x.
Збережи.
На цьому відео все.
Дякуємо за перегляд.