Использование функций Windows API




В программах на ассемблере.

Windows предоставляет программисту возможность использовать огромное количество возможностей и ресурсов операционной системы. Для этого предназначен Windows API (Application Programming Interface). Windows API - это большая коллекция функций, располагающихся непосредственно в операционной системе и готовых для использования в пользовательских пpогpаммах. Эти функции находятся в нескольких динамически подгpужаемых библиотеках. Мы будем использовать при написании программ следующие:

Kernel32.dll - содеpжит API функции, взаимодействующие с памятью и упpавляющие пpоцессами.

User32.dll - содеpжит API функции, контpолиpующие пользовательский интеpфейс (то есть позволяющие, например, работать с элементами управления, выводимыми в создаваемых окнах).

Gdi32.dll - содеpжит API функции, ответственные за гpафические опеpации (определение цветовой палитры создаваемых окон, элементов управления и т.д.).

Кpоме этих тpех "основных", существуют также дpугие dll, котоpые можно использовать.

Пpогpаммы по мере необходимости связываются с этими библиотеками, то есть код API функций не включается в исполняемый файл. Связь осуществляется путем использования в тексте программы ссылки на одноименные файлы с расширением *.LIB, называемые библиотеками импоpта, они входят в состав паккета MASM32. Подключение библиотек импоpта осуществляется директивой

includelib. Описание передаваемых в API функции параметров содержится в одноименых файлах с расширением *.inc и называется файлами для включения.

Создание пробной программы

 

.386

 

 

.MODEL flat, stdcall

 

 

include KERNEL32.inc

 

includelib KERNEL32.LIB

 

 

.DATA

summand_1 db 12h

summand_2 db 2fh

 

.CODE

start:

 

mov al, summand_2

add al, summand_1

 

invoke ExitProcess,0

 

end start

 

А теперь садимся за компьютеры и пишем эту программу, проверим ее пошагово (отладка позволит проконтролировать содержимое регистров процессора).

Для компиляции (ассемблирования, то есть получения объектного модуля) – используется кнопка или меню:

Для компоновки – тоже кнопка или меню.

 

В результате получим EXE-файл (исполняемый модуль) – PROBA.EXE.

 

Для отладки программы вызываем пункт меню:

 

Затем выполняем программу по шагам, нажимая на кнопку “Step”:

 

 

После каждого шага контролируем содержимое регистров.

 

Мы рассмотрели основные принципы разработки программ на языке ассемблера в среде WinAsm, изучили общую структуру построения программы на языке ассемблера и попробовали создать действующую программу и выполнить ее отладку средствами WinAsm.

 

Теперь перейдем к детальному рассмотрению синтаксиса языка ассемблера.


Синтаксис Ассемблера

 

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

1) Команды (инструкции) – представляют собой символические аналоги машинных команд. Например, mov, add

2) Макрокоманды – это оформляемые определенным образом предложения текста программы, замещаемые во время компиляции другими предложениями. Это аналог подпрограммы или процедуры с тем отличием, что при вызове подпрограммы или процедуры надо указывать значения параметров, а здесь – это просто набор команд, которые выполняются при вызове.

3) Директивы - указания компилятору на выполнение некоторых действий или служат для задания режима его работы. У директив нет аналогов среди машинных команд.

4) Комментарии – содержат любые символы. Позволяют хранить примечания программиста к тексту исходной программы. Комментарии начинаются с символа точка с запятой “;”.

 

Формат команд и макрокоманд может быть описан следующим образом:

[имя метки]: [операция] [операнд(ы)]; [комментарий]

Имя метки – символьный идентификатор строки программы (адрес первого байта предложения программы, которому поставлена в соответствие метка)

Операция – символическое обозначение машинной команды или макрокоманды.

Операнд(ы) – части команды, макрокоманды или директивы, обозначающие объекты, над которыми производятся действия (к этим объектам относятся константы, переменные, регистры ЦП).

 

например:

metka_1: adc al, var2; складываем с учетом флага CF

содержимое регистра и переменную

 

Формат директивы, которая указывает компилятору на выполнение некоторых действий имеет следующий вид:

[имя] [директива] [операнд(ы)]; [комментарий]

 

Имя – идентификатор, отличающий данную директиву от других директив. (в зависимости от типа конкретной директивы этому имени могут быть присвоены определенные характеристики.

Например:

summand_1 db 12h - имя summand_1 отличает директиву db от других директив, этому имени присваиваются такие характеристики, как адрес конкретной ячейки в памяти и длина размещенных данных. Эти характеристики присваивает имени программа-компилятор во время анализа исходной программы. Когда в исходной программе происходит обращение к переменной с этим именем, то компилятор проверяет, соответствуют ли ее характеристики правилам использования определенной команды, например, mov ax, summand_1. Например, нельзя поместить переменную с длиной 1 байт в регистр AX (он равен 2 байта), т.к. их длины не соответствуют.

 

Директива db относится к директивам размещения данных, которые служат для заполнения памяти информацией, подлежащей обработке в ходе выполнения программы. При этом используется несколько предопределенных типов данных. Для определения места в памяти, где размещены данные, используются переменные. Имена переменных связываются с определенным участком памяти, в котором расположены данные.

Запишем основные директивы размещения данных.

Директива Описание Количество байт
DB (BYTE) Объявить байт  
DW (WORD) Объявить слово  
DD (DWORD) Объявить двойное слово  
DF (FWORD) Объявить тройное слово  
DQ (QWORD) Объявить учетверенное слово  
DT (TBYTE) Объявить десять байтов (упятеренное слово)  

Директивы размещения данных могут выделять память для одного или нескольких байтов, слов, двойных слов и т.д. Например

summa db 10h (выделяется байт, в него записывается число 10h)

char1 DB ‘A’ (выделяется байт, в него записывается 8-разрядный код символа А (ASCII-код символа A))

list db 10h, 20h, 30h,40h ОТЛИЧИЕ list dd 10203040h

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

List DB 20 DUP(0); выделяет 20 байтов, заполненных нулями



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: