Частина 18 – Дебагування ADDS

Для повного змісту змісту всіх уроків натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть розглянуті.

Давайте знову переглянемо свій код:

Ми знову додаємо 100 десятичне в r1, 4,294,967,295 в r2. Потім ми додаємо r1 і r2 і розміщуємо в r0.

Давайте дебагуємо:

Ми знову бачимо додаємо, яке встановлює флаги в CPSR. Нам потрібно пам'ятати, коли ми дебагуємо в GDB, значення CPSR знаходиться в шістнадцятковому вигляді. Для того, щоб побачити, які флаги встановлені, нам потрібно перетворити шістнадцятковий на бінарний. Це зробить сенс, коли ми почнемо дебагувати і хакувати цей приклад у майбутніх уроках.

Нам потрібно пам'ятати, що біти 31, 20, 29 і 28 в CPSR вказують наступне:

Біт 31 - N = Позитивний Флаг

Біт 30 - Z = Нульовий Флаг

Біт 29 - C = Флаг переносу

Біт 28 - V = Флаг переповнення

Ми бачимо CPSR в 10 шістнадцятковий. 10 шістнадцятковий в бінарному вигляді 00010000.

Отже, якщо значення в бінарному вигляді було 00010000 біта 31, 30, 29 і 28 (NZCV) це означало б:

Позитивний Флаг НЕ встановлений

Нульовий Флаг НЕ встановлений

Флаг переносу НЕ встановлений

Флаг переповнення встановлений

У коді вище нічого не встановлює Флаг переповнення, але в його природньому стані після виконання цього бінарного він встановлений.

Давайте пройдемося по програмі:

Ми бачимо 64 шістнадцятковий або 100 десятичний переміщений в r1 як очікувалося. Ні зміни в CPSR. Давайте крок за кроком.

Ми бачимо додавання, яке відбувається вище, і помічаємо значення в r0 є 99 десятичний після 100 десятичний і 4294967295 десятичний були додані разом. Як це можливо? Відповідь дуже проста, ми переповнили 32-бітний регістр r0 від цієї операції додавання.

Якщо ми розглянемо CPSR ми тепер бачимо 20000010 шістнадцятковий або 0010 0000 0000 0000 0000 0000 0001 0000 бінарний. Ми повинні тільки звернути увагу на найбільш значущі біти, які є 0010:

Значення в бінарному вигляді 0010 біта 31, 30, 29 і 28 (NZCV) означало б:

Позитивний Флаг НЕ встановлений

Нульовий Флаг НЕ встановлений

Флаг переносу встановлений

Флаг переповнення НЕ встановлений

Ми бачимо, що Флаг переносу був встановлений, а Флаг переповнення не був встановлений. Чому це?

Флаг переносу встановлюється тоді, коли дві непризнані числа були додані, і результат більший за регістр, де він зберігається. Ми працюємо з 32-бітним регістром. Також ми працюємо з непризнаними числами, тому CF встановлений, а OF не був встановлений, оскільки OF флаг стосується знакових чисел.

Наступного тижня ми вийдемо на тему Хакування ADDS.

results matching ""

    No results matching ""