Привіт і ласкаво просимо назад.
У цьому новому уроці ми розглянемо побітові інструкції з використанням інструкцій NOT, AND, OR та XOR.
Почнемо з інструкції NOT.
Синтаксис інструкції NOT складається з ключового слова NOT і місця призначення.
Отже, призначенням є сам регістр, наприклад, NOT -.
Отже NOT - переверне всі біти всередині регістра.
Так, наприклад, якщо ми візьмемо простий приклад регістра, який є восьмибітним регістром,
і спочатку, скажімо, перемістимо всі ці біти в регістр, а потім виконаємо операцію NOT -, це призведе до
того, що всі біти тут поміняються місцями на протилежні.
Наприклад, одиниця стає нулем, нуль стає одиницею і так далі.
Це відрізняється від оператора NEG.
Оператор NEG - це арифметичний оператор. NEG додає одиницю після перевертання бітів.
У цьому полягає ключова відмінність між оператором NEG і оператором NOT.
Іншою інструкцією є інструкція AND.
Синтаксис команди AND - це AND, за яким слідують адресат і джерело.
Це бінарний оператор, на відміну від інструкції NOT, яка є унарним оператором.
Наприклад, інструкція AND, якщо ми перемістимо ці вісім біт в -, а потім перемістимо ці вісім
біт в -, і виконаємо операцію з - і -, то відбудеться те, що вона візьме біти в регістрі -, виконає
операцію AND з бітами в регістрі -, і ми отримаємо результат назад в регістр
-.
Таким чином, регістр буде перезаписано результатом операції AND.
Отже, це логічна операція І.
Отже, одиниця і одиниця дає одиницю, нуль і нуль дає нуль, одиниця і нуль дає нуль, одиниця і нуль, і одиниця є нуль, одиниця і одиниця
дає одиницю, нуль і одиниця, одиниця і одиниця дає одиницю.
Отже, як ми вже дізналися раніше, для того, щоб отримати одиницю на виході, обидва входи повинні бути одиницями.
Якщо будь-який з входів не дорівнює одиниці, то результуючий вихід буде нульовим.
Далі ми переходимо до операційної інструкції.
Синтаксис інструкції АБО складається з ключового слова АБО, за яким слідують адресат і джерело.
Для прикладу використаємо той самий приклад, що й раніше.
Перемістіть це в -, і перемістіть це в -, і цього разу ми виконуємо операцію АБО з - і -.
Отже, у цьому випадку результат буде збережено назад у -, а в операції АБО один із входів
має бути одиницею.
Якщо обидва значення дорівнюють нулю, то вихід буде нульовим.
Якщо будь-яке з них дорівнює одиниці, то ми отримуємо одиницю на виході.
Ось такий результат операції в операційній.
Потім ми переходимо до інструкції XOR.
Синтаксис інструкції XOR наступний: XOR, за яким слідують адресат і джерело, і ми використовуємо той самий приклад.
Переміщаємо це в -, а це в -, і виконуємо XOR.
Таким чином, на виході буде одиниця, якщо тільки один з входів дорівнює одиниці.
Ви не можете мати обидва входи як один.
Наприклад, якщо один і один, вихід буде нульовим.
Отже, якщо один з входів дорівнює одиниці, а інший - нулю, то ми отримуємо одиницю.
Наприклад, тут ви отримуєте одиницю, тут ви отримуєте одиницю, тут ви отримуєте одиницю.
Якщо обидва входи дорівнюють одиниці, ви також отримаєте нуль.
Отже, як ви вже бачили, так працює логічний оператор XOR.
Отже, це інструкція XOR.
Отже, зараз ми також побачимо, що існує спеціальне застосування для XOR. XOR можна використовувати для обнулення регістра -.
Наприклад, якщо ви XOR - зареєструєте з самим собою, то отримаєте - стане нулем.
І ми вже бачили це на попередньому уроці.
А тепер, чому?
Чому ми використовуємо XOR для обнулення регістру замість MOV нуля на -?
Тому що ця інструкція вимагає п'ять байт, а інструкція XOR вимагає лише два байти.
Отже, це найкращий спосіб обнулити регістр.
Тож давайте спробуємо це.
Спробуйте це на нашому x64dbg.
Тож давайте відкриємо наш шаблон і подивимося, як це працює.
Тож давайте перейдемо до нашого слайду і спробуємо з першою інструкцією - NOT.
Припустимо, тут ми ставимо, ми переміщуємо це число в регістр, тобто пробіл і тип MOV -, і тип 0B для двійкового і ключ в двійковому
числі один, два, три, чотири, п'ять, шість, сім, вісім, а потім виконуємо
NOT -.
Тож давайте спробуємо прямо зараз.
Скажімо, ви ставите точку зупинки тут, а ми біжимо до нашої точки зупинки і переступаємо її.
Отже, ми перемістимо цей гекс 85 на -. Hex 85 - це двійкове число.
Ви зможете поглянути на нього, як тільки ми перейдемо.
Гаразд.
Отже, маємо гекс 85, скопіюємо його і подивимось, як він виглядає у двійковій формі.
І як ви можете бачити тут, у двійковій формі, це 10000101, двійкове число, яке ми вводимо.
Далі ми збираємося НЕ -, тож давайте НЕ - і подивимося, що з цього вийде.
Ми НЕ -, ми отримуємо це число.
Тож давайте скопіюємо його зараз, введемо в наш калькулятор і подивимось, як він виглядає в двійковій формі.
Отже, як ви бачите, ми отримали цей номер: 01111010, який ми й очікували отримати.
01111010.
Так.
Ось що ми маємо.
Ось як працює НЕ.
Тепер перейдемо до наступного.
Наступна інструкція - це інструкція AND.
Тож тепер ми зробимо те саме тут.
Ми переміщуємо, ми перемістимо це в -, тому ми введемо MOV -, бінарний,
10100101 в -, і ми перемістимо в -.
- 0B.
Я помилився.
10100101.
Гаразд.
А потім переходимо
до бінарного 10011111.
Отже, ми маємо один, два, три, чотири, п'ять, шість, сім, вісім.
Гаразд.
Переконайтеся, що все правильно.
А потім ми робимо І - і -.
Гаразд, давайте продовжимо переступати і подивимося, що станеться.
Тож давай переступимо. Перемістіть A5 в -, так що A5 в -.
Тож давайте подивимося, що є в форматі А5.
Здається, я ввів неправильний номер в - в це, тому давайте зробимо виправлення там.
Давайте обнулимо це і спробуємо ще раз.
Бінарний, нуль, кілька NOP.
Гаразд, давай спробуємо ще раз.
Якщо ми почнемо звідси.
Тож переходимо
до - 0B 10100101.
Гаразд, давайте залишимо все як є. Все гаразд.
А тепер перейдемо до - значення 0B, двійкове значення, 1001, два, три, чотири, п'ять.
А потім ми І - і -, і -, і що ми отримаємо.
Гаразд, давай переступимо.
Відійди.
Отже, ми отримали А5.
Отже, A5 в -, давайте скопіюємо це і подивимося, як це виглядає.
Отже, ми отримуємо
цей номер, 10100101, 10100101.
Так, саме так.
І тепер ми переходимо до цього значення 9F, тож давайте подивимось.
-, давайте підемо і подивимося на -.
Ось вона,
10011111.
Бачиш?
10011111.
Правильно.
Отже, тепер ми виконуємо операцію AND, і результат буде тут.
Давайте скопіюємо наш код, додамо його до нашого списку і подивимося, що вийде.
Так ми отримуємо 10000101, 10000101.
Правильно.
Ось що ми отримуємо.
Гаразд.
Тож давайте спробуємо наступний оператор
- OR, операцію "АБО". Ми робимо це тут.
Тож давайте перейдемо
на -, binary, 10100101, а потім на
-, binary, 10011111.
Гаразд, ми це зрозуміли.
Тоді ми зробимо операцію АБО - -.
Гаразд, давайте переступимо через це і подивимося.
Переступи, пересунь це в -.
Отже - має таке значення.
Давайте скопіюємо це і підтвердимо, що все вірно.
Так,
це 10100101, 10100101.
Наступний крок.
9F в, так що 9F в -.
Ставимо
галочку -, копіюємо це значення і вставляємо сюди, і бачимо 10011111, 10011111.
Зараз
ми їдемо в операційну. Гаразд, давайте зробимо АБО, і результат буде в -, тому давайте перевіримо
-, тому скопіюємо значення звідси і вставимо його сюди, і ми отримаємо 10111111.
Ось так.
Правильно.
Гаразд.
Отже, давайте спробуємо останню інструкцію - інструкцію XOR.
Отже, ми будемо переміщатися, MOV в - це двійкове значення.
- 0B, двійковий, 10100101.
А потім ми переходимо до
двійкового числа 10011111.
А потім XOR - -.
Давай подивимося.
Гаразд.
Тож зараз ми переступимо.
Тут у нас А5. Давай просто перевіримо.
Що таке А5?
A5 - це число, яке збігається з цим числом тут.
Тепер переступай. Ми потрапляємо 9F в -, тож давайте перевіримо -.
Ось ця цифра, яка
є такою.
Так що все правильно.
Далі ми зробимо XOR -.
Тож давайте переступимо, і результат буде, буде збережено назад в -, в - регістр.
Тож давайте перевіримо - зареєструйтесь, скопіюйте це і вставте сюди.
І ми бачимо, що отримуємо ось це число, тобто ось цю цифру.
Так, саме так.
Ось як працює інструкція XOR.
Отже, ще один приклад.
Давайте розглянемо використання XOR для обнулення регістру.
Отже, ми можемо використати XOR тут. Просто введіть XOR - - і подивіться, що станеться.
Гаразд.
Тепер ми продовжимо крокувати, поки не дійдемо до цієї лінії,
але поки що не переступайте її.
Зверніть увагу - має 3А, а той - 3А.
Отже, ми переступаємо через інструкцію XOR, вона стає нульовою.
Гаразд, ось як це працює.
Тепер, якщо ми зробимо інструкцію переміщення, MOV - нуль, вона може працювати, але зверніть увагу, що MOV - нуль
займає п'ять байт, п'ять байт. Спокійно.
Але XOR - - займає лише два байти.
Ось чому XOR краще, ніж
MOV
- нуль.
Гаразд, давайте збережемо це зараз.
Отже, перейдіть до меню Файл і виберіть Файл виправлення, натисніть кнопку Виправлення, а потім натисніть кнопку Ім'я для нього.
Назвемо його 46_46 і скажемо bitwise_ops_NOT_XOR.
Натисніть "Зберегти".
На цьому відео все.
Дякуємо за перегляд.