- •8.091402 “Системы управления и автоматики”
- •Введение
- •Порядок выполнения работы.
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Строковые операции
- •Лабораторная работа №2 Изучение способов организации ветвлений и циклов на языке ассемблер
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Копирование строки
- •Сравнение строк
- •Сканирование строки.
- •Чтение из строки
- •Запись в строку
- •Чтение строки из порта
- •Запись строки в порт
- •Рекомендации по выполнению лабораторной работы
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Искажение имен
- •Подключение библиотек
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Лабораторная работа №4 Управление памятью.
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Содержание отчета
- •В данной лабораторной работе необходимо выполнить следующее:
- •Задания на лабораторную работу.
- •Контрольные вопросы и задания
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Задания на лабораторную работу.
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Надруковано в учбово-виробничому
- •61166, Харкiв, просп. Ленiна, 14.
Искажение имен
При компоновке библиотеки на различных языках высокого уровня возникает искажение имен.
Компиляторы Microsoft С (а также многие компиляторы в UNIX) изменяют названия процедур, чтобы отразить используемый способ передачи параметров. Так, к названиям всех процедур, использующих С-конвенцию, приписывается символ подчеркивания. То есть, если в С-программе записано
some_proc();
то реально компилятор пишет
call _some_proc
и это означает, что, если эта процедура написана на ассемблере, она должна называться именно _some_proc (или использовать сложную форму записи директивы proc).
Названия процедур, использующих конвенцию STDCALL, искажаются компилятором еще более сложным образом: спереди к называнию процедуры добавляется символ подчеркивания, а сзади – символ @ и размер занимаемой параметрами области стека в байтах, (то есть в точности число, стоящее после команды ret в конце процедуры).
some_proc(a:word);
превращается в
push a
call _some_proc@4
При написании библиотек на языке ассемблер необходимо учитывать эти особенности. Для того чтобы ассемблер корректно определил количество байт передаваемых в подпрограмму параметров, необходимо их описать при объявлении подпрограммы, аналогично тому, как это осуществляется на языках высокого уровня. Например:
some_proc PROC EXPORT a:DWORD, b:DWORD
В основной программе, вызывающей эту подпрограмму из библиотеки, её необходимо описать с использованием ключевого слова EXTERN (если будет использовано неявное связывание).
EXTERN _some_proc@8:NEAR
Вызов подпрограммы должен быть осуществлен с использованием конвенции STDCALL.
push b
push a
call _some_proc@8
Библиотеки могут содержать не только подпрограммы, но и данные. Для того чтобы данные объявленные в библиотеке стали доступны всем процессам, использующим эту библиотеку необходимо скомпоновать её с указанием атрибутов Shared, Read, Write для сегмента данных. В компоновщике Link для этого предусмотрен параметр /section. В общем случае строка для компоновки выглядит следующим образом:
Link /SUBSYSTEM:WINDOWS /DLL /section.data,SRW dllname.obj
Подключение библиотек
Обобщенный алгоритм загрузки DLL при явном связывании выглядит следующим образом:
Загрузить DLL с помощью функции LoadLibrary. Данная функция принимает 1 параметр – имя динамической библиотеки и возвращает 0, если невозможно загрузить библиотеку, либо идентификатор библиотеки. Данный параметр должен быть сохранен в переменной для дальнейшего использования.
Определить адрес функции, которую необходимо вызвать. Для этого служит функция GetProcAddress, принимающая 2 параметра. 1-й – идентификатор библиотеки, 2-й – имя подпрограммы. Возвращает 0 – в случае невозможности определить адрес подпрограммы, либо её адрес.
Вызвать подпрограмму и получить результат.
Выгрузить библиотеку из памяти с помощью функции FreeLibrary. Данная функция принимает 1 параметр – идентификатор библиотеки.
Если нет необходимости в явном связывании, то можно использовать неявное связывание. Для этого достаточно указать путь к библиотеке, точнее путь к её заголовочному файлу. Данный файл имеет тоже имя, что библиотека и расширение .lib. Данный файл формируется автоматически всеми компиляторами Microsoft C и MASM32.
