- •8.091402 “Системы управления и автоматики”
- •Введение
- •Порядок выполнения работы.
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Лабораторная работа №2 Изучение способов организации ветвлений и циклов на языке ассемблер
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Строковые операции
- •Копирование строки
- •Сравнение строк
- •Сканирование строки.
- •Чтение из строки
- •Запись в строку
- •Чтение строки из порта
- •Запись строки в порт
- •Рекомендации по выполнению лабораторной работы
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Искажение имен
- •Подключение библиотек
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Лабораторная работа №4 Управление памятью.
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Содержание отчета
- •В данной лабораторной работе необходимо выполнить следующее:
- •Задания на лабораторную работу.
- •Контрольные вопросы и задания
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Задания на лабораторную работу.
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Надруковано в учбово-виробничому
- •61166, Харкiв, просп. Ленiна, 14.
Задания на лабораторную работу.
Оформить код из лабораторной работы №2 в виде подпрограммы и отладить её. Подпрограмма должна получать необходимые параметры согласно конвенции STDCALL и возвращать результат либо по значению в регистре EAX, либо по ссылке. Создать DLL, которая будет содержать данную подпрограмму. Написать программу, которая осуществляет загрузку созданной библиотеки с использованием явного связывания и вызов подпрограммы из библиотеки, после чего выводит полученные данные на экран.
Содержание отчета.
Отчет должен содержать:
Цель работы, задание, описание алгоритма работы программы, распечатку исходных текстов программы с пояснениями, результаты, выводы.
Контрольные вопросы.
Что такое точка входа?
Какие события должна обрабатывать процедура входа?
Какие директивы предписывают компоновщику создать подпрограмму доступную из внешних программ?
Каким образом можно разделить данные библиотеки между различными процессами, загрузившими библиотеку?
Какие виды связывания существуют? Поясните их.
Чем отличается статическая библиотека от динамической?
Возможно ли исполнение кода динамической библиотеки без вызова её из программы?
Какие параметры командной строки предписывают компоновщику создать библиотеку?
Какие параметры командной строки предписывают компоновщику создать разделяемый раздел данных в библиотеке?
Каким образом можно определить адрес подпрограммы в динамической библиотеке?
Что случится если, вызывающая программа не выгрузит библиотеку из памяти и завершит работу?
Лабораторная работа №4 Управление памятью.
Цель работы
Ознакомление с функциональными возможностями систем программирования на языке ассемблер, способами управления памятью, особенностями построения программ динамически распределяющими память.
Указания по подготовке к выполнению лабораторной работы
При подготовке к выполнению лабораторной работы необходимо ознакомится с материалом лекций, который посвящен способам адресации, методам распределения памяти в вычислительных системах.
При подготовке к работе изучите архитектуру памяти в 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;
}