Skip to content

Latest commit

 

History

History
165 lines (99 loc) · 24.9 KB

lab02_mc.textile

File metadata and controls

165 lines (99 loc) · 24.9 KB

Лабораторная работа №2. Дополнительные приемы трансляции программы на языке ассемблера

Краткие теоретические сведения

Системные инструменты

Расширенный синтаксис командной строки NASM и LD

Полный вариант командной строки nasm выглядит следующим образом:

 nasm [-@ косвенный_файл_настроек] [-o объектный_файл] [-f формат_объектного_файла] [-l листинг]
 [параметры...] [--] исходный_файл

Для более подробной информации см. man nasm. Для получения списка форматов объектного файла см. nasm -hf.

Пример nasm -f elf64 -g -l main.lst main.asm скомпилирует исходный файл main.asm в main.o, при это формат выходного файла будет elf64, и в него будут включены символы для отладки (g), вдобавок будет создан файл листинга main.lst.

Примечание: формат elf64 позволяет создавать исполняемый код, работающий под 64-битными версиями Linux. Для 32-битных версий ОС указываем в качестве формата просто elf.

Компоновщик ld имеет следующий формат командной строки:

ld [параметры] объектные_файлы…

Для более подробной информации см. ld --help или man ld.

Пример ld -Map main.map -o main main.o создаст исполняемый файл main из объектного файла main.o, при этом создавая карту памяти в файл main.map.

Компоновщик ld не предполагает по умолчанию расширений для файлов. Но принято использовать следующие расширения:

  • o для объектных файлов;
  • без расширения для исполняемых файлов;
  • map для файлов схемы программы;
  • lib для библиотек.

Если имя выполняемого файла не определено, оно будет образовано из имени первого объектного файла.

Утилита MAKE

make – утилита GNU для обработки групп программ. В том числе она может управлять трансляцией и компоновкой. Поведение make описывается файлом Makefile, который должен присутствовать в текущем каталоге. Это текстовый файл, который может содержать:

  • комментарии;
  • правила;
  • макроопределения.

Пример:

build:
    nasm -f elf64 -g -l main.lst main.asm
    ld -Map main.map -o main main.o
clean:
    rm -f main main.o main.lst main.map
# здесь могут быть дополнительные команды

В примере созданы два правила с именами («целями») build и clean. Первое из них выполняет трансляцию и сборку программы main.asm, а второе удаляет все созданные предыдущим правилом файлы. Таким образом, если набрать в командной строке make build, то будет создан исполняемый файл из main.asm. Если набрать make clean, то проект будет очищен: будут удалены все файлы, создаваемые nasm и ld. Для более подробной информации см. man make.

Примечание: утилита make необычно требовательна к содержимому make-файла. Ей необходимо, чтобы команды в правилах (в отличие от целей) начинались с отступа, и отступ обязательно должен создаваться символом табуляции, а не пробелами. Редактор mcedit по умолчанию заменяет табуляции пробелами. Чтобы он создавал настоящую табуляцию, нужно в меню (F9) выбрать подпункт «Общая» пункта «Настройка» и убрать галочку в пункте «Симулировать неполную табуляцию».

Основы работы с Midnight Commander

Midnight Commander (или просто mc) — это программа, которая позволяет просмотреть структуру каталогов и выполнить основные операции по управлению файловой системой. Другими словами, это файловый менеджер. Если вы имеете опыт работы с другими подобными файловыми менеджерами, например Norton Commander (nc) в DOS или FAR в Windows, то вы легко сможете работать и с mc, поскольку основные особенности поведения и даже основные комбинации «горячих клавиш» у них совпадают.

Для активации оболочки MC достаточно ввести в командной строке mc и нажать клавишу ввод.

Хотя для управления файловой системой и вообще для работы с файлами можно использовать такие команды операционной системы, как pwd, ls, cd, mv, mkdir, rmdir, cp, rm, cat, more и т. д., многие операции с файлами удобнее делать с помощью программы Midnight Commander, которая наглядно представляет все выполняемые действия.

Наиболее часто выполняемые в Midnight Commander операции привязаны к функциональным клавишам <F1>  – <F10>. Приведем сводку в виде таблицы.

Функциональная клавиша Выполняемое действие
<F1> Вызывает контекстно-зависимую подсказку
<F2> Вызывает меню, создаваемое пользователем
<F3> Просмотр файла, на который указывает подсветка в активной панели
<F4> Вызов встроенного редактора для файла, на который указывает подсветка в активной панели
<F5> Копирование файла или группы отмеченных файлов из каталога, отображаемого в активной панели, в каталог, отображаемый на второй панели. При копировании одного файла можно поменять его имя. Можно также указать имя каталога, куда будет производиться копирование (если надо скопировать в каталог, отличный от каталога, отображаемого во второй панели)
<F6> Перенос файла или группы отмеченных файлов из каталога, отображаемого в активной панели, в каталог, отображаемый на второй панели. Как и при копировании, можно поменять имя файла или целевого каталога.
<F7> Создание подкаталога в каталоге, отображаемом в активной панели
<F8> Удаление файла (подкаталога) или группы отмеченных файлов
<F9> Вызов основного меню программы (отображаемого над панелями)
<F10> Выход из программы

Вызвать главное меню можно клавишей F9.

Выпадающее подменю «Команды» главного меню позволяет выполнить еще ряд операций по управлению файловой системой, а также выполнить некоторые команды, изменяющие вид панелей Midnight Commander и отображаемую в панели информацию.

При обращении к команде меню «Дерево каталогов» выводится окно, отображающее структуру каталогов файловой системы.

Команда «Поиск файла» (горячие клавиши <Meta>+<?> или <Esc>,<?>) выпадающего меню «Команда» позволяет вам найти на диске файл с заданным именем. После выбора этой команды меню вначале запрашивается имя искомого файла и имя каталога, с которого необходимо начинать поиск. Нажав экранную кнопку «Дерево», вы можете выбрать начальный каталог поиска из дерева каталогов. В поле «Содержание» (Contents) можно задать регулярное выражение по правилам команды egrep. В частности, это означает, что перед символами, имеющими специальное значение для egrep, необходимо вставить символ «\», например, если вам нужно найти строку «strcmp (», вы должны указать шаблон поиска в виде «strcmp \(». Для того, чтобы начать поиск, нажмите экранную кнопку «Дальше». Во время поиска его можно приостановить кнопкой «Остановить» и продолжить по кнопке «Продолжить».

Список найденных файлов можно просматривать, перемещаясь с помощью клавиш <Стрелка вверх> и <Стрелка вниз>. Кнопка «Перейти» используется для перехода в каталог, в котором находится подсвеченный файл. Кнопка «Повтор» служит для задания параметров нового поиска.

Кнопка «Выход» служит для выхода из режима поиска.

Нажатие на кнопку «Панелизация» приведет к тому, что результаты поиска будут отображены на текущую активную панель, так что вы можете производить с выбранными файлами еще какие-то действия (просматривать, копировать, перемещать, удалять и так далее). После вывода на панель можно нажать <Ctrl>+<R> для возврата к обычному списку файлов.

Команда «Переставить панели» (<Ctrl>+<U>) меняет местами содержимое правой и левой панелей.

По команде «Отключить панели» (<Ctrl>+<O>) показывается вывод последней из выполнявшихся команд shell.

По команде «Сравнить каталоги» (<Ctrl-X>, <D>) сравнивается содержимое каталогов, отображаемых на левой и правой панелях.

Команда меню «История команд» выводит окно со списком ранее выполнявшихся команд. Подсвеченную строку из истории можно скопировать в командную строку оболочки (перемещение подсветки — клавишами <Стрелка вверх> и <Стрелка вниз>, копирование — по клавише <Enter>).

Команда меню «Фоновые задания» позволяет вам управлять фоновыми заданиями, запущенными из Midnight Commander (такими заданиями могут быть только операции копирования и перемещения файлов). Используя эту команду меню или горячие клавиши <Ctrl>+<X>, <J>, вы можете остановить, возобновить или снять любое из фоновых заданий.

После выбора команды меню «Файл расширений» вы получаете возможность редактировать файл mc.ext, в котором можете связать с определенным расширением файла (окончанием имени после последней точки) программу, которая будет запускаться для обработки (просмотра, редактирования или выполнения) файла с таким расширением. Запуск выбранной программы будет осуществляться после установки подсветки на имя файла и нажатия клавиши <Enter>.

Команда «Файл меню» используется для редактирования пользовательского меню (которое появляется после нажатия клавиши <F2>).

Настройка оболочки Midnight Commander

Одно из важных достоинств mc — конфигурируемость. Поскольку получение выполняемого файла из ассемблерной программы выполняется ручным запуском нескольких программ, на практике этот процесс как правило автоматизируют, например с использованием утилиты make. Но конечно же есть и другие способы. Несколько вариантов возможной автоматизации предоставляет mc.

Первый способ — это использование упоминавшегося выше файла расширений. За каждым типом файла можно закрепить действия, которые будут выполняться при выборе нужного файла и нажатии на клавишу <Enter>. Это действие задается в специальном файле расширений (bindings) mc.ext (F9\rightarrowКоманда\rightarrowФайл расширений). Он имеет текстовый формат и может быть отредактирован любым текстовым редактором. Но предпочтение лучше отдавать встроенному редактору mc, т. к. в этом случае на экран появится подсказка по внутреннему формату файла. Наиболее просто войти в режим редактирования через меню mc, выбрав F9\rightarrowКоманда\rightarrowФайл расширений.

Второй способ — использование меню. В отличие от предыдущего варианта, тут можно выбрать различные действия для одного и того же файла. Например, можно просто получить выполняемый модуль, а можно получить и запустить его. Настройка меню хранится в текстовом файле .mc.menu или .mc/menu. Как и файлов расширений, файлов меню может быть много, они бывают основными и локальными. Для их настройки можно выбрать: F9 \rightarrow Команда \rightarrow Файл меню \rightarrow Main/Local. Внутренний формат очень похож на формат файла расширения и тоже ясен из подсказки.

Элементы программирования

Описание инструкций MOV и INT

Инструкция языка ассемблера mov предназначена для дублирования данных источника в приемнике. В общем виде записывается

mov dst, src

где dst — приемник, src — источник.

Инструкция языка ассемблера int предназначена для вызова прерывания с указанным номером. В общем виде записывается

int n

где n — номер прерывания, принадлежащий диапазону 0 – 255. При программировании в Linux с использованием вызовов ядра (sys_calls) n = 80h (принято задавать в шестнадцатеричной системе счисления).

Вызывая инструкцию int 80h, мы выполняем системный вызов какой-либо функции ядра Linux. При этом происходит передача управления ядру операционной системы. Чтобы узнать, какую именно системную функцию нужно выполнить, ядро извлекает номер системного вызова из регистра eax. Поэтому перед вызовом прерывания необходимо поместить в этот регистр нужный номер — например, выполнить mov eax, 3 для системного вызова номер 3. Многим системным функциям требуется передавать какие-либо параметры. По принятым в ОС Linux правилам, эти параметры помещаются в порядке следования в остальные регистры процессора: ebx, ecx, edx и т. д. Если системная функция должна вернуть значение, она помещает его в регистр eax.

Системные вызовы для обеспечения диалога с пользователем

Простейший диалог с пользователем требует наличия двух функций: вывода текста на экран и ввода текста с клавиатуры. Простейший способ вывести строку на экран — использовать системный вызов write, который аналогичен функции write из языка Си и предназначен для записи данных в файл. Этот системный вызов имеет номер 4, поэтому перед вызовом инструкции int необходимо поместить значение 4 в регистр eax. Первым аргументом write, помещаемым в регистр ebx, задается дескриптор файла. Для вывода на экран в качестве дескриптора файла нужно указать 1 (что означает «стандартный вывод», т. е. вывод на дисплей).

Вторым аргументом задается адрес выводимой строки (помещаем его в регистр ecx, например инструкцией mov ecx, hello). Строка может иметь любую длину. Последним аргументом (т.е. в регистре edx) должна задаваться максимальная длина выводимой строки (посмотрите, как это делалось в программе из предыдущей работы).

Для ввода строки с клавиатуры можно использовать аналогичный системный вызов read. Этот системный вызов имеет номер 3. Подробная информация о нем, предоставляемая командой man 2 read показывает, что его аргументы — такие же, как у вызова write, только для «чтения» из клавиатуры мы используем файловый дескриптор 0 (стандартный ввод) а не (1 — стандартный вывод — как было при выводе на дисплей). Возвращаемое через регистр eax значение функции read — количество прочитанных с клавиатуры символов.

Порядок выполнения работы

  1. Создайте новый текстовый файл asdfg.asm и сохраните его в своем домашнем каталоге.
  2. Пользуясь информацией, приведенной в теоретической части, написать программу, работающую по следующему алгоритму:
    • вывести приглашение, типа "Введите строку:";
    • ввести строку с клавиатуры;
    • вывести введенную строку на экран.
  3. Создайте в своем домашнем каталоге новый подкаталог и скопируйте в него созданный файл с текстом программы.
  4. Скопируйте файл asdfg.asm в lab02-1.asm.
  5. Оттранслируйте полученный текст программы в объектный файл по схеме lab02-1.asm \rightarrow q.o и asdfg.asm \rightarrow w.o.
  6. Повторить результат предыдущего пункта с использованием косвенного файла.
  7. Создать для MAKE файл с явными правилами получения выполняемых файлов двух написанных программ. Проверить работу MAKE, внося изменения в комментарии программы.
  8. Настроить файл расширений так, чтобы для asm выполнялась трансляция, а для obj — компоновка c созданиeм файла карты загрузки.
  9. Создать локальное меню для mc, в котором для клавиши F5 задать запуск полного процесса получения выполняемого файла из программы, на которую установлен курсор.

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

  1. Каково назначение и формат косвенных командных файлов для NASM?
  2. Каково назначение и формат файлов подсказки для LD?.
  3. Каково назначение утилиты MAKE?
  4. Где задаются правила поведения MAKE?