Простейшая программа в ОС Windows 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Простейшая программа в ОС Windows



 Операционная система Windows является многозадачной средой. Каждая задача имеет свое адресное пространство и свою очередь сообщений. Более того, даже в рамках одной программы может быть осуществлена многозадачность - любая процедура может быть запущена как самостоятельная задача.

Программирование в Windows основывается на использовании функций API (Application Program Interface, т.е. интерфейс программного приложения). Их количество достигает двух тысяч. Программа для Windows в значительной степени состоит из таких вызовов. Все взаимодействие с внешними устройствами и ресурсами операционной системы будет происходить посредством таких функций.

Операционная система Windows использует плоскую модель памяти. Другими словами, всю память можно рассматривать как один сегмент. Для программиста на языке ассемблера это означает, что адрес любой ячейки памяти будет определяться содержимым одного 32-битного регистра, например EBX. Следовательно, мы фактически не ограничены в объеме данных, кода или стека (объеме локальных переменных). Выделение в тексте программы сегмента кода и сегмента данных является теперь простой формальностью, улучшающей читаемость программы.

Вызов функций API. В файле помощи любая функция API представлена в виде (например):

int MessageBox (HWND hWnd, LPCTSTR lpText,

LPCTSTR lpCaption, UINT uType);

Данная функция выводит на экран окно с сообщением и кнопкой (или кнопками) выхода. Смысл параметров:

hWnd -дескриптор окна, в котором будет появляться окно-сообщение,

lpText - текст, который будет появляться в окне,

lpCaption - текст в заголовке окна,

uType - тип окна, в частности можно определить количество кнопок выхода.

Теперь о типах параметров. Практически все параметры API-функций в действительности 32-битные целые числа: HWND — 32-битное целое, LPCTSTR — 32-битный указатель на строку, UINT — 32-битное целое. К имени функций часто добавляется суффикс "А" для перехода к более новым версиям функций. Кроме того, при использовании MASM необходимо также в конце имени добавить @16 – количество байт, которое занимают в стеке переданные аргументы. Для функций Win32 API это число можно определить как количество аргументов n, умноженное на 4 (байта в каждом аргументе): 4*n. Для вызова функции используется команда CALL ассемблера. При этом все аргументы функции передаются в нее через стек (команда PUSH). Направление передачи аргументов: СЛЕВА НАПРАВО — СНИЗУ ВВЕРХ. В соответствии с этим, первым будет помещаться в стек аргумент uType. Таким образом, вызов указанной функции будет выглядеть так:

 CALL MessageBoxA@16.

Результат выполнения любой API функции — это, как правило, целое число, которое возвращается в регистре EAX.

.686P             .MODEL FLAT, STDCALL    .STACK 4096       .DATA MB_OK EQU 0 STR1 DB "Моя первая программа",0 STR2 DB "Привет всем!",0 HW  DD? EXTERN MessageBoxA@16:NEAR .CODE             START:      PUSH MB_OK PUSH OFFSET STR1 PUSH OFFSET STR2 PUSH HW CALL MessageBoxA@16      RET              END START .686P             .MODEL FLAT, STDCALL ;include C:\masm32\include\user32.inc    MessageBoxA PROTO:DWORD,:DWORD,:DWORD,:DWORD            .STACK 4096 .DATA MB_OK EQU 0 STR1 DB "Моя первая программа",0 STR2 DB "Привет всем!",0 HW  DD? .CODE             START:      INVOKE MessageBoxA, HW, OFFSET STR2, OFFSET STR1, MB_OK RET              END START

Директива OFFSET представляет собой «смещение в секции», или, переводя в понятия языков высокого уровня, «указатель» начала строки.

Директива EQU подобно #define в языке СИ определяет константу.

Транслятор языка MASM позволяет также упростить вызов функций с использованием макросредства – директивы INVOKE:

INVOKE функция, параметр1, параметр2,…

В этом случае нет необходимости добавлять @16 к вызову функции. Кроме того, параметры записываются точно в том порядке, в котором приведены в описании функции. Макросредствами транслятора параметры помещаются в стек. Для использования директивы INVOKE необходимо иметь описание прототипа функции с использованием директивы PROTO в виде:

MessageBoxA PROTO:DWORD,:DWORD,:DWORD,:DWORD

Если в программе используется множество функций Win32 API, целесообразно воспользоваться директивой

include C:\masm32\include\user32.inc   

Функция MessageBoxA вызывается из системной библиотеки Windows user32.dll. include-файлы MASM с соответствующими названиями библиотек сдержат описания прототипов всех функций данной библиотеки.

Для трансляции приведенного выше текста программы в исполнимый модуль можно воспользоваться компиляторов Microsoft Visual Studio. Для этого необходимо:

1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello.prj) и тип проекта: Win32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.

2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: SourceFiles->Add->NewItem

Вы

Выбрать тип файла Code C++, но указать имя с расширением.asm:

3) В появившемся окне набрать текст программы.

4) Установить параметры компилятора. Для этого

1 СПОСОБ: выбрать по правой кнопке в файле hello.asm дерева проекта меню Properties.

В появившемся диалоговом окне выбрать Custom Build Step и прописать в правой части окна Command Line в виде:

C:\путь\ml /c /coff /Zi $(InputName).asm

В указании пути все пробелы должны быть взяты в кавычки:

C:\Program" "Files\Microsoft" "Visual" "Studio" "8\VC\bin\ml /c /coff /Zi $(InputName).asm

В строке Outputs указать:

$(InputName).obj

2 СПОСОБ: выбрать по правой кнопке в файле проекта меню Custom Build Rules… и в появившемся окне выбрать Microsoft Macro Assembler.

 

выбрать по правой кнопке в файле hello.asm дерева проекта меню Properties и установить General->Tool: Microsoft Macro Assembler.

5) Откомпилировать файл, выбрав Build->Build hello.prj.

6) Запустить программу, нажав F5 или выбрав меню Debug->Start Debugging.

В результате появится окно сообщения:



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 134; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.22.248.208 (0.008 с.)