Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Флоренсов А.Н. УП Системное программное обеспечение.docx
Скачиваний:
46
Добавлен:
28.06.2021
Размер:
148.95 Кб
Скачать

2.3. Средства преобразования в исполняемый файл

Текст программы в листинге 2.2.1 и подобные ему сами по себе не способны управлять компьютером, для этого их необходимо преобразовать в исполняемый файл. Такое преобразование осуществляется транслятором с языка ассемблера. Этот транслятор является исполняемым файлом соответствующей операционной системы и имеет в Linux имя nasm. В ОС Windows именем транслятора ассемблера NASM является nasmw.exe. Эти трансляторы предназначены для использования в режиме командной строки (не интегрированной системы разработки) и управляются, в свою очередь, опциями командной строки.

Наиболее важной из этих опций является опция формата для файла результата. Задается эта опция в командной строке в виде

-f формат

где параметр формат может принимать ряд символических значений, из которых в данном курсе представляют интерес значения bin, obj, elf и win32. Формат bin указывает на порождение простейшего варианта двоичного кода машинных команд и данные без какой-либо служебной или настроечной информации. Этот вариант использовался для построения простейших программ для MS-DOS (так называемых com-файлов, представляющих собой исполняемые файлы односегментных программ).

Формат obj отвечает варианту построения объектных файлов, которые были приняты для старых систем фирмы Microsoft и совместимых с ними. Это объектные файлы, которые могут быть собраны в исполняемые файлы компоновщиками старых версий link.exe фирм Microsoft и Borland, а также ряд компоновщиков от других разработчиков (в частности, старым компоновщиком alink.exe, входившим в ранний комплект системы программирования NASM). Формат win32, называемый более точно OMF (Object Microsoft Format), генерируется современными компиляторами фирмы Microsoft (masm.exe, cl.exe средой MS Visual C++).

Наконец, формат elf – это стандартная форма объектных файлов, производимых компиляторами в Linux, именно он и потребуется нам в первую очередь. В настоящее время имеется два варианта использования этого формата, для 32-битной и для 64-битных вариантов архитектуры.

Вызов транслятора nasm для Linux в простейшем случае имеет вид

nasm -f elf32 имя_ассемблерного_файла

или без пробела между флагом формата и его значением в виде

nasm -felf32 имя_ассемблерного_файла

Имя файла результата, формируемое транслятором из файла исходного текста, зависит от используемого формата, если только это результирующее имя не указывается явно. Так объектные файлы для операционных систем Windows получают расширение OBJ – при той же основной части имени, что и у исходного файла. Объектные файлы для Unix получают автоматически расширение .o (используемое для объектных файлов в этих системах). Явное указание оказывается нужным при использовании формата bin, поскольку автоматически создается файл с той же основной частью имени, но без расширения. Для получения исполняемых файлов ОС MS-DOS, являющихся наиболее простыми для этой системы – так называемых односегментных, требуется расширение .COM в имени этих файлов. Для достижения этой цели помогает вспомогательная опция явного указания имени результирующего файла. Она записывается в виде

-o имя_результирующего_файла

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

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

-l имя_файла_листинга

При использовании операционной системы Linux исполняемый файл из объектных файлов создается с помощью компоновщика, который имеет наименование ld. Обычная форма его использования при построении исполняемого файла только из одного исходного для 32-битных версий ОС есть

ld имя_объектного_файла

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

ld -o имя_исполняемого_файла имя_объектного_файла

При разработке 32-битных по существу программ на 64-битных версиях современных ОС Linux используется дополнительный флаг явного указания целевой архитектуры. Он в требуемом употреблении задается как -m elf_i386. Команда на формирование исполняемого файла будет при этом иметь вид

ld -m elf_i386 -o имя_исполняемого_файла имя_объектного_файла

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

nasm -f elf32 $1.asm -l $1.lst

ld -m elf_i386 -o $1.exe $1.o

и назвать его, например, nasml. Тогда построение исполняемого файла из исходного файла с именем prog1.asm может быть получено вызовом в командной строке

./nasml prog1

(Естественно, предполагается, что командный файл nasml находится в текущем каталоге; если же он находится в каталоге, по которому ведется автоматический поиск, согласно переменной окружения PATH, то достаточно вызвать его в виде nasml prog1.) В ходе выполнения командного файла будет построен промежуточный файл с именем prog1.o – как результирующий при работе программы nasm – и файл листинга с именем prog1.lst, из которых программа компоновщика должна построить исполняемый файл с именем prog1.exe. Если в ходе выполнения программ, вызываемых в командном файле, будут обнаружены ошибки, мешающие такому созданию, то какие-то файлы из перечисленных могут быть не созданы.