Учебный курс. Часть 2. Первая программа
Автор: xrnd | Рубрика: Учебный курс | 04-02-2010 |
Распечатать запись
Итак, поехали! Курс обучения любому языку программирования принято начинать с написания программы «Hello, world!». Однако мы этого делать не будем. Потому что «Hello, world!» на ассемблере придется долго объяснять и трудно понять сходу. А я хочу сделать курс из коротких понятных статей.
Поэтому мы напишем совсем простую программу. Сразу оговорюсь, что мы будем писать только COM-программы под DOS. Они проще, чем EXE, а подробно разбирать тонкости программирования под DOS мне не интересно, во всяком случае в учебном курсе.
Для того, чтобы написать программу, нам надо запустить 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» я ещё расскажу, это отдельная тема.
Чтобы откомпилировать программу надо выбрать меню Run->Compile. FASM предложит сохранить файл, если вы этого ещё не сделали, а затем скомпилирует. То есть переведет текст, набранный нами, в машинный код и сделает его программой. Файл с расширением .asm — это исходный код или исходник, обычный текстовый файл. При желании его можно открыть блокнотом )
Отлично! Целых 12 байт получилось 😀
В каталоге с asm-файлом появился файл .com — это и есть наша прога!
Если в коде что-то неправильно, то в этом окне вы увидите сообщение об ошибке.
В общем, наша программа ничего не делает 🙂 Но в следующей статье я расскажу как работать с отладчиком. И мы её отладим и увидим как она работает! 🙂
13-06-2012 09:58
хм не учел inc. Но лучше не рисковать и не надеяться на то что значение al будет 00, лучше задать его явно, да и понятнее будет.
08-08-2012 01:11
Скачал фасм 2.0 с сайта , ввел все, что выло указано на уроке (выше) и сразу неудача при попытки компилировать написанное фасм выдает ошибку что компилятор фасм не найден. Помогите советом что делать?
05-12-2015 12:29
Скачай программу из файлов на сайте:
“FASM 1.71.21 for Windows” и работай в нем.
07-09-2012 15:53
Спасибо. Нас тоже на FLATе учат. =)
30-09-2012 17:37
Автор, спасибо. Очень нужный сайт.
14-10-2012 18:24
Два файла получилось потому что так и должно быть файл с расширением *.ASM это исходный текст программы а файл *.COM это уже исполняемый файл генерированный компилятором fasm.
29-11-2012 22:51
[quote]Можно писать большими буквами, или маленькими, или в перемешку.[/quote]
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 ;/ Завершение программы
30-11-2012 00:39
U MENYA NE “COM” A “BIN”
poch ?
09-12-2012 12:40
Приветствую Вас уважаемый автор! Не прекращающиеся овации в оценку сайта, все очень понятно и наглядно, и все в картинках ^-^. Но есть такой вопрос, если команда nop ничего не делает (значит ее можно не использовать), то почему без нее мы получаем 11 байт, а с ней 12?=))
17-12-2012 01:18
Здесь команда nop добавлена для примера, можно её не использовать.
А вообще она применяется для создания программной задержки (команда ничего не делает, но на её выполнения тратится небольшое время), для выравнивания блоков кода и для других целей.
02-07-2013 19:50
Во первых на МАСМ32 разрабатываются только 32 – ух битные приложения. На FASM можно любые. MASM предназначен только для Microsoft Windows. А на FASM хоть свою ос пиши и пиши под нее приложения. Вот чем отличается …. ^___^
12-02-2014 11:15
Здравствуйте.
Мне нравится у вас учится.
20-08-2014 23:46
я первый раз в жизни сел я просто в шоке у меня получается хороший учитель
28-09-2014 00:56
Скажите, что означает буква h после цифры? 100h, 4C00h
07-10-2014 04:36
Буква h означает шестнадцатеричное число (hex)
07-02-2015 07:09
Автор, обновления будут?
30-11-2014 13:35
При компиляции\запуске под виндой выдаёт ошибку несовместимости разрядности,- как исправить? если это возможно.. писал use32,64… непомагает… пришлось запустить в виртуалбоксе
15-12-2014 19:52
Пробовал сразу сесть за Олю и разбомбить довольно сложную программу. И понял, что нужно начинать “снизу” :). Спасибо автору. Начало хорошее, посмотрим, как дальше пойдет.
01-02-2015 02:58
а будут ли рассмотрены программы под винду???
01-02-2015 03:02
имею в виду программы с “format PE”…32 битные…
05-06-2015 21:52
Большое спасибо автору за пошаговый туториал!
Я понимаю что это вообще не проблема урока.
Но не возможно быстро получить результат демотивирует. 🙁
Забил код в FASMW, сохранил и скомпилировал. Всё это под Windows 8.1 64-разрядной.
При попытке выполнить скомпилированную программу пишет:
«Не удалось запустить программу или компонент (путь к файлу) из-за несовместимости с 64-разрядной версией Windows.»
Так как ассемблера не знаю ни какого. То методом тыка пытался использовать use32 и use64, результат не изменился.
Подскажите как надо переписывать код чтобы адаптировать его под 64-х разрядную ОС и процессор?
05-06-2015 22:17
Кажется я нашёл решение. 🙂
Я поставил DosBox. %)))
04-07-2015 21:10
Спасибо за статьи, отличный сайт )
03-08-2015 22:34
Что то я не понял, мы что третей строкой для DOC резервируем память.???
Или что мы делаем третьей строкой???
mov ax,255 ;Поместить 255 в регистр AX
Как то не совсем корректно здесь написано.
05-12-2015 12:30
Большое спасибо автору за легкий и интересный материал, по такой сложной темы!!
08-12-2015 00:01
Спасибо за материалы!
19-09-2016 12:07
Автор молодец! Всё отлично и интересно излагаешь, ничего лишнего! Большое спасибо!
16-10-2016 11:44
Даже в 2016 читают!
29-10-2016 03:32
Не запускается fasmw.exe(
Просто окошко выскакивает и сразу убирается(
В чем мб проблема?
06-08-2017 17:33
Спасибо за статьи, автору респект, побольше бы таких!
03-09-2017 10:58
Просто оставлю здесь, чтобы знали, что это еще нужно.
Спасибо!
17-09-2017 17:41
Добрый день!
Собираюсь обучиться ассемблеру,
используя SASM. Не возникнут ли
у Windows XP проблемы при использовании
Ваших уроков?
В любом случае, спасибо за Учебный курс.
С уважением, Виктор.
04-10-2017 02:44
Здравствуйте, статьи, на мой взгляд, очень полезные, всё доступно и просто.
Но у меня возникла одна проблема.
Я компилирую, нахожу файлик com, а он не запускается. Пишет, что версия приложения не совместима с используемой версией windows.
Подскажите плз, что делать?
02-11-2017 01:08
Зачем в команде MOV помещать 4C00h в AX? Какой смысл помещать 4C00h в AX и зачем компьютеру нужнен такой код?
24-01-2018 18:17
Спасибо! Я уже думал асм все забыли!
07-02-2018 22:26
Подскажите пожалуйста, такая проблема: при запуске скомпилированного файла вылазит ошибка. “Неподдерживаемое 16-разрядное приложение” . Дело в том, что у меня винда 64х разрядная. Можно ли как-нибудь скомпилировать 64х разрядное приложение?
26-07-2019 13:58
Ты не поверишь, но и спустя 10 лет читают 🙂
20-10-2019 14:52
О да! Хорошо, что вы создали этот сайт. Сейчас в универе ассемблер проходим. Обясняют мягко говоря не очень, а лабораторок задают много. Ещё раз убеждаюсь, что научиться можно большему в интернете, чем в универе
12-01-2020 19:20
Всем добра! А на 64-разрядной винде это все будет работать, отладчик не могу запустить. Как-то я поздновато похоже?