Информатика: Методические указания к лабораторным работам. Часть 2. Ассемблер, страница 6

Обратите внимание на необходимость сохранения - восстанов­ления регистра DS, если он используется для передачи параметров.

Ввод исходных данных  и  вывод  результата  выполняются в СИ-программе.

4. Порядок выполнения работы

1. Написать  головную  программу  на Си для вызова функции обработки строк, содержащую:

- прототип ассемблерной функции

- ввод исходных данных с подсказками

- вызов ассемблерной функции

- вывод результата работы функции

2. Написать ассемблерную функцию,  выполняющую действия  в соответствии с приведенным ниже описанием и прототипом.

3. Выполнить компиляцию и компоновку программы и произвес­ти ее отладку.

Задания к лабораторной работе.

Вариант 1.

Написать функцию,  выполняющую ввод строки с клавиатуры с эхо-печатью .и контролем длины. Прототип функции:

int len = varl(char *buf, int maxlen);

len - действительная длина строки

buf - массив для ввода строки

maxlen - длина массива buf (максимальная длина строки)

Эариаит 2.

Написать функцию для чтения /  установки  системной  даты. Прототип функции:

void var2(int *day, Int *month, Int *year, int flag);

day  - день

month - месяц

year - год                 

flag - Режим работы: 0 -чтение даты, 1 - установка даты

Вариант 3.

Написать функцию для чтения / установки системного  време­ни. Прототип функции:

void var3(int •hour, int.*min. int *sec, int flag);

hour- часы

min - минуты

sec - секунды

flag - Режим работы: 

0 - чтение времени,

1 - установка времени

Вариант 4.

Написать функцию для ввода строки пароля.  Функция  должна вводить строку,  выводя  на  экран  вместо эхо-печати указанный символ. Прототип функции:

int len - var4(char *str, int sym);

len - длина введенной строки

str - буфер для ввода строки

sym - символ-заполнитель для печати

Вариант 5.

Написать функцию для чтения  текущего  каталога.  Прототип функции:

int len = var5(char *dir, char disk);

len - действительная длина инени каталога

dir - буфер для записи имени каталога

disk - символьное обозначение диска ('А', 'В',        ...)

Вариант 6.

Написать функцию для проверки свободного пространства на диске. Прототип функции:

void var6(char disk, int «free, int *sect, int *bytes);

disk - символьное обозначение диска ('А', 'В',        ...)

free - число свободных кластеров

sect - число секторов в кластере

bytes - число байтов в секторе

5. Контрольные вопросы

1. Структура таблицы прерываний

2. Алгоритм выполнения команды INT

3. Общие правила работы с интерфейсом DOS

Лабораторная работа N 5

ОБРАБОТКА АППАРАТНЫХ (АСИНХРОНИЫХ) ПРЕРЫВАНИЙ.

1. Цель работы

Ознакомиться с функциями DOS, связанными с установкой век­тора прерываний.  Ознакомиться с особенностями написания  подп­рограмм обработки прерываний.

2. Краткие теоретические сведения

Для установки нового вектора Прерывания используется функция 25Н прерывания INT 21H. Предварительно в пару DS:DX необхо­димо повестить адрес подпрограммы - нового обработчика прерыва­ний, а в регистр AL - номер перехватываемого вектора.

Структура подпрограммы обработки прерываний имеет ряд осо­бенностей. Основные изних:

- обязательное сохранение и восстановление всех используе­мых регистров;

- обязательная установка регистра DS

- использование обращений к DOS при обработке  асинхронных прерываний в большинстве случаев невозможно. Можно использовать только обращения к BIOS.

- возврат из подпрограммы выполняется командой IRET

Пример реализации подпрограмм установки вектора и обработ­ки прерываний приведен ниже.

.MODEL small,с       

    .286                              ;разрешение использования

;PUSHA,  РОРА

    EXTRN sym:ВУТЕ          ;глобальные данные из си-программы

    .CODE

new_int PROC FAR       ;обработчик прерывания

         PUSHA                             ;сохранение всех регистров

MOV AX, SEG sym                ;установка нужного значения

MOV DS, AX                           ;сегментного регистра

;

;                            Здесь реализуется обработка прерываний

;

РОРА                                      ;восстановление всех регистров

IRET                                      ;возврат из прерывания

new_int ENDP

;-----------------------------------------------------

setvect   PROC NEAR                              ;процедура установки вектора

PUSH DS