Полный вариант командной строки 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
– утилита 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 (или просто 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>).
Одно из важных достоинств 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 предназначена для дублирования данных источника в приемнике. В общем виде записывается
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
— количество прочитанных с клавиатуры символов.
- Создайте новый текстовый файл
asdfg.asm
и сохраните его в своем домашнем каталоге. - Пользуясь информацией, приведенной в теоретической части, написать программу, работающую по следующему алгоритму:
- вывести приглашение, типа "Введите строку:";
- ввести строку с клавиатуры;
- вывести введенную строку на экран.
- Создайте в своем домашнем каталоге новый подкаталог и скопируйте в него созданный файл с текстом программы.
- Скопируйте файл
asdfg.asm
вlab02-1.asm
. - Оттранслируйте полученный текст программы в объектный файл по схеме
lab02-1.asm
\rightarrowq.o
иasdfg.asm
\rightarroww.o
. - Повторить результат предыдущего пункта с использованием косвенного файла.
- Создать для MAKE файл с явными правилами получения выполняемых файлов двух написанных программ. Проверить работу MAKE, внося изменения в комментарии программы.
- Настроить файл расширений так, чтобы для
asm
выполнялась трансляция, а дляobj
— компоновка c созданиeм файла карты загрузки. - Создать локальное меню для
mc
, в котором для клавиши F5 задать запуск полного процесса получения выполняемого файла из программы, на которую установлен курсор.
- Каково назначение и формат косвенных командных файлов для NASM?
- Каково назначение и формат файлов подсказки для LD?.
- Каково назначение утилиты MAKE?
- Где задаются правила поведения MAKE?