- •1. Основы программирования для dos 9
- •1.1.7. Средства bios 21
- •2. Приемы системного программирования 57
- •Введение
- •1.Основы программирования для dos
- •1.1. Структура и выполнение программ в dos
- •Программа типа сом
- •Программа типа ехе
- •1.2.Использование служебных функций dos и bios
- •1.3.Вывод на экран в текстовом режиме
- •Средства dos
- •Средства bios
- •Выбор видеорежима
- •Управление положением курсора
- •Вывод символов на экран
- •Прямая работа с видеопамятью
- •1.4.Ввод с клавиатуры
- •Средства dos
- •Средства bios
- •1.5.Графические видеорежимы
- •Работа со стандартными графическими режимами
- •Работа с svga-режимами
- •(Продолжение таблицы 4)
- •(Окончание таблицы 4)
- •1.6.Работа с мышью
- •1.7.Другие устройства
- •Системный таймер
- •Последовательный порт
- •Параллельный порт
- •1.8.Работа с файлами
- •Создание и открытие файлов
- •Чтение из файла и запись в файл
- •Закрытие и удаление файла
- •Поиск файлов
- •Управление файловой системой
- •1.9.Управление памятью
- •Обычная память
- •Область памяти umв
- •Область памяти нма
- •Интерфейс ems
- •Интерфейс xms
- •1.10.Организация процессов
- •Запуск программ на выполнение
- •Переменные окружения
- •Командные параметры
- •2.Приемы системного программирования
- •2.1.Управляющие структуры
- •Структуры if... Then... Else
- •Структуры case
- •Конечные автоматы
- •2.2.Процедуры и функции
- •Передача параметров
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по возвращаемому значению
- •Передача параметров по результату
- •Передача параметров по имени
- •Передача параметров отложенным вычислением
- •Передача параметров в регистрах
- •Передача параметров в глобальных переменных
- •Передача параметров в стеке
- •Передача параметров в потоке кода
- •Передача параметров в блоке параметров
- •Локальные переменные
- •2.3.Обработка прерываний
- •Обработчики прерываний
- •Прерывания от внешних устройств
- •Взаимодействие прикладных и системных обработчиков прерываний
- •2.4.Резидентные программы
- •Системные средства организации резидентных программ
- •Взаимодействие с резидентной программой
- •2.5.Драйверы устройств в dos
- •Литература
2.2.Процедуры и функции
В языке ассемблера, как и во многих других процедурных языках (С, Pascal, Fortran, BASIC), часто используются подпрограммы — блоки кода программ, которые могут вызываться из основной программы. Вызов подпрограммы представляет собой запоминание адреса точки вызова и переход к точке входа в подпрограмму. Подпрограммы имеют одну точку входа и одну точку выхода и в точке выхода содержат команду возврата управления в точку вызова (с использованием запомненного адреса). Вызов подпрограммы может осуществляться командами CALL и INT процессора, а возврат из подпрограммы — соответственно командами RET и IRET. Адрес возврата в обоих случаях сохраняется в стеке основной программы (в первом случае это одно либо два слова с адресом возврата, во втором — два слова с адресом возврата и байт флагов процессора).
При программировании на ассемблере под DOS подпрограммы, вызываемые командой CALL принято называть процедурами, а вызываемые с помощью команды INT — функциями (точнее, обработчиками программных прерываний, вызывающими функции). Принципиального же различия между процедурами и функциями в ассемблере не делается.
Вызовы процедур, как и переходы, классифицируются следующим образом:
по относительному расположению процедуры и точки ее вызова:
ближние вызовы (внутрисегментные) — для процедур в текущем сегменте;
дальние вызовы (межсегментные) — для процедур за пределами текущего сегмента;
по способу определения адреса вызова:
прямые вызовы — когда адрес вызова указывается как непосредственное значение (чаще — метка или имя процедуры) и включается в код команды вызова;
косвенные вызовы — когда адрес вызова располагается в регистре или ячейке памяти, указываемой в команде вызова;
по способу формирования адреса вызова:
относительные вызовы — когда адрес формируется как сумма текущего содержимого указателя команд (IP) и смещения в команде;
абсолютные вызовы — когда указанный адрес вызова просто загружается в указатель команд IP.
(примеры)
Вызовы различных видов организуются с помощью различных способов указания операнда команды CALL, а также благодаря различным машинным форматам команды CALL.
Возврат из процедуры выполняется командой RET по адресу из стека программы — одно слово для ближней процедуры (RETN) и два — для дальней (RETF).
Передача параметров
Как процедуры, так и функции в языке ассемблера могут получать или не получать параметры из вызывающей программы и могут возвращать или не возвращать результаты.
Параметры можно передавать с помощью одного из шести механизмов:
• по значению;
• по ссылке;
• но возвращаемому значению;
• по результату;
• по имени;
• отложенным вычислением.
Параметры можно передавать в одном из пяти мест:
• в регистрах;
• в глобальных переменных;
• в стеке;
• в потоке кода;
• в блоке параметров.
Так что всего в ассемблере возможно 30 различных способов передачи параметров для процедур. Рассмотрим их по порядку.
Передача параметров по значению
Процедуре передается собственно значение параметра. При этом фактически значение параметра копируется, и процедура использует его копию, так что модификация исходного параметра оказывается невозможной. Этот механизм применяется для передачи небольших параметров, таких как байты или слова.
Например, если параметры передаются в регистрах:
mov ax, word ptr value ; сделать копию значения
call procedure ; вызвать процедуру