Ассемблер для Windows X86 (MASM):
- b8 — mov приемник, источник — например:
mov edx, ecx
— копирует содержимое ecx в edx, иначе говоря — edx = ec - e8 — call <абсолютный адрес> — вызов функции по адресу и запись текущего адреса в стек
- e9 — jmp <относительный адрес> — прыжок на целевой адрес, который вычисляется adr = jmp_addr + sizeof(jmp) + sizeof(<относительный адрес>) = jmp_addr + 1 + 4 = jmp_addr + 5
- c3 — ret — извлекает адрес из вершины стека (сдвигает ESP) и осуществляет переход EIP (управления) на этот адрес
- c2 — retn <значение> — извлекает адрес из вершины стека (сдвигает ESP), осуществляет переход EIP (управления) на этот адрес (- то же, что и C3 )
+вычитает <значение> из ESP (вроде бы) - 74 — jz (je) <1-байтовый сдвиг> — условный переход/ Инструкция JE проверяет флаг ZF. Если этот флаг равен 1, то выполняется переход к МЕТКЕ.
- 0x0F84 —
- lea <регистр, значение> — помещает в регистр адрес через относительное смещение. Например, `lea eax, <значение>` аналогично команде `mov eax, offset <значение>`.
- sub <приемник,источник> — Вычитание двух целочисленных двоичных операндов.
приёмник = приёмник — источник. - 6A, 68 — push <arg> — где arg=1byte и 4byte соответственно. Добавляет 1 байт и 4 байта в стэк соответственно
- 90 — nop — пустая команда, просто пропускается
Назначение регистров в Си:
EAX — возвращает результат выполнения функции (значения либо указателя на объект), а так же может передавать первый параметр функции при fastcall-соглашении. В самой ф-ии может использоваться без ограничений
EBP — хранит начальное значение вершины стека (на момент старта ф-ии) на всем протяжении выполнения ф-ии. Служит базой для вычисления адресов локальных переменных (на стеке).
ESP — хранит текущее значение вершины стека
ECX, EDX — хранят значения переданных функции параметров при вызове fastcall (Microsoft)
EIP — выполняемая инструкция
Флаги:
P — Parity Flag — флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит чётное количество битов, равных 1
A — Auxiliary Carry Flag
Z — Флаг нуля. Устанавливается 1, если результат предыдущей команды равен 0
Полезные ссылки: