- •1.1.1. Кодирование символов
- •2. Системный отладчик Debug
- •2.1. Адресация памяти
- •2.2. Работа в отладчике
- •Лабораторная работа № 1
- •3. Основы программирования
- •3.1. Процесс программирования
- •3.1.1. Этапы создания программы
- •3.1.2. Компиляция программы. Опции командной строки
- •3.2. Cинтаксис ассемблерной программы
- •3.3. Простейшая программа
- •3.4. Скелет (каркас) программы
- •3.4.1. Модуль EXE
- •3.4.2. Модуль COM
- •3.5. Образ программы в памяти
- •3.5.1. Модуль EXE
- •3.5.2. Модуль COM
- •3.6. Работа с отладчиком Turbo Debugger (TD)
- •Лабораторная работа №1
- •4. Операторы и директивы
- •4.1. "Препроцессорные" директивы INCLUDE и EQU
- •4.2. Директивы описания и инициализации переменных DB, DW и DD
- •4.2.1. Директива DB (Define Byte - определить байт)
- •4.2.2. Директивы DW и DD (Define Word и Define Double Word)
- •4.3. Операторы Assembler
- •4.3.1. Операторы обработки данных
- •4.3.2. Операторы передачи управления
- •4.4. Вспомогательные псевдооператоры
- •4.5. Работа с макрооператорами
- •Лабораторная работа № 2
- •4.6. Приложение к лабораторной работе № 2. Адресация
- •4.6.1. Форматы машинных команд и их кодирование
- •4.6.2. 16-битный режим адресации операндов в памяти
- •5. Сервисные функции DOS
- •5.1.1. Ввод с клавиатуры символьной информации
- •5.1.2. Системные функции DOS ввода данных с клавиатуры
- •5.1.3. Команды работы со строками
- •5.1.4. Системные функции DOS вывода данных
- •Лабораторная работа №3
- •Лабораторная работа №4
- •6. Функции BIOS для работы с экраном и клавиатурой
- •6.1. Прямое программирование видеобуфера в текстовом режиме
- •6.2. Прерывание 10h. Видеофункции BIOS
- •6.3. Прерывания 16h, 1Ah, 15h
- •6.3.1. Прерывание 16h
- •6.3.2. Прерывание 1Ah
- •6.3.3. Прерывание 15h
- •Лабораторная работа №5
- •Заключение
- •Рекомендуемая литература
- •Использованная литература
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