Win32 в машинных кодах


Главная функция окна - часть 6


Сначала - на входе функции - сохраняем в стеке значение регистра EBP. Вспоминаем инструкцию копирования в стек значений регистров:

; создание фрейма стека db 55

Затем копируем ESP в EBP: инструкция с использованием байта ModR/M, причем Mod = 11 (оба операнда - регистры). В зависимости от состояния бита d, команду можно закодировать двумя способами; выберем этот:

db 89 e5

Теперь сравниваем параметр кода сообщения с числом 81h - эту инструкцию уже разбирали:

; сравнить значение в [EBP+0Ch] c 81h db 81 7d c 81 0 0 0

И сразу за ней должен следовать условный переход: если флаг нуля не установлен (операнды не равны, т.е. получено сообщение с кодом, отличным от 81h) - переход к завершению функции. А если это "наше" сообщение - выведем MessageBox; код нам уже знаком, причем используем в качестве заголовка название класса окна, а в качестве сообщения - заголовок самого окна (чтобы не возиться с лишними строками). Инструкция условного перехода (75h + смещение) должна "перепрыгнуть" именно этот участок кода.

; если не равно - перескочить 14h байтов db 75 14 ; параметры MessageBoxA db 6a 0 db 68 0 30 40 0 db 68 10 30 40 0 db 6a 0 ; вызов MessageBoxA db ff 15 1c 20 40 0

Перед выходом из функции следует восстановить значение регистра ESP, если он был изменен внутри функции (например, из-за создания в стеке пространства для локальных переменных) - для этого обычно просто копируют сохраненное в EBP значение обратно в ESP, а затем извлекают из стека старое значение EBP. Существует одна короткая инструкция для всех этих действий - C9, ее мы и используем.

; удаление фрейма стека db c9

Осталось вернуться из функции обратно по сохраненному в стеке адресу. При этом надо еще удалить из стека помещенные в него ранее параметры (в нашем случае - 4 параметра общим размером в 10h байт). Для этого просто увеличивают значение ESP на соответствующую величину. Здесь также существует специальная инструкция возврата, которая автоматически выравнивает стек:

11000010 &lt2 байта&gt




Начало  Назад  Вперед



Книжный магазин