Ассемблер
Как запустить программу на ассемблере в DOSBox
Чтобы запустить программу на ассемблере в DOSBox, нужно подготовить папку проекта, подключить ее командой mount, собрать .asm-файл через TASM, связать объектный файл через TLINK и запустить получившийся .exe. DOSBox в этой схеме нужен не как редактор кода, а как среда, где работают старые DOS-программы
Важно сразу разделить две вещи. DOSBox подходит для учебных 16-битных примеров под DOS: int 21h, сегменты, .model small, TASM, TLINK. Он не предназначен для современных Linux x64 или Windows x64 программ с системными вызовами и 64-битными регистрами. Если вы пишете mov rax, 1 и syscall, это уже другая платформа
Подготовьте папку
Создайте на Windows папку, например:
C:\asm
Внутри удобно держать:
C:\asm\BIN
C:\asm\WORK
В BIN лежат TASM.EXE и TLINK.EXE, а в WORK — исходники. Если у вас другой набор папок, ничего страшного. Главное, чтобы путь был коротким, без кириллицы и без пробелов. Старые DOS-инструменты чувствительны к таким мелочам
Подключите папку в DOSBox
Откройте DOSBox и выполните:
mount c c:\asm
c:
dir
Команда mount делает папку C:\asm видимой внутри DOSBox как диск C:. После c: вы переходите на этот виртуальный диск. Команда dir должна показать ваши папки
Если DOSBox пишет, что путь не найден, проблема почти всегда в неправильном пути на реальной машине. Проверьте, что папка действительно существует
Напишите hello.asm
Создайте файл WORK\HELLO.ASM:
.model small
.stack 100h
.data
msg db 'Hello from DOSBox$'
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 09h
lea dx, msg
int 21h
mov ax, 4c00h
int 21h
main endp
end main
Знак $ в строке нужен DOS-функции 09h: она выводит символы до этого маркера. Это не общая особенность ассемблера, а именно правило конкретной DOS-функции
Соберите и запустите
Если TASM.EXE и TLINK.EXE лежат в C:\asm\BIN, выполните:
c:
cd work
..\bin\tasm hello.asm
..\bin\tlink hello.obj
hello.exe
После tasm должен появиться HELLO.OBJ. После tlink — HELLO.EXE. При запуске программа выведет:
Hello from DOSBox
Если хотите не писать путь ..\bin\ каждый раз, можно добавить папку в PATH внутри DOSBox:
set path=c:\bin
После этого команды можно вызывать короче:
tasm hello.asm
tlink hello.obj
hello.exe
Как понять, что ошибка в сборке
Если ошибка появляется на этапе tasm, значит проблема в исходном коде: опечатка, неверная директива, незакрытая строка, неправильная модель памяти. Если ошибка появляется на этапе tlink, значит объектный файл есть, но linker не может собрать исполняемый файл. Например, не найден entry point или не хватает файла
Если .exe запускается, но ничего не выводит, проверьте:
- установлен ли
dsчерезmov ax, @dataиmov ds, ax; - есть ли
$в конце строки дляint 21h / ah=09h; - вызывается ли завершение программы через
int 21h / ah=4Ch; - запускаете ли вы именно новый
.exe, а не старый файл из другой папки.
Типичная рабочая схема
Обычно учебная работа выглядит так:
- открыть папку проекта;
- изменить
.asm; - запустить
tasm; - запустить
tlink; - запустить
.exe; - вернуться к коду, если результат не тот.
На первых примерах лучше не автоматизировать сборку. Полезно руками увидеть, что assembler создает .obj, а linker создает .exe. Так легче понять, где именно возникла ошибка
Что почитать дальше по ассемблеру
Если нужен общий маршрут по теме, откройте рубрику ассемблеру. Для соседних задач пригодятся эти разборы:
- Как запустить программу на ассемблере
- Как запустить код на ассемблере
- Как написать в Linux программу на ассемблере x64: Hello World
- CMP в ассемблере