Итак, поехали! Курс обучения любому языку программирования принято начинать с написания программы «Hello, world!». Однако мы этого делать не будем. Потому что «Hello, world!» на ассемблере придется долго объяснять и трудно понять сходу. А я хочу сделать курс из коротких понятных статей.
Поэтому мы напишем совсем простую программу. Сразу оговорюсь, что мы будем писать только COM-программы под DOS. Они проще, чем EXE, а подробно разбирать тонкости программирования под DOS мне не интересно, во всяком случае в учебном курсе.
Для того, чтобы написать программу, нам надо запустить подходящий для ассемблера текстовый редактор (например, условно-бесплатный Sublime Text). Кто работает под 32-х битной Windows могут сразу набирать программу в компиляторе fasmw.exe. Пример набранного кода:
В приглянувшемся текстовом редакторе надо ввести следующее (я подробно объясню ниже, что значит каждая строчка):
1 2 3 4 5 6 7 8 9 10 | use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h mov ax,255 ;Поместить 255 в регистр AX inc ax ;Увеличить содержимое AX на 1 nop ;Эта команда ничего не делает mov bx,ax ;Поместить в BX содержимое AX mov ax,4C00h ;\ int 21h ;/ Завершение программы |
Первая строка «use16» сообщает FASM’у, что нужно генерировать 16-битный код. Нам нужен именно такой для нашей первой программы. Точка с запятой — это символ комментария. Все что идет после «;» до конца строки игнорируется компилятором. Там можно писать все что угодно.
Вторая строка «org 100h» объясняет FASM’у, что следующие команды и данные будут располагаться в памяти, начиная с адреса 100h. Дело в том, что при загрузке нашей программы в память, DOS размещает в первых 256 байтах (с адресов 0000h — 00FFh) свои служебные данные. Нам эти данные изменять нежелательно.
Далее идут непосредственно команды! Программа на ассемблере состоит из команд процессора. Каждая команда обозначается мнемоникой (символическим именем). Например «mov», «inc», «nop» и т.д. После мнемоники могут идти операнды. Они отделяются одним или несколькими пробелами (или табуляцией).
Команды бывают без операндов, с одним или несколькими операндами. Если операндов больше одного, то они отделяются друг от друга запятыми.
Отступы не обязательны, но желательны — с ними код гораздо легче читать. Пустые строки игнорируются. Регистр символов значения не имеет. Можно писать большими буквами, или маленькими, или в перемешку.
Четвертая строка определяет команду «поместить число 255 в регистр AX». «mov» — это мнемоника команды (от английского «MOVe»). AX — первый операнд — приёмник. 255 — второй операнд — источник. Первый операнд является регистром. Второй операнд — константа 255.
Пятая строка. Тут команда «inc» с одним операндом. Она заставит процессор выполнить инкремент, то есть увеличение на единицу. Единственный операнд — это регистр AX, содержимое которого и будет увеличено на 1.
Шестая строка. Команда «nop» — без операндов. Эта команда ничего не делает Зачем она нужна я ещё расскажу как-нибудь.
Седьмая строка. Снова команда «mov», но на этот раз оба операнда являются регистрами. Команда скопирует в BX содержимое AX.
Две последние строки — это стандартное завершение процесса в DOS. Так мы будем завершать все наши программы. Команда «mov» должна быть вам понятна, а про команду «int» я ещё расскажу, это отдельная тема.
Сохраните прорамму внутри папки где установлен fasm (C:\fasm) под именем lesson1.asm
Файл с расширением .asm — это исходный код или исходник, обычный текстовый файл. При желании его можно открыть блокнотом, ну а ваш текстовый редактор и компилятор fasm, получают «намек», что дело предстоит иметь с исходным кодом на ассемблере.
Чтобы откомпилировать программу надо в DOSBox набрать команду:
1 | fasm lesson1.asm |
Выполнив команду fasm переведет текст, набранный нами, в машинный код и сделает его программой с названием lesson1.com
Отлично! Целых 12 байт получилось
В каталоге с asm-файлом появился файл .com — это и есть наша прога!
Если в коде что-то неправильно, то в этом окне вы увидите сообщение об ошибке.
Пользователям 32-битной Windows в их fasm выбрать меню Run->Compile. FASM предложит сохранить файл, если вы этого ещё не сделали, а затем скомпилирует.
В общем, наша программа ничего не делает Но в следующей статье я расскажу как работать с отладчиком. И мы её отладим и увидим как она работает!
10 ответов к “Учебный курс. Урок 2. Первая программа”
Ждем продолжения!!! Спасибо за статьи!
Рад, что кто-то читает! Буду продолжать :)
Спасибо, что есть такой ресурс! Читать одно удовольствие!
Благодарю. Приятно читать такие отзывы :)
В общем, наша программа ничего не делает 🙂
Почему мы юзаем:
mov ax, 4C00h
int 21h
вместо:
int 20h
20-е прерывание специально для завершения программы + экономия 4 байта, зачем юзать 21-е?
Появляется ошикба: illegal command fasm
что делать?
Ошибка говорит, что файл программы fasm не находится в директории, откуда вызывается команда.
Алёна, перед вызовом fasm проверьте, что выполняются следующие команды в конфигурационном файле из Урок 1:
mount g c:/fasm
g:
cd CWSDPMI/BIN/
CWSDPMI/BIN/
CWSDPMI -p -s-
cd /.
Если вы пропускаете настройку Dosbox.conf, эти команды нужно повторять ручным вводом в окне Dosbox.
Также для компиляции подходит fasmw ( fasm для Windows fasmw17325). Программа имеет графический UI и позволяет компилировать из окна программы, но запускать полученную COM программу нужно через DOSBOX.
Алёна, похоже у меня было тоже, что у вас.
в окне ДОСБокса не было синего сообщения, всё было на чёрном фоне, и были сообщения, что ничего «не смонтировалось».
Выснилось, что у меня ДБ установлен в C:\Program Files (x86)
и, если я правильно понимаю, пробел в названии папки Program Files не давал ДБ начать работать так, как нам надо.
Я удалил с компа ДБ. В списке программ, которые я могу удалить, Моя Винда_10 ДОСБокса мне не предоставила, так я тупо удалил все папки, связанные так или иначе с ДБ. Не уверен, что всё это было проделано правильно.
Затем установил ДБ по-новой, изменив адрес папки, куда устанавливать, на C:\ . Запустил, окно ДБ — как на картинке в 1-м уроке. Маленькая победа! Сейчас буду пробовать ФАСМ.
___Возможно, кому-то будет полезно___
Увеличить окно ДБ, (а вместе с размером улучшается разрешение содержимого) можно, изменив 2 строчки в конфигурационном файле.
windowresolution=1600×800 Было original
output=opengl Было surface
помог вот этот сайт https://utyatnishna.ru/info/407973/how-to-increase-size-of-doxbox-window?ysclid=lts3lufrld91660286