Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Asm_lab-Rus.docx
Скачиваний:
6
Добавлен:
27.08.2019
Размер:
238.79 Кб
Скачать
    1. Задания на лабораторную работу.

Оформить код из лабораторной работы №2 в виде подпрограммы и отладить её. Подпрограмма должна получать необходимые параметры согласно конвенции STDCALL и возвращать результат либо по значению в регистре EAX, либо по ссылке. Создать DLL, которая будет содержать данную подпрограмму. Написать программу, которая осуществляет загрузку созданной библиотеки с использованием явного связывания и вызов подпрограммы из библиотеки, после чего выводит полученные данные на экран.

    1. Содержание отчета.

Отчет должен содержать:

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

    1. Контрольные вопросы.

  1. Что такое точка входа?

  2. Какие события должна обрабатывать процедура входа?

  3. Какие директивы предписывают компоновщику создать подпрограмму доступную из внешних программ?

  4. Каким образом можно разделить данные библиотеки между различными процессами, загрузившими библиотеку?

  5. Какие виды связывания существуют? Поясните их.

  6. Чем отличается статическая библиотека от динамической?

  7. Возможно ли исполнение кода динамической библиотеки без вызова её из программы?

  8. Какие параметры командной строки предписывают компоновщику создать библиотеку?

  9. Какие параметры командной строки предписывают компоновщику создать разделяемый раздел данных в библиотеке?

  10. Каким образом можно определить адрес подпрограммы в динамической библиотеке?

  11. Что случится если, вызывающая программа не выгрузит библиотеку из памяти и завершит работу?

  1. Лабораторная работа №4 Управление памятью.

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

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

    1. Указания по подготовке к выполнению лабораторной работы

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

При подготовке к работе изучите архитектуру памяти в WIN32. Виртуальное адресное пространство составляет 4 ГБ (232). Отдельный процесс имеет свое адресное пространство, недоступное другим процессам. В Windows NT память ОС закрыта от всех других процессов, поэтому более застрахована от сбоев.

Разбиение адресного пространства для Windows 95

Диапазон адресов

Размер (байт)

Назначение

00000000-00000FFF

4096

Для MSDOS

00001000-003FFFFF

1Гб – 4096 байт

Для r/w, лучше не использовать

00400000-7FFFFFFF

1 Гб

Для процессов пользователя

80000000-BFFFFFFF

1 Гб

DLL Win32 (Kernel32.dll, user32.dll, gdi32.dll), file mapping, доступны всем выполняемым программам (r/w)

C0000000-FFFFFFFF

1 Гб

Ядро ОС, VXD драйверы (r/w)

Особенности разбиения адресного пространства для Windows NT

Диапазон адресов

Размер (байт)

Назначение

00000000-0000FFFF

65536

Не используется. Для задания недействительных адресов

00Error: Reference source not found010000-7FFEFFFF

2Гб – 2*64 Кбайт

Для процессов пользователя

7FFF0000-7FFFFFFF

64 Кбайт

Не используется. Для задания недействительных указателей

80000000-FFFFFFFF

2 Гб

Для ОС. Недоступны пользователю.

Регионы в адресном пространстве

Резервирование памяти начинается с выделения региона памяти – определения требуемого виртуального адресного пространства.

Для этого используется функция VirtualAlloc:

Эта функция может выделить виртуальную и физическую память. Физическая память, выделенная этой функцией, обнуляется.

LPVOID VirtualAlloc(

LPVOID lpAddress,

DWORD dwSize,

DWORD flAllocationType,

DWORD flProtect

);

lpAddress – определяет начальный адрес выделенной области. Адрес виртуальной памяти выравнивается на границу 64-kilobyte. Если память уже связывается (выделяется физическая память), адрес выравнивается на границе страницы. Для определения размера страницы можно использовать функцию GetSystemInfo. Если это параметр = NULL, система определяет возможность выделения региона.

DwSize – Размер региона в байтах. Если lpAddress= NULL, это значение округляется до границы страницы в сторону увеличения.

FlAllocationType тип операции выделения. Можно задать флаги или их комбинации:

Флаг

Назначение

MEM_COMMIT

Выделяет физическую память или страничный файл на диске. Попытка повторного выделения той же области не приводит к ошибке

MEM_RESERVE

Резервирует виртуальное адресное пространство заданного размера. Зарезервированный диапазон не может использоваться другими функциями, например LocalAlloc. Выделенный регион может быть связан в дальнейшем с физической памятью

MEM_TOP_DOWN

Выделяется память в верхней области адресного пространства. В Windows 95 не поддерживаются

FlProtect

Тип защиты. Для физической памяти могут быть заданы флаги PAGE_GUARD и PAGE_NOCACHE совместно с флагами, определенными ниже

PAGE_READONLY

Страница только для чтения. Используется для физической памяти. Если ОС различает вариант для исполнения, исключение для исполнимых файлов

PAGE_READWRITE

r/w

PAGE_EXECUTE

Выполнимый

PAGE_EXECUTE_READ

r/e

PAGE_EXECUTE_READWRITE

r/w/e

PAGE_GUARD

Охраняемая (защищенная) страница. Любой доступ к странице – ошибка (см. Гл.7)

PAGE_NOACCESS

Выключен доступ к странице, отраженной в физической памяти

PAGE_NOCACHE

Не кешируется содержимое страницы. Используется в драйверах

PAGE_WRITECOPY

Запись в страницу приводит к тому, что процессу предоставляется личная копия этой страницы физической памяти (см. Гл. 8)

PAGE_EXECUTE_WRITECOPY

Любые действия, в т.ч. и исполнение приводит к формированию новой копии (см. Гл. 8)

Возвращаемое значение: Успех – адрес памяти. Ошибка – NULL. (GetLastError). Т.о. VirtualAlloc может выполнить функции:

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

Зарезервировать регион из свободных страниц.

Зарезервировать и связать.

Можно выделить большой регион, а затем связать с физической памятью только небольшой блок региона. Связь с физической памятью делается только для того участка, для которого необходимо.

Страницы могут быть в одном из 3-х состояний:

Свободная – страница не зарезервирована и не связана. Такие страницы функция VirtualAlloc может зарезервировать или зарезервировать и связать.

Зарезервированная – не может использоваться другими функциями выделения памяти, но не имеет соответствующего физического адреса. Функция VirtualAlloc может ее связать с физической памятью, но не может повторно зарезервировать. Можно освободить зарезервированные страницы функцией VirtualFree.

Связанные – физическая память выделена и установлены атрибуты доступа. Система фактически инициализирует и загружает выделенные страницы при первой попытке доступа к заданной памяти. Когда завершается процесс, ОС освобождает все закрепленные страницы. Функция VirtualAlloc может повторно связать уже связанные страницы. Функция VirtualFree может освободить физическую память, связанную со страницами.

Если lpAddress!=NULL, функция использует параметры lpAddress и dwSize для вычисления количества требуемых страниц. Если заданное число страниц не может быть выделено, функция завершается ошибочно.

Модификатор защиты PAGE_GUARD устанавливает защиту для страниц.

Очень часто программа точно не знает, сколько памяти ей понадобится для дальнейшей работы. Например, в программу постоянно поступают данные, которые ей необходимо хранить некоторое время, а затем по желанию пользователя они должны быть использованы. Каждый раз в программу может поступать различное количество данных. Таким образом, выделение большого участка памяти может оказаться не эффективным (либо будет выделен слишком большой участок, либо его может не хватить). Для решения этой задачи используется подход, при котором при каждом поступлении данных для них выделяется ровно столько памяти, сколько необходимо для их размещения плюс небольшой объём для хранения дополнительной информации. Однако также необходимо хранить информации и о месте расположения этих блоков. Для этого может быть использован массив, содержащий указатели на них, при этом размер массив в общем случае также не определен. Таким образом, целесообразнее использовать подход, при котором информация о расположении вновь поступающего блока будет храниться в последнем выделенном блоке. Т.е. будет построен связный список, в котором каждый предыдущий блок будет указывать на последующий (см. рис.).

Рис. Общая структура связного списка

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

struct tlist

{handle next;

handle data;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]