Настройка DOSBox в Ubuntu для программирования на ассемблере x86
Используем Dos Navigator и flat assembler

Программирование на PC для меня началось с Turbo Pascal и Turbo Assembler от компании Borland. В то время мой компьютер на базе Intel 80386SX мог нормально работать только в MS-DOS. Накатила ностальгия, и я решил вспомнить основы x86 ассемблера. Для чистоты эксперимента буду использовать условия приближенные к боевым.

Для начала нужна MS-DOS. Или её аналог. Можно использовать любую виртуальную машину, такую как QEMU или VirtualBox, а затем создать под неё образ системы. Но есть вариант лучше! Вот что говорит нам Википедия про DOSBox:

DOSBox — эмулятор для PC, создающий DOS-окружение, необходимое для запуска старых программ и игр под MS-DOS. Это позволяет играть в такие игры в операционных системах, не поддерживающих или поддерживающих DOS-программы не полностью, и на современных компьютерах, на которых иначе старые программы могут не работать или работают с ошибками.

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

Итак, чтобы установить DOSBox под Ubuntu, достаточно выполнить команду:

sudo apt install dosbox

Окно DOSBox

Готово. Теперь нужно настроить среду. Для начала создадим каталог, который будем монтировать в DOSBox.

mkdir ~/DOS

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

cd ~/DOS
wget https://www.ritlabs.com/download/dn/dn151.zip -O dn151.zip; unzip dn151.zip -d DN; rm dn151.zip

Туда же скачаем и распакуем наш ассемблер. Мой выбор пал на flat assembler. Именно так, с маленькой буквы. 😉

cd ~/DOS
wget https://flatassembler.net/fasm17323.zip -O fasm17323.zip; unzip fasm17323.zip -d FASM; rm fasm17323.zip

Настраиваем параметры автозагрузки DOSBox в файле конфигурации dosbox-0.74-3.conf

nano ~/.dosbox/dosbox-0.74-3.conf
[autoexec]
MOUNT C /home/vladimir/DOS
C:
PATH=C:\FASM
C:\DN\DN.COM

Раздел [autoexec] специально создан для команд, которые будут автоматически выполняться сразу после загрузки DOSBox. Давайте разберём что тут происходит в каждой строке:

  • MOUNT C /home/vladimir/DOSмонтируем созданный нами каталог как диск C;\
  • C:переходим на диск C, который теперь содержит скачанные нами программы (по умолчанию система стартует и остаётся на диске Z);\
  • PATH=C:\FASMдобавляем каталог содержащий ассемблер flat assembler в переменную PATH, чтобы можно было стартовать его из любого другого каталога;\
  • C:\DN\DN.COMзапускаем Dos Navigator.

Запускаем DOSBox и видим окно Dos Navigator, которое отображает содержимое диска C.

Окно DOSBox с запущенным Dos Navigator

Однако, если сейчас попробовать запустить flat assembler командой fasm в командной строке, или (что то-же самое) перейти в каталог FASM и запустить fasm.exe, то мелькнёт чёрное окно и больше ничего не произойдёт. Но на самом деле вывод в консоль был, и посмотреть его можно, нажав комбинацию клавиш Ctrl+O, скрыв панели Dos Navigator, и второй раз её же, чтобы панели вновь показать. И там мы увидим ошибку:

Окно DOSBox с ошибкой flat assembler

error: no 32-bit DPMI services are available.

Проблема в том, что flat assembler требует для своей работы DPMI, который DOSBox не может эмулировать самостоятельно.

DPMI (DOS Protected Mode Interface) — протокол доступа к памяти, с помощью которого DOS-программа может использовать дополнительную память персонального компьютера с адресами выше 1 Мбайта, недоступную при работе процессора 80x86 в реальном режиме. Практически все DOS-расширители основаны на DPMI и позволяют программам DOS обращаться ко всей памяти компьютера и работать в защищённом режиме. Самым известным отдельным ядром DPMI является CWSDPMI.

Решает эту проблему запуск CWSDPMI в фоновом режиме. Закрываем окно DOSBox. Переходим в каталог ~/DOS, скачиваем и распаковываем архив с CWSDPMI.

cd ~/DOS
wget http://sandmann.dotster.com/cwsdpmi/csdpmi7b.zip -O csdpmi7b.zip; unzip csdpmi7b.zip -d CWSDPMI; rm csdpmi7b.zip

Добавляем запуск CWSDPMI в параметры автозагрузки DOSBox

nano ~/.dosbox/dosbox-0.74-3.conf
[autoexec]
MOUNT C /home/vladimir/DOS
C:
PATH=C:\FASM
C:\CWSDPMI\BIN\CWSDPMI.EXE -p
C:\DN\DN.COM

Стартуем DOSBox по новой.

Окно DOSBox с результатом запуска flat assembler

И видим, что flat assembler теперь работает нормально. Можно начинать писать программы на ассемблере.

Создаём в корне диска C каталог SRC, нажав клавишу F7; а в ней файл START.ASM, нажав комбинацию клавиш Shift+F4.

Окно DOSBox создание файла

Содержимое файла START.ASM:

; START.ASM
    org     100h
    int     20h

Компилируем файл командой:

fasm start.asm

Получаем скомпилированную программу размером в 2 байта, которая ничего не делает, кроме как завершает свою работу. Как два байта переслать! 😏

Окно DOSBox скомпилированный файл

flat assembler содержит примеры исходников различных программ в каталоге C:\FASM\EXAMPLES, можете с ними ознакомиться.

Ссылки

DOSBox – страница для загрузки DOSBox.

Dos Navigator – страница для загрузки Dos Navigator.

flat assembler – страница для загрузки flat assembler.

CWSDPMI – страница для загрузки CWSDPMI r7.

Все программы указанные в примерах, также можно скачать с этого сайта: