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


Простейшее приложение - часть 3


Наконец, еще одна инструкция, использующая уже знакомый нам по первой статье байт ModR/M. Этот байт позволяет записывать в стек значения, хранящиеся в памяти. Но в данном случае есть одна особенность использования этого байта. Вспомните, что байт ModR/M предполагает наличие двух операндов (один из которых всегда находится в регистре). Здесь же необходимо указывать лишь один операнд - другой все время один и тот же и задается неявно (адрес в ESP). Поэтому поле REG байта ModR/M, служившее для обозначения регистра, теперь используется в качестве расширения опкода и для данной конкретной инструкции всегда одно и то же (постоянно). А сама инструкция вместе с байтом ModR/M выглядит так:

11111111 Mod 110 R/M

Обратите внимание, что у нас снова появляется альтернативное кодирование - теперь для команды помещения в стек значений регистров (при Mod=11). Например, указанная выше инструкция PUSH EAX может быть закодирована и таким образом:

11111111 11110000 (FFh F0h)

Данные в виде параметров передаются функциям Windows именно через стек. Рассмотрим функцию MessageBoxA, которая принимает 4 параметра. Первым в стек помещается число, указывающее на стиль создаваемого окна сообщения. Это число представляет собой битовую структуру (см. рис.)

Флаги стиля MessageBoxA

Поля структуры могут содержать следующие значения, определяющие внешний вид и поведение окна сообщения. Тип окна:

0 - содержит одну кнопку OK;

1 - содержит две кнопки: OK и Cancel;

2 - содержит три кнопки: Abort, Retry, Ignore;

3 - содержит три кнопки: Yes, No, Cancel;

4 - содержит две кнопки: Yes и No;

5 - содержит две кнопки: Retry и Cancel.

Поле значок содержит значение, определяющее вид отображаемой пиктограммы в окне:

0 - нет значка;

1 - красный кружок с крестиком (значок стоп);

2 - вопросительный знак;

3 - восклицательный знак;

4 - кружочек с буквой i.

Поле кнопка определяет кнопку по умолчанию, т.е. ту, которая ассоциируется с нажатием на клавишу 'Enter' при появлении окна сообщения на экране:

0 - 1-я кнопка;



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



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