Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер. Лабораторная работа 4.doc
Скачиваний:
19
Добавлен:
27.03.2015
Размер:
95.74 Кб
Скачать

­Лабораторная работа № 4

Работа с 32-х разрядной архитектурой x86.

Использование библиотек DLL. Интерфейс с ОС Windows

4.1. Цель работы

Освоить технологию написания и отладки программ на Ассемблере под ОС Windows. Получить навыки программирования и использования библиотекDLL. Понять особенности 32-х разрядной архитектуры процессораIntel.

4.2. Краткие теоретические сведения

Модели памяти в процессорной архитектуреx86 определяютспособ размещения программного кода, данных и стека в оперативной памяти при ассемблировании. Изначально, в процессоре Intel 8086 был реализован сегментный способ организации кода, данных и стека. Модель памяти в этом способе должна была однозначно определить количество используемых сегментов, их расположение, перекрытие и т. п. Помимо этого модель памяти определяла размерности и свойства переменных и предопределенных значений в программе (например, тип процедур NEAR или FAR).

В ассемблерных программах модель памяти может задаваться по умолчанию и определяться компилятором автоматически в зависимости от числа используемых сегментов. Тем не менее, программист может самостоятельно задавать модель памяти с помощью директивы .MODEL, располагаемой в начале файла с программой. Это позволяет использовать необходимые для выполнения программы формы описания сегментов.

Общий вид директивы: .MODEL {тип}, где {тип} для процессоров с сегментной организацией памяти может принимать одно из следующих значений:

  1. TINY – данные и код занимают один сегмент, т.е. регистры CS, DS и SS имеют одно и то же значение. Это наиболее компактный вариант программы, занимающий 64КБ памяти, все переходы в программе типа NEAR;

  2. SMALL – сегмент кода отделен от сегментов данных и стека, а последние объединены в одну группу, т. е. DS и SS имеют одно и то же значение; наиболее распространенная модель памяти, все переходы в такой программе типа NEAR;

  3. COMPACT – используется один сегмент кода и несколько сегментов данных, все переходы типа NEAR, а обращение к данным происходит с указанием сегментного регистра. Сегменты данных и стека объединены в одну группу;

  4. MEDIUM – несколько сегментов кодов и общий сегмент данных со стеком, доступ к процедурам типа FAR, а при обращении к данным указывается только смещение;

  5. LARGE – несколько сегментов кодов и данных, вся адресация происходит с указанием сегментных регистров;

  6. HUGE – аналогичен LARGE, но предназначен для совмещения с программами на языках высокого уровня. В этой модели разрешается работа с данными, занимающими >64КБ памяти.

  7. 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