Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Простейшая программа в ОС 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.
Директива 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; просмотров: 135; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.97.219 (0.009 с.) |