Учебный курс. Часть 6. Hello, world!
Автор: xrnd | Рубрика: Учебный курс | 16-03-2010 | Распечатать запись
В этой части наконец-то напишем долгожданный «Hello, world!». Теперь почти всё должно быть понятно. Для начала необходимо с помощью директивы db объявить строку, содержащую сообщение «Hello, word!». Лучше сделать это в конце программы, за последней командой, иначе процессор может принять строку за код и попытаться её выполнить.
Для вывода строки используется системная функция DOS. Чтобы напечатать строку, нужно поместить 9 в регистр AH, а в регистр DX поместить адрес строки, которая должна заканчиваться символом ‘$’. Обращение к функциям DOS осуществляется с помощью команды int 21h. Вот код программы:
1 2 3 4 5 6 7 8 9 10 11 | use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h mov dx,hello ;В DX адрес строки. mov ah,9 ;Номер функции DOS. int 21h ;Обращение к функции DOS. mov ax,4C00h ;\ int 21h ;/ Завершение программы ;------------------------------------------------------- hello db 'Hello, world!$' |
В четвёртой строке FASM подставит адрес строки вместо hello. Не трудно догадаться, что завершение программы — это тоже функция DOS с номером 4Ch. Перед её вызовом в регистр AL помещается код завершения программы (ноль соответствует успешному завершению). Можно объединить эти две операции и сразу поместить в AX значение 4C00h.
В учебном курсе я не буду подробно описывать функции DOS, лишь кратко расскажу о тех функциях, которые мы будем использовать. Если вы захотите узнать больше, в Интернете можно найти подробное описание 🙂
Чтобы увидеть работу программы, надо запустить её из командной строки, иначе она печатает строку и сразу закрывается. Или можно написать простенький bat-файл для запуска:
1 2 | hello.com
pause |
Результат работы программы:
Если вы запустите программу в отладчике, то просмотреть выводимую строку можно, нажав Alt+F5 или выбрав в меню Turbo Debuger пункт Window->User Screen.
08-04-2010 21:16
Спасибо, в принципе все понятно 🙂
08-05-2010 22:47
О, есть! В части 6 в последнем предложении я кажется увидел то, что хотел увидеть в части 1 (я писал по e-mail про вирт. машину). Кстати, в рамках этого курса планируется описание работы с железом напрямую?
09-05-2010 17:17
Да, я планирую написать пару статей про порты ввода вывода и прерывания. Однако из под Windows это будет лишь эмуляция прямой работы с железом. Но знать это нужно. В программировании микроконтроллеров на ассемблере полно всяких прерываний и обращений к портам ввода-вывода (Хотя там другой ассемблер, идея та же самая).
14-06-2010 21:31
О, железо это хорошо, жду с нетерпением новых уроков.
15-06-2010 14:49
Постараюсь на этой неделе что-нибудь выложить ) Работы сейчас много, никак не могу найти время.
13-06-2010 11:19
статья класная понятная непонятно только почему 9 помещается имено в регистыр ah а не в al или ax
14-06-2010 14:38
Так нужно 🙂 Для обращения к функциям DOS номер функции должен находится в регистре AH. Затем вызывается прерывание 21h.
25-06-2010 22:47
а где мона найти список таких функций ?
26-06-2010 23:54
Их можно найти в справочнике по функциям дос (есть в разделе "файлы"). Или можно поискать в каком-нибудь гугле 🙂
27-06-2010 23:07
а под виндоус они работают или там другой справочник
03-07-2010 01:51
Под виндоус они работают, но только во встроенном эмуляторе для ДОС-программ. Если программа будет на ассемблере под виндоус, то в ней никакие прерывания вызывать нельзя и этих функций там не будет.
03-07-2010 19:07
а имено для виндоус есть какиенибудь функции? ведь виндоус работает в защищеном режими и биос прерывания не разрешены
03-07-2010 19:55
Для Windows есть функции API.
03-07-2010 20:06
а как в асемблере их использовать
04-07-2010 22:49
Они вызываются как функции библиотек kernel32.dll, user32.dll и некоторых других.
03-07-2010 19:11
извени не знал где написать но напишу сдесь плиз сделай форум под свой сайт. если проблемы в том что не можешь сам сделать то помогу. очень интересно будет принять участие в его развитие))) ведь таких нормальных сайтов по fasm практически нету.
03-07-2010 19:56
Спасибо. У меня была идея сделать форум, но я как-то до неё ещё не добрался. Если форум действительно нужен, надо этим заняться. Как сделать я разберусь.
27-01-2011 20:10
Да, классная идея, только сейчас ещё не время создавать форум ))
Ассемблер изучать долго, учебный курс может продлиться огогого аж до двухсот статьей, и нам нечего торопиться создавать форум.
Когда уже соберётся достаточно статьей, тогда и будем создавать форум и поднимать там разные интерестные проблемы и проэкты ))
03-07-2010 19:18
еще также из-за отсутствия форума спрошу тут. я начинаю писать свою ОС причин много например для использования ее в лич. целях ну и для совершенствавония знаний в fasm. проблема в том что когда компилирую код поивляется фаил bin и я совсем не знаю че с ним делать. разве биос прочитает такой фаил?
03-07-2010 19:59
Свою ОС написать очень сложно и требуется много времени. По идее у ОС должен быть загрузчик, который помещает код в нужную область памяти, переключает режим работы процессора и т.д.
03-07-2010 20:06
да все ето есть я написал загрузчик тока из кода выходит bin фаил а че с ним делать не знаю
13-06-2012 11:25
Думаю в данном случае не стоит изобретать велосипед. Т.к. ОС на fasm’е уже пишут: МенуэтОС или лучше отечественный форк КолибриОС. Там уже не мало продвинулись в этом направлении.
03-07-2010 19:19
дай плиз icq или mail у нас может получится хороший форум)))
03-07-2010 19:58
у меня есть время могу помочь я просто ногу ушиб сижу дома время свободного много так что можеим общими усилиями сделать форум приличный.
13-12-2010 18:47
Привет, xrnd…
получается как то так, почти, но не совсем как на рис.:
C:\fasmw>hello.com
Hello, world!
C:\fasmw>pause
Для продолжения нажмите любую клавишу . . .
;или это не имеет к.-либо значение…?
а вобщем, Твои уроки (со справочником DOS) беру за Основу, довольно удобно и понятно…) Спасибо за помощь…
13-12-2010 20:04
На скриншоте я набрал имя команды вручную в консоли, поэтому немного отличается.
Но смысл тот же 🙂
13-12-2010 20:07
В скором времени я планирую покончить с досом и заняться программированием под Windows.
14-12-2010 18:37
Я тоже надеюсь покончить с Досом через 24 урока…, и продолжить вслед за тобой… а Тебе удачи…)
05-03-2011 14:52
Супер! спасибо!
15-05-2011 13:54
У меня есть програма, в которой в нескольких местах выводятся разные сообщения на окно консоли. Везде выводится всё правильно кроме одного места, где, почемуто, выводит символ конца строки — знак $. Синтаксис для вывода строки в програме везде одинаковый. Подскажите в чём здесь может быть ошибка. Заранее благодарю.
15-05-2011 15:02
Без исходника трудно сказать.
13-01-2012 08:45
Спасибо за статьи, очень доходчиво объяснено. Еще хочется спросить а вы будите создавать статьи для компилятора TASM, или может будет статья как перейти с FASM к TASM. Просто препод в институте требует именно компилировать в TASM.
19-01-2012 18:23
Не запускается в WinXP.
Скомпилировал, появляется cmd’шное окно, висит.
19-01-2012 18:24
Не запускается в WinXP.
Скомпилировал, появляется cmd’шное окно, висит.
21-04-2012 17:34
Установи Proffesional)))
19-01-2012 18:27
Ой, извините 😀
Ошибся)
14-02-2012 00:07
use16
org 100h
hello db ‘Hello, World$’
mov dx,hello
mov ax,9
int 21h
mov ax,4c00h
int 21h
сделал батник,запустил,всё равно выводит пустую строчку (
14-02-2012 00:17
может следует инициализировать выводимую строку как
‘Hello, World’, 0Dh, 0Ah, ‘$’ ?
13-06-2012 11:44
0Dh, 0Ah — включают чтобы перейти на новую строку это коды CR и LF.
16-03-2012 15:52
Похоже данные надо вводить после кода завершения программы.
Хотя думаю, что-от должно быть, что позволит обойти такой порядок. Может какие директивы надо прописывать, чтобы вводились до начала первой строки mov.
07-06-2012 00:06
mov AH,9 ;»Так нужно Для обращения к функциям DOS номер функции должен находится в регистре AH. Затем вызывается прерывание 21h.»
13-06-2012 11:31
Удивительно было бы, если данный код нормально заработал. Строчка hello db ‘Hello, World$’ будет расценена как код. Чтобы этого не было надо перепрыгнуть данные:
;…
jmp kod
hello db ‘Hello, World$’
kod:
; ….
16-03-2012 21:52
По этой теме есть вопрос.
После выполнения команды int 21, в регистре AX вместо значения 0900 отображается 0924.
Откуда значение 24 попадает в регистр AL ?
16-03-2012 22:27
Значение 24 — есть возврат кода символа $
Я правильно понял ?
13-06-2012 11:47
Вообще вункция 09h int21h не должна ничего возвращать, но возвращает во всяком случае в эмуляторе winXp.
21-04-2012 17:32
я не пойму в 1 или 2 уроке вы привели таблицу с регистрами POH, Сегментные, Индексные регистры, и т.д Но про регистр DX вы нечего ну упомянули. У меня вопрос что это за регистр? о_О
30-04-2012 16:11
andrew
Дело в том, что тебе нужно обратиться не к адресу, а к содержимому ‘переменной’ hello. Т.е правильно будет так:
use16
org 100h
hello db ‘Hello, World$’
mov dx,[hello]
mov ax,9
int 21h
mov ax,4c00h
int 21h
30-04-2012 22:24
Извиняюсь, попутал)
30-04-2012 22:28
use16
org 256
hello db ‘Hello, World $’
mov dx, hello
mov ah,9h
int 21h
mov ah,10h
int 16h
int 20h
11-01-2013 20:05
a eta proga na chujom kompe budet rabotat ??
32 ili 64 ??
ili DOS box nujen budet ?
i eshe , esli v PE skompilirovat to budet na vsex processorax rabotat ??