Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практика 01 - Структ прогр, WinAsm Studio - для студ .doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.18 Mб
Скачать

Использование функций 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)

Объявить байт

1

DW (WORD)

Объявить слово

2

DD (DWORD)

Объявить двойное слово

4

DF (FWORD)

Объявить тройное слово

6

DQ (QWORD)

Объявить учетверенное слово

8

DT (TBYTE)

Объявить десять байтов (упятеренное слово)

10

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

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 байтов, заполненных нулями