Использование утилит ассемблирования программ для Intel 8088
На практических занятиях по курсу используется набор утилит as88/s88/t88 из пакета ACK (Amsterdam Compiler Kit) для ассемблирования, запуска и отладки программ, написанных на языке ассемблера процессора Intel 8088, который представляет собой упрощённую версию современных процессоров Intel семейства x86 и совместимых с ними (например, AMD). Данные утилиты разработаны специально для использования в учебном процессе сотрудниками Свободного университета Амстердама под началом Эверта Ваттеля (Evert Wattel).
Утилиты собраны под большинство современных операционных систем, однако в версиях под Windows необходима дополнительная настройка. В дисплейных классах следует использовать версию под Linux. Дома рекомендуется установить виртуальную машину с Линуксом, если Линукса нет. Дальнейшие указания приводятся в предположении, что вы используете Линукс.
Утилиты имеют консольный интерфейс и потому предполагают владение командами терминала на базовом уровне: переход между каталогами (команда cd
— от change directory), запуск исполняемых программ с аргументами (в нашем случае аргументами обычно являются имена файлов).
<имя_программы> <имя файла>
— если программа лежит в «системном каталоге»,<имя_программы_включая_полный_путь> <имя файла>
— иначе.
Пример, иллюстрирующий важный частный случай, когда программа и файл лежат в одном каталоге:
./as88 test.s
Символы ./
здесь как раз описывают полный путь к программе и дословно означают «текущий каталог». Другие варианты:
./bin/as88 test.s
— файлas88
лежит в подкаталогеbin
текущего каталога;as88 test.s
— файлas88
лежит в специальном «системном» каталоге. Например, в выдаваемой вам виртуальной машине каталогbin
в домашнем каталоге является «специальным» и существует до начала сеанса работы — потому его содержимое видно в течение сеанса. Соответственно, для ассемблирования файлов внутри виртуальной машины следует использовать именно такую команду.
Дальнейшие указания приводится для случая, когда все файлы лежат в одном каталоге.
Запуск утилит из набора ACK
В предложенном выше архиве для вашей ОС находится три исполняемых файла:
as88
— ассемблер для Intel 8088, эта программа принимает на вход текстовый файл с ассемблерным листингом и генерирует бинарный (исполняемый) файл, а также два вспомогательных файла, о которых будет сказано ниже.s88
— интерпретатор бинарного кода для Intel 8088.t88
— интерпретатор бинарного кода для Intel 8088 в режиме "отладка".
Ассемблерные листинги принято размещать в файлах с расширением .s
. Пусть имеется текстовый файл test.s
с ассемблерным листингом. Тогда команда в консоли
./as88 test
сгенерирует три файла:
-
test.88
— бинарный код для Intel 8088. -
test.#
— файл с указанием, какие позиции исходного файла соответствуют каким позициям бинарного файла. -
test.$
— копия файла с исходным кодом, где подставлен текст включаемых вспомогательных файлов, а также удовлетворены соглашения по оформлению ассемблерных листингов. Учтите, что в случае ошибок ассемблирования as88 указывает номера строк именно в этом файле.
Команда
./s88 test
запускает полученный бинарный код. Если в программе использовался ввод-вывод, то он будет происходить в обычном режиме. Однако в первых программах ввод-вывод не используется, потому необходимо пользоваться отладчиком.
Отладка
Команда
./t88 test
наиболее интересна: она запускает отладку исполняемого файла для Intel 8088. В процессе отладки вы можете выполнять программу пошагово, а также видеть значения регистров, стека и других участков памяти на каждом шаге.
- Для выполнения очередного шага отладки следует нажать Enter.
- Для выхода из отладчика следует нажать q, а затем, Enter.
- Чтобы следить в отладчике за изменением памяти по метке X, можно использовать команду: /X (после набора этих символов во время выполнения отладки нужно нажать Enter).
Более полное описание возможностей отладчика (в том числе, установка точек останова, breakpoints) можно найти на страницах 788–790 книги Таненбаума (номера страниц — по 5-му изданию, приложение В, ссылка на полный текст которого расположена на странице курса).
Обычный цикл работы с программой
Как правило, для решения задачи приходиться неоднократно редактировать, сохранять, ассемблировать и запускать (s88
или t88
) один файл.
Для редактирования подходит любой текстовый редактор с автоматическими отступами.
Для быстрого сохранения следует использовать комбинацию клавиш Ctrl+S
(работает в любом редакторе).
Для быстрого ассемблирования и запуска при предлагаем скачать и сохранить в рабочем каталоге два коротких исполняемых сценария:
Они запускают поочерёдно as88
, а затем s88
(первый) или t88
(второй) — всё это делается для имени файла, переданного в качестве аргумента сценарию. Например, команда
./as88s88.sh test.s
выполнит ассемблирование (as88
) и запуск (s88
) файла test.s
, если файл as88s88.sh
был сохранён в текущем каталоге. Чтобы данные сценарии можно было запускать, после сохранения следует убедиться, что для них установлены права на исполнение. Это можно сделать командой
chmod u+x as88s88.sh
Настройка использования утилит из ACK в Windows
В ОС семейства Windows, начиная с версии XP, необходимо найти файл config.nt
(регистр букв в имени может отличаться). Обычно это C:\Windows\System32\config.nt
(Если такой файл не нашёлся в этой папке, запустите поиск по всему компьютеру.) Также необходимо узнать расположение файла ansi.sys
— обычно он лежит в том же каталоге (C:\Windows\System32
). В файл config.nt
необходимо добавить одну строчку в самом конце:
device=ПУТЬ_К_ANSI.SYS
(редактировать файл можно в Блокноте). Например,
device=C:\Windows\System32\ansi.sys
После этого нужно сохранить файл config.nt
и перезапустить систему.
Если при сохранении файла вам откажут за отсутствием привилегий администратора, можно сохранить полученный файл в какой-либо временный каталог и уже потом скопировать его оттуда в каталог C:\Windows\System32
с помощью «Проводника»: при этом вас попросят выбрать функцию «Выполнить с правами администратора».
64-разрядные системы
В 64-разхрядных системах требуются дополнительные настройки окружения. Для ОС Windows они непонятны. Если у вас Windows на x64, то вам рекомендуется использовать виртуальную машину.
В Линуксе на x64 необходимо доставить один программный пакет, в Ubuntu это делается следующей командой в терминале:
sudo apt-get install lib32z1