Учебный курс. Часть 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 — это и есть наша прога!
Если в коде что-то неправильно, то в этом окне вы увидите сообщение об ошибке.
В общем, наша программа ничего не делает 🙂 Но в следующей статье я расскажу как работать с отладчиком. И мы её отладим и увидим как она работает! 🙂
11-02-2010 22:47
Ждем продолжения!!! Спасибо за статьи!
13-02-2010 18:01
Рад, что кто-то читает! Буду продолжать 🙂
11-03-2010 21:35
Еще как читают 😉 Жду следующую часть!
19-09-2010 23:44
Спасибо, что есть такой ресурс! Читать одно удовольствие!
20-09-2010 16:47
Благодарю. Приятно читать такие отзывы 🙂
12-10-2010 22:34
отличный сайт, аффтар продолжай в том же духе!!
13-10-2010 01:53
Спасибо 🙂
19-10-2010 15:38
Красивый и приятный на вид сайт.
Подробно раскрыты темы- то, что нужно новичку.
Спасибо.
20-10-2010 18:20
В общем я прочитаю все что у вас есть на сайте, только вот у нас в университете TASM , преподают для 8086.
Но всеравно вы молодцы что сделали эти уроки!
20-10-2010 22:16
Синтаксис TASM не сильно отличается.
ИМХО изучать лучше всё-таки FASM, он активно развивается.
TASM уже давно не обновляется и врядли будет.
21-10-2010 02:39
Спасибо большое, очень интересно написано, а на парах высидеть трудно =)))
P.S. Мы тоже изучаем FASM
21-10-2010 02:52
Пожалуйста 🙂
Это где на FASMe учат, если не секрет?
В своё время я вообще сидел на лекциях по абстрактному ассемблеру. А лабораторные нам можно было писать на любом ассемблере, правда в основном студенты использовали TASM.
27-10-2010 17:39
Высший колледж информатики при НГУ (Новосибирск) — практические занятия по архитектуре ЭВМ у групп программистов =))
27-10-2010 21:30
Серьезно вас учат 🙂
12-11-2010 09:23
Спасибо
24-12-2010 15:36
Отличный сайт!!!! все по уму!!! толь ко вот у меня fasm.exe не запускаеться…. а с fasmw.exe — все нормально…? пробовал други версии качать- такая же, история. Пробую в ОС windows xp (sp3)…. подскажите пожалуйста в чем дело, а то уж очень хочеться преступить к обучению!!!! спасибо!!!!
24-12-2010 18:35
fasm.exe — это консольная версия программы.
26-12-2010 16:50
Вот меня интересует комманда INC
мне нужно обработать комманду нажатия клавиши shift и увеличить переменную x на 1
.wmkeydown:
cmp [wparam],VK_ESCAPE
jne .defwndproc
cmp [wparam],VK_SHFT
jne mov ax, x
inc ax
Я правильно думаю, или мне нужно написать макрос а потом вызывать его:
jne .macros ?
26-12-2010 20:11
jne — это команда условного перехода.
В твоем коде значение wparam сравнивается с константами — кодами клавиш.
mov — это тоже команда, а после jne должно идти имя метки. Тут ошибка.
Как я понял, тебе нужно сделать переход, если значение равно VK_SHFT.
Переход должен быть на кусок кода, который делает инкремент.
(.macros — это не макрос, а скорее всего имя метки.)
Примерно такой код должен получится:
16-01-2011 13:08
Кстати, а что если у меня 64-битный виндоус (XP SP3) ??? сгенерировать 64-битный или 32-битный код ?? попробовал — страшно тормозит сом — файл.
18-01-2011 17:50
Нет, всё равно должен быть 16-битный код. Иначе программа скомпилируется неправильно.
24-03-2012 20:38
Понравилось, сразу видно, что написано не профессорами для профессоров, а живым ЧЕЛОВЕКОМ для таких же ЖИВЫХ ЛЮДЕЙ.
Жалко только,что нельзя скачать этот учебник в одном файле, чтоб можно было спокойо почитать «офлайн».
19-01-2011 22:55
Дело в том что дос-программы и файлы (16-битные) на моём компьютере страшно тормозят (некоторые вообще не работают)…
22-01-2011 21:52
Современные процессоры и ОС давно уже не оптимизированы для выполнения 16-битного кода. Однако, такие простые программы на ассемблере должны работать.
Какой у вас процессор и операционная система?
26-01-2011 00:59
Да, они работают, но тормозят в сотни раз )) Такая простая программа выполняется чуть ли не за 10 секунд ))
ОС : win XP SP3
CPU : Intel Core 2 Duo CPU E7500 2,93GHz (так написано …)
Всё-таки, отличный сайт !!! Спасибо вам за полезные тщательно проработанные статьи ))
26-01-2011 22:49
Странно. Так не должно быть. Возможно, антивирус мешает или что-то еще.
06-02-2011 16:47
Большое спасибо за статьи и за ваш труд! На русском фиг найдешь туториалы для FASM, а тут так всё подробно и грамотно объясняется. =)
10-02-2011 23:20
Благодарю за труд! Было очень приятно читать статью, так как было не уныло , с юмором и кратко. В общем не чего лишнего 😉
01-03-2011 17:27
просто спасение!!!! спасибо за сайт
03-05-2011 21:02
И я благодарю за этот сайт и старания автора! 🙂 Решил серьёзно заняться изучением ассемблера.
18-05-2011 23:03
Молодчина!так держать и продолжать,начало уже отличное)
23-06-2011 07:37
у меня не получается(((
всё правелно компилируется без ошибок но файла proga.com нигде нет!!
всё обыскал что делать?
23-06-2011 16:21
Может у тебя исходник по-другому называется?
23-06-2011 11:43
а что такое 1passes?
23-06-2011 16:23
Это значит, что компилятор выполнил 1 проход по коду. Для такой простой программы достаточно.
Если программа большая и сложная, то FASM компилирует её за несколько проходов, чтобы получить более оптимальный код.
23-06-2011 16:48
спасибо ясно!
23-06-2011 16:50
да я решил ту проблему просто у меня было 2 папки Фасм) и они там перепутались, кароче всё нормаль я разобрался я на 6 курсе уже)
04-10-2011 11:49
странно, запускаю com файл, пишет «отказано в доступе к файлу…»
27-10-2011 00:22
Действительно, странно…
08-11-2011 16:27
А как мне узнать сколько битный код нужно скомпилить Так чтоб он работал без ошибок?
19-11-2011 18:13
спасибо за урок все очень понятно и интересно
02-01-2012 14:18
Можно ли вместо «mov ax,4C00h» писать «mov ah,4Ch»?
13-06-2012 09:55
Нельзя. Регистр ax — 16-битный. Команда «mov ax,4C00h» загружает в регистр ax число 19456, а команда «mov ah,4Ch» загрузит число 76 в регистр ah, при этом в регистре al у нас будет ранее загруженное число FFh, т.е. по факту мы получим в регистре ax 4CFFh .
09-01-2012 04:48
У меня gjckt rjvgbkzwbb почему-то получилось два файла один ASM второй COM, почему так?
07-02-2012 21:19
не могу найти proga.com, у меня windows 7,пробывал на xp sp3 тоже самое.
16-02-2012 23:02
На физтехе молодых первокуров учат FASMу.
11-03-2012 17:31
Благодарен автору. Правда я начал с МАСМ,и забросил по той причине что нечего немог понять. Научился тупо приветствовать мир,скомпилировал несколько код из книги Варфоломея после чего моя мелкософтина сдохла. Буду учится заново.
03-04-2012 12:21
Добрый день, ты, я считаю, довольно далеко продвинулся. Я тоже начал изучать МАСМ32, но даже ничего скомпилировать не смог, я не знаю вообще как пользоваться программой МАСМ32едитор. Т.е. не знаю куда сохранять исходник, и как компилировать. А ты эти стадии, получается прошел.
Подскажи пожалуйста, если можешь.
А вопросы такие:
Куда записывать текст программы? в блокнот я писал, но он как-то не компилируется.
Из этого следует 2-й вопрос: куда его надо сохранять.
и 3й вопрос: как компилировать (какие конкретно действия предпринимать для этого)? Спасибо заранее.
03-04-2012 12:04
Добрый день, конечно читаем и даже очень интересно.
Вот взбрело в голову изучить асемблер, но возникла проблема. Скачал я кучу книг, а там в основном про синтаксис программы, примеры даны. Но, грубо говоря, куда писать текст проги и на какие кнопки нажимать чтобы скомпилировать и вообще какие действия предпринимать работая непосредственно спрограммой — не объяснено. Только у вас тут мне удалось найти такую информацию. Большое спасибо за это, буду изучать и задавать вопросы.
И уже 1-й вопрос: фасм подходит для программирования микросхем?
03-04-2012 12:16
Не мог бы мне кто-нибудь сказать чем отличается ФАСМ от МАСМ, ну конкретно от МАСМ32?
Спасибо заранее.