Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Met_Lab2.pdf
Скачиваний:
159
Добавлен:
11.05.2015
Размер:
1.1 Mб
Скачать

3.2. Cинтаксис ассемблерной программы

Алфавит Ассемблера включает большие и малые буквы ленинского алфавита, символ подчеркивания (который также считается буквой), цифры и спецсимволы. По умолчанию, различий между большими и малыми буквами не далается, однакоможно задать опцию компилятора, при которой большие и малые буквы будут различаться. Буквы кириллицы допустимы только в комментариях и в значениях символьных переменных и констант.

Лексемами Ассемблера могут быть ключевые слова, именавводимые пользователем и числа. Имя должно состоять из латинских буквицифр причем первым символом имени должна быть буква. Внутри имени не должно быть пробелов.

Программа на Ассемблере состоит из и команд и директив. Различие между директивами и командами следующее: при компиляции команда непосредственно порождает команду процессора, директива не порождает команд процессора, а служит для описания переменных, задания режимов работы компилятора и проч.

Каждая команда или директива пишется с отдельной строчки исостоит из четырех необязательных полей, отделяемых друг от друга любым количеством пробелов.

Формат команды:

Метка: Мнемокод Операнды ;Комментарий

Формат директивы:

Имя Мнемокод Операнды ;Комментарий

При набивке программы удобно отделять одно поле от другого знаком табуляции, тогда программа будет располагаться в удобночитаемом виде в четыре колонки (хотя это и не обязательно).

3.3. Простейшая программа

Напишем простейшую программу, выводящую на экран сообщение и неформально объясним, как она работает.

1 IDEAL

2MODEL small

3 STACK 256

4DATASEG

5 Message DB 'Hello, World $'

6CODESEG

7

Start:

mov

ax,@data

8

 

mov

ds,ax

9

 

mov

ah,09h

10

 

mov

dx,offset Message

11

Exit:

int

21h

12

mov

ax,4C00h

13

END

int

21h

14

Start

 

Стоящие в левой колонке номера строк частью программы не являются и введены только для облегчения дальнейшего объяснения программы.

Для понимания этой программы необходимо отметить, что в любой программе на Ассемблере необходимо выполнить некоторые действия, не связанные непосредственно с задачей, которую выполняет данная программа, своего рода "накладные расходы". Эти действия связаны, в основном, с организацией сегментной адресации.

38

Приступим к построчному анализу программы: Строка 1: Переводит Turbo Assembler в режим Ideal.

Строка 2: Директива описания модели памяти. Вводит упрощенные директивы управления сегментами.

Строка 3: Резервирует пространство для стека программы (значение в байтах, следующее за директивой).

Строка 4: Начало сегмента инициализированных данных. Допускается также расположение здесь и неинициализированных данных, начальные значения которых неизвестны на момент запуска программы.

Строка 5: Директива db определяет переменную Msg как строку байт и инициализирует ее. Символ $ означает конец строки.

Строка 6: Начало сегмента кода, т.е. части программы, содержащей команды процессора.

Строка 7: Точка начала исполнения программы. Загрузка в AX адреса начального параграфа сегмента данных.

Строка 8: Загрузка в DS адреса начального параграфа сегмента данных из AX. Сразу возникают два вопроса. Почему это (строки 7 и 8) нельзя сделать одной командой? Потому что сегментные регистры можно загрузить только из регистров общего назначения и никаким другим образом. Почему мы таким же образом не загружаем регистры CS и SS? Потому что регистр команд загружается автоматически при запуске программы из DOS, то же самое происходит с регистром стека.

Строки 9-10: Подготовка к вызову 21-го прерывания для вывода сообщения на экран. Для взаимодействия с внешними устройствами (и с видеокартой в том числе), имеются процедуры DOS, оформленные в виде прерываний. Мы будем пользоваться, в основном, прерываниями 10h и 21h. Каждое из этих прорываний представляет собой целое собрание различных процедур, снабженных номерами. При возникновении необходимости взаимодействия с внешним устройствам нужно загрузить в регистр АН номер требуемой процедуры, в другие регистры загрузить данные, необходимые для работы требуемой процедуры и, наконец, вызвать необходимое прерывание, В данном случае мы загружаем в регистр АН номер 09h процедуры вывода строки на экран, а а регистр DX - cмещение начала строки сообщения (значение сегмента будет взято из сегментного регистра DS). Ключевое слово offset является оператором преобразующим операнд Message в ого смещение внутри сегмента данных.

Строка 11: Команда int вызывает прерывание с указанным номером. В Данном случае происходит вывод строки на экран.

Строка 12: Подготовка к вызову 21-го прерывания для завершения программы. Завершение любой программы есть по существу передача управления в другую программу (например в DOS). Такая передача управления также выполняется при помощи 21-го прорыанния процедурой номер 4Ch. Строка 12 может выглядеть и как Exit: mov ah,4Ch. Разницы нет никакой.

Строка 13: Вызов 21-го прерывания для завершения программы. Строка 14: Директива конца программы/точки входа.

39

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]