Лабораторная работа № 4
Работа с 32-х разрядной архитектурой x86.
Использование библиотек DLL. Интерфейс с ОС Windows
4.1. Цель работы
Освоить технологию написания и отладки программ на Ассемблере под ОС Windows. Получить навыки программирования и использования библиотекDLL. Понять особенности 32-х разрядной архитектуры процессораIntel.
4.2. Краткие теоретические сведения
Модели памяти в процессорной архитектуреx86 определяютспособ размещения программного кода, данных и стека в оперативной памяти при ассемблировании. Изначально, в процессоре Intel 8086 был реализован сегментный способ организации кода, данных и стека. Модель памяти в этом способе должна была однозначно определить количество используемых сегментов, их расположение, перекрытие и т. п. Помимо этого модель памяти определяла размерности и свойства переменных и предопределенных значений в программе (например, тип процедур NEAR или FAR).
В ассемблерных программах модель памяти может задаваться по умолчанию и определяться компилятором автоматически в зависимости от числа используемых сегментов. Тем не менее, программист может самостоятельно задавать модель памяти с помощью директивы .MODEL, располагаемой в начале файла с программой. Это позволяет использовать необходимые для выполнения программы формы описания сегментов.
Общий вид директивы: .MODEL {тип}, где {тип} для процессоров с сегментной организацией памяти может принимать одно из следующих значений:
TINY – данные и код занимают один сегмент, т.е. регистры CS, DS и SS имеют одно и то же значение. Это наиболее компактный вариант программы, занимающий 64КБ памяти, все переходы в программе типа NEAR;
SMALL – сегмент кода отделен от сегментов данных и стека, а последние объединены в одну группу, т. е. DS и SS имеют одно и то же значение; наиболее распространенная модель памяти, все переходы в такой программе типа NEAR;
COMPACT – используется один сегмент кода и несколько сегментов данных, все переходы типа NEAR, а обращение к данным происходит с указанием сегментного регистра. Сегменты данных и стека объединены в одну группу;
MEDIUM – несколько сегментов кодов и общий сегмент данных со стеком, доступ к процедурам типа FAR, а при обращении к данным указывается только смещение;
LARGE – несколько сегментов кодов и данных, вся адресация происходит с указанием сегментных регистров;
HUGE – аналогичен LARGE, но предназначен для совмещения с программами на языках высокого уровня. В этой модели разрешается работа с данными, занимающими >64КБ памяти.
FLAT – плоская модель памяти, где код, данные и стек используют одно и то же адресное пространство. Для 16-битных процессоров плоская модель памяти позволяет адресовать 64 кБ оперативной памяти; для 32-битных процессоров 4 ГБ, для 64-битных — гипотетически до 16 эксабайт, фактически до 256 ТБ.
Особенности 32-х разрядной процессорной архитектуры Intel.Начиная сIntel80386DX, процессорная архитектура x86 была расширена до 32 бит. Все регистры (за исключением сегментных) стали 32-битными, получив в названии дополнительный префикс «E» (от англ.Extended– расширенный): EAX, EBX,ECX,EDX, EIP,ESI,EDI, EFLAGS и др. Набор команд 16-ти разрядной архитектурыx86 для совместимости был полностью сохранен. При этом, в дополнение к ним было добавлено несколько команд с постфиксом «D» (от англ.Double– двойной), работающих с расширенным до 32 разрядов форматом данных:MOVSD,POPAD,SHRDи др.
В 32-х разрядной архитектуре стала возможной адресация большего объема памяти и многозадачность. Для сохранения совместимости с предшествующей 16-ти разрядной архитектурой в процессорах нового поколения был реализован защищенный режим, эмулирующий архитектуру процессора 8086 и позволяющий выполнять написанные под неё программы, в т. ч. с использованием прерываний BIOSиDOS.
Динамически подключаемые библиотеки (DLL).В операционных системах семействаWindowsподDLL(англ.Dynamic-LinkLibrary) понимается динамически загружаемая в память библиотека, позволяющая своё многократное использование различными программными приложениями. В форматеDLLреализуют, например, базовые функцииWindowsAPI, а также драйверы устройств. В операционных системахUNIXаналогичныеDLLфункции выполняют так называемые общие объекты (англ.SharedObjects).
Формат файлов DLLпридерживается тех же соглашений, что и формат исполняемых файлов (например, *.exe), сочетая код, таблицы и ресурсы, отличаясь лишь интерпретацией некоторых полей. ИспользованиеDLLв определенных случаях позволяет более эффективно организовать оперативную память и дисковое пространство компьютера, используя только один экземпляр библиотечного модуля для различных приложений. Помимо этого,DLLреализует в ОСWindowsпринцип программной модульности и возможность совместного использования программных библиотек приложениями независимо от языка их разработки.
Пример программы с DLL. Написать программу на языке Си, вычисляющую сумму двух целых чисел посредствомDLL-библиотеки, реализованной на Ассемблере. Ввод слагаемых осуществить через командную строку при запуске исполняемого файла программы.
Модуль на Си
#include <stdio.h>
#include <Windows.h>
#pragma hdrstop
#pragma argsused
HINSTANCE ProbaDLL;
DWORD (*dllfunc) (DWORD, DWORD);
int main(int argc, char* argv[])
{
int a, b, x;
//Настройка идентификатора на конкретную библиотеку
ProbaDLL=LoadLibrary("ProbaDLL.dll");
//Настройка указателя на конкретную функцию и связывание с адресом
dllfunc = (DWORD (*)(DWORD, DWORD))GetProcAddress(ProbaDLL, "FirstFunction");
if (ProbaDLL == NULL)
{
printf("Ne udalosy zagruzity DLL :(");
getch();
return 0;
}
a=atoi(argv[1]);
b=atoi(argv[2]);
x=dllfunc(a,b);
printf("\nSumma a+b=%d",x);
getch();
FreeLibrary("ProbaDLL.dll");
return 0;
}
Модуль на Ассемблере
.386
.model flat, stdcall
;Подключение необходимых библиотек
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
.code
DllEntry proc hInstSimpleDLL: HINSTANCE, reason:DWORD,
future: DWORD
mov eax, TRUE
ret
DllEntry endp
FirstFunction proc param1:DWORD, param2:DWORD
Mov ebx,param1
Mov eax,param2
Add eax,ebx
ret
FirstFunction endp
End DllEntry