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