Частина 37 - Програма ASM 6 [CMOV Інструкції]

Для повного змісту змісту всіх уроків натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть обговорені. https://github.com/mytechnotalent/Reverse-Engineering-Tutorial

У нашій шостій програмі ми продемонструємо, як працювати з інструкціями CMOV. До того, як ми приступимо до деякого коду, давайте розповімо про CMOV. CMOV може запобігти використанню процесором інструкцій JMP і прискорити відповідний бінарник. Є нерозмірковувані інструкції CMOV такі:

CMOVA або CMOVNBE = Вище [Carry Флаг або Нульовий Флаг = 0]

CMOVAE або CMOVNB = Вище або Рівно [Carry Флаг = 0]

CMOVNC = Не Керування [Carry Флаг = 0]

CMOVB або CMOVNAE = Нижче [Carry Флаг = 1]

CMOVC = Керування [Carry Флаг = 1]

CMOVBE або CMOVNA = Нижче або Рівно [Carry Флаг або Нульовий Флаг = 1]

CMOVE або CMOVZ = Рівно [Zero Флаг = 1]

CMOVNE або CMOVNZ = Не Рівно [Zero Флаг = 0]

CMOVP або CMOVPE = Парність [Parity Флаг = 1]

CMOVNP або CMOVPO = Не Парність [Parity Флаг = 0]

Також є підписані інструкції CMOV такі:

CMOVGE або CMOVNL = Більше або Рівно [Sign Флаг xor Перезапис Флаг = 0]

CMOVL або CMOVNGE = Менше [Sign Флаг xor Перезапис Флаг = 1]

CMOVLE або CMOVNG = Менше або Рівно [Sign Флаг xor Перезапис Флаг або ЗФ = 1]

CMOVO = Перезапис [Overflow Флаг = 1]

CMOVNO = Не Перезапис [Overflow Флаг = 0]

CMOVS = Знак Негативний [Sign Флаг = 1]

CMOVNS = Не Знак Позитивний [Sign Флаг = 0]

Увага: перегляньте взаємозв’язки між нерозмірковуваними та підписаними операціями. Нерозмірковувані інструкції використовують CF, ZF і PF для визначення різниці між двома операндами, тоді як підписані інструкції використовують SF і OF для вказівки стану порівняння між операндами. Якщо вам потрібен огляд флагів, перегляньте Частина 14 щодо Флагів у цій серії. Інструкції CMOV залежать від математичної інструкції, яка встановлює регістр EFLAGS для роботи і тому рятує програмісту використовувати JMP заяви після порівняльної заяви. Давайте розглянемо деякий джерельний код.

Хорошо, давайте почнемо з рядків 21 і 22. Це нічого нового, чого ми ще не бачили, оскільки ми просто переміщаємо масив у ebx. На рядку 24 ми бачимо функцію find_smallest_value, де ми циклічно проходимо по масиву і використовуємо CMOVB для знаходження найнижчої вартості в кінцевому підсумку. Ми бачимо cmp %ebx, %eax, при якому cmp віднімає перший операнд від другого і встановлює регістр EFLAGS відповідно. На цьому етапі використовується cmovb для заміни значення в ebx на значення в eax, якщо значення менше, ніж було раніше в реєстрі ebx. Після виходу з циклу бачимо три групи інструкцій sys_writes: перша для виведення нашого повідомлення, друга для виведення нашого перетвореного цілого числа у вигляді ASCII-значення, а потім, нарешті, крапка і перенос рядка. Пам'ятайте, щоб скомпільовувати, потрібно написати:

as –32 -o cmov_instructions.o cmov_instructions.s

Для зв'язування об'єкта file потрібно написати:

ld -m elfMDXX_i386XMDX -o cmov_instructions cmov_instructions.o

З великою радістю чекаю на всіх наступної тижня, коли ми розпочнемо відлагоджувати наш шостий програму на мові ассемблера!

results matching ""

    No results matching ""