Привіт і ласкаво просимо.
У цьому уроці ми розглянемо інструкції CMP.
CMP розшифровується як Compare.
CMP використовується для порівняння двох чисел.
Прикладом є CMP -, -. Отже, якщо ви порівнюєте два числа, ви візьмете - мінус
-, і він змінить прапори відповідно, але не змінить значення в - або -, так що - або - можуть
бути регістрами - або -, і після цього ви можете використовувати JC для переходу на основі результату порівняння.
Отже, якщо - менше ніж -, то встановлюється прапорець перенесення.
Тож він стрибне.
Якщо - дорівнює -, прапорець перенесення скидається.
JNC і JC не переходять, якщо - і - є-- більше, ніж - також очищено, тоді JC також не переходить.
Зверніть увагу, що у x64dbg JC також відомий як JB, перейдіть, якщо це не так.
Це означає, що якщо - менше -, тобто - менше, ніж -, то стрибаємо.
У цьому сенс JB.
Ось приклад, який допоможе прояснити ситуацію.
Отже, перша команда переміщує нуль на -.
Потім перемістіть одну до -, потім дві до -.
Таким чином, ці три просто ініціалізують значення в -, -, і -.
Потім порівнюємо -, -.
Отже, коли ми порівнюємо два таких значення, ми беремо - мінус -.
Але ми цього не
робимо - ми не зберігаємо результат віднімання в -.
Це лише симуляція віднімання.
Отже, CMP - це фактично симуляція віднімання.
Отже, коли ви віднімаєте два таких значення, може бути три результати, три можливих сценарії.
По-перше, якщо - менше ніж -, то прапорець перенесення буде встановлено в одиницю.
Якщо - дорівнює -, то прапорець перенесення скидається.
Якщо - більше, ніж -, то прапорець перенесення також скидається.
А потім на основі цього прапорця ми отримуємо інструкцію зі стрибка,
JC.
Це JC означає стрибок при перенесенні.
Отже, в цьому випадку, якщо прапорець встановлений в одиницю, то це означає, що він буде стрибати.
Якщо прапорець перенесення очищено до нуля, то стрибок не відбудеться.
Я теж.
У цьому сенс Ісуса Христа.
Отже, у цьому сценарії, якщо - дорівнює одиниці, а - дорівнює двом, коли ви виконуєте таке порівняння, CMP -, -, тому що - мінус
- дасть вам від'ємне число, буде перенос.
Отже, відбувається те, що прапорець перенесення буде встановлено.
Отже, коли встановлено прапорець перенесення, JC перейде до 401547, що знаходиться тут, а потім
збільшить значення в - на одиницю.
Так - стає одним цілим.
Спочатку він був нульовим.
Отже, якщо - менше, ніж -, то - в результаті буде дорівнювати одиниці.
Візьмемо інший сценарій.
Що, якщо - і - - це одне ціле?
Отже, коли ви робите порівняння, CMP -, -, якщо -, коли ви віднімете це, ви отримаєте нуль.
- мінус -.
Отже, прапорець перенесення не встановлено.
Отже, оскільки прапорець перенесення очищено, то стрибок JC не відбудеться.
Він піде сюди і збільшиться на одиницю.
- на одиницю - стає одиницею, а потім збільшується ще
раз - на одиницю.
Так і є - тепер їх стало двоє.
Отже, якщо - дорівнює -, то остаточний результат - буде дорівнювати двом.
Те ж саме,
коли - більше, ніж -.
Отже, якщо - це три, а - це два.
Отже, коли ви порівнюєте - мінус -, ви отримуєте три мінус два.
Після цього прапор знімається.
Отже, оскільки прапорець перенесення знято, цей JC не стрибне.
Він не стрибне.
Отже, він піде сюди,
приріст - на одиницю.
- стає одиницею, приріст знову дорівнює - стає двійкою.
Отже, кінцевий
результат: якщо - більше, ніж -, то - дорівнює двом.
Зверніть увагу, що, як я нагадував раніше, у x64dbg JC також відомий як JB, перейдіть нижче.
Отже, ви можете зрозуміти це так: коли ви порівнюєте два числа,
JB - припустимо, зараз це
JB - і якщо це JB, то це означає, що він перевіряє, чи - менше, ніж -.
Якщо - нижче -, тобто якщо - менше -, то воно перескочить.
Отже, логічно, що якщо - і - рівні, або якщо - більше, ніж -, то JB не буде істинним, тобто не буде стрибати.
Це ще один спосіб подивитися на це інтуїтивно.
На цьому відео все.
У наступній статті ми спробуємо написати цей код і протестувати його в x64dbg.
До зустрічі в наступному випуску.
Дякуємо за перегляд.