Главная /
Ассемблер /
Для чайников /
Введение в Ассемблер /
Hello World на Ассемблере
После примеров простых программ на Паскале и
С++ вы, наверно, не ожидали что я сразу перепрыгну на Ассемблер. Но вот перепрыгнул. И сегодня мы поприветствуем мир на языке ассемблера.
Итак, вот сразу пример, а потом его рассмотрим:
.model tiny
.code
ORG 100h
begin:
MOV AH, 9 ; Функция вывода строки на экран
MOV DX, OFFSET Msg ; Адрес строки
INT 21h ; Выполнить функцию
RET ; Вернуться в операционную систему
Msg DB 'Hello, World!!!$' ; Строка для вывода
END begin
Как видите, программа на ассемблере, даже такая простая, содержит исходный текст значительно большего размера по сравнению с аналогичной программой на С++, а уж тем более на Паскале.
С другой стороны, это не так уж и страшно, как иногда думают те, кто никогда не программировал на Ассемблере.
Во всех подробностях разбирать этот код не будем - подробности в другой раз. Рассмотрим только основные инструкции.
Программа начинается с метки begin
. В отличие, например, от Паскаля, это слово может быть каким угодно,
например, start
. Это всего лишь метка, которая обозначает начало какого-то участка кода.
К конце программы мы видим END begin
. Инструкция END
говорит ассемблеру,
что следующее за ней слово означает конец блока кода, обозначенного этим словом. В нашем примере это означает,
что здесь кончается блок кода, начинающийся со слова begin
.
Далее уже начинается программа. Сначала в регистр АН мы записываем номер функции, которую собираемся потом выполнить. Номер 9 - это функция BIOS, которая выполняет вывод на устройство вывода. По умолчанию это монитор.
Затем в регистр DX мы записываем адрес строки. Адрес вычисляется с помощью оператора OFFSET
. Например:
OFFSET Msg
Здесь мы получаем адрес первого байта блока данных, обозначенного идентификатором Msg
.
Затем мы вызываем прерывание 21h
. Это прерывание выполняет функцию, номер которой записан в регистре АН. Поскольку у нас там записана функция 9, то прерывание выведет на экран строку.
Команда RET
выполняет выход из процедуры или из программы. В нашем случае из программы. Таким образом программа завершается и мы возвращаемся в операционную систему.
Ещё несколько слов об объявлении строки:
Msg DB 'Hello, World!!!$'
Вначале мы записываем идентификатор (в нашем случае Msg
, но может быть и любой дугой),
чтобы было проще работать со строкой. Затем пишем DB - Define Byte - Определить Байт. В нашем случае это будет массив байтов, в котором каждый элемент имеет размер один байт.
Потом пишем саму строку. Каждый символ занимает один байт, поэтому мы и объявили массив байтов. Знак доллара означает конец строки. Так функция вывода понимает, где она должна завершить вывод. Если этот знак не поставить, то будет выведено множество символов - сначала наша строка, а потом разный мусор, содержащийся в ячейках памяти, следующих за нашей строкой. А в эмуляторах это вообще может считаться ошибкой и вывода не будет.
Ну вот мы и написали свою первую программу на языке ассемблера. Если что-то пропустили, то посмотрите видео: