Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Тема 3.9 Объектные модули и библиотеки




 

Объе́ ктный мо́ дуль (также — объектный файл, англ. object file) — файл с промежуточным представлением отдельного модуля программы, полученный в результате обработки исходного кода компилятором. Объектный файл содержит в себе особым образом подготовленный код (часто называемый двоичным или бинарным), который может быть объединён с другими объектными файлами при помощи редактора связей (компоновщика) для получения готового исполнимого модуля либо библиотеки.

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

Программист генерирует объектный код с помощью компилятора или ассемблера. Например, в Linux компилятор GNU Compiler Collection будет генерировать файлы с расширением. o, которые используют формат ELF. При компиляции в Windows создаются файлы с расширением. obj, использующие формат COFF. Затем компоновщик используется для объединения объектного кода в одну исполняемую программу или библиотеку, при необходимости извлекая предварительно скомпилированные системные библиотеки.

Существует множество различных форматов объектных файлов; изначально у каждого типа компьютеров был свой уникальный формат, но с появлением Unix и других портативных операционных систем некоторые форматы, такие как ELF и COFF, были определены и использовались в разных типах систем. Один и тот же формат может использоваться как для ввода, так и для вывода компоновщика и, таким образом, в качестве формата библиотеки и исполняемого файла. Некоторые форматы могут содержать машинный код для разных процессоров, при этом правильный вариант выбирается операционной системой при загрузке программы[1].

 

30.               Совместное использование языка ассемблера и Си, Ассемблер +Паскаль

 


. MODEL FLAT, C
. CODE
MAS_FUNC PROC C mas: dword, n: dword
mov esi, mas
mov eax, [esi+4]
shl eax, 1
ret
MAS_FUNC ENDP
END

Чтобы построить проект в Microsoft Visual Studio Express 2010, совместив в нем файлы, написанные на разных языках программирования, выполняем следующие действия.

Создание проекта начинается с выбора меню Файл -> Создать -> Проект.

Аналогично проекту, содержащему 1 язык программирования, создаем пустой проект консольного приложения и задаем имя проекта.




Добавляем в дерево проекта два файла исходного кода:

вызывающая процедура на языке C++;

вызываемая процедура на языке ассемблера.

Для этого выбираем по правой кнопке мыши Файлы исходного кода -> Добавить -> Создать элемент и задаем имя файла программы на языке С++.

Второй добавляемый файл исходного кода будет иметь расширение. asm, которое необходимо указать явно.

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

Набираем код программы для файлов вызывающей и вызываемой процедур соответственно на C++ и ассемблере.


Подключаем инструмент Microsoft Macro Assembler. По правой кнопке мыши для проекта выбираем Настройки построения.

В появившемся окне ставим галочку в строке masm.


Выбираем меню Свойства для файла на языке ассемблера по правой кнопке мыши и выбираем для этого файла инструмент Microsoft Macro Assembler.


Выполняем построение проекта, выбрав меню Отладка -> Построить решение.


Результат построения отображается в нижней части окна проекта.


Запуск проекта на выполнение осуществляется через меню Отладка -> Начать отладку.

Результат выполнения программы

Перед вызовом процедуры всегда нужно сохранять содержимое регистров ebp, esp, а перед выходом из процедуры – восстанавливать содержимое этих регистров. Это делается компилятором языка Си. Остальные регистры нужно сохранять при необходимости (если содержимое регистра подвергается изменению в вызванной процедуре, а далее может использоваться в вызывающей программе) Это может быть сделано с помощью команды pusha.
Передача аргументов в процедуру на ассемблере из программы на Си осуществляется через стек. При этом вызывающая программа записывает передаваемые параметры в стек, а вызываемая программа извлекает их из стека.

Работа с аргументами вещественного типа

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

тип Си Количество байт Тип аргумента ассемблера
float dword
double qword

Возвращаемое вещественное значение по умолчанию располагается в вершине стека сопроцессора st(0).

Пример. Найти разность двух чисел

#include < iostream>
using namespace std;
extern «C» double func(double, double);
int main() {
double x, y, r;
cout < < «x= «;
cin > > x;
cout < < «y= «;
cin > > y;
r = func(x, y);
cout < < r;
cin. get(); cin. get();
return 0;
}

; Функция на ассемблере

. 586
. MODEL FLAT, C
. CODE
func PROC C x: qword, y: qword
fld x
fsub y
ret
func ENDP
END

Назад

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...