Программные прерывания и системные вызовы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Программные прерывания и системные вызовы



Операционная система MS DOS, как известно, является однозадачной операционной системой, т.е. одновременно может исполнять только одну задачу. Вместе с тем имеется необходимость во время выполнения основной задачи производить некоторые вспомогательные действия. Подход, основанный на предварительной загрузке резидентных программ, использованный в аппаратных прерываниях, которые можно вызывать в момент выполнения основной программы, например, переключение раскладки клавиатуры или обращение к дисководу, оказался очень продуктивным, так как делает MS DOS псевдомногозадачной системой.

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

Команда вызова программного прерывания имеет вид

int <номер прерывания>

<номер прерывания> - число, обычно шестнадцатеричное, в диапазоне 00 h0 FFh, определяет адрес вызываемой резидентной программы.

Некоторые резидентные программы, выполняющие низкоуровневое общение с периферийными устройствами записаны в ROM BIOS (Read Only Memory Base Input/Output System) и поставляются вместе с системной платой, например, учёт системного времени, форматирование секторов на дорожке диска и т.д., и не зависят от применяемой операционной системы.

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

Наибольшее число различных системных функций в MS OS сосредоточено в резидентной программе с номером прерывания 21 h – диспетчер функций MS DOS. В зависимости от значения, содержащегося при вызове прерывания в регистре ah, MS DOS выполняет одну из нескольких десятков функций MS DOS.

Все функции BIOS и DOS описаны в специальных справочниках с указанием для каждой функции набора входных и выходных параметров, передаваемых через регистры, а также перечнем возможных ошибок. В данной главе будут описаны функции прерывания 21 h относящиеся к работе с клавиатурой и экраном ВМ.

Описание функций работы с клавиатурой и дисплеем диспетчера функций MS DOS

Для вызова функции прерывания DOS 21h необходимо проделать следующие действия:

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

2. занести номер функции в регистр а h;

3. подготовить другие регистры (если это необходимо);

4. написать команду int 21h;

5. прочесть результаты или состояние из регистров, указанных в описании данной функции.

Ниже следует описание некоторых функций.

Функции 01Н

Выполняет ввод с клавиатуры одного символа и отображает его на экране.

· Вызов: ah = 01h

· Возвращаемое значение: а l = код ASCIIвведенного символа

· Примечание. Введенный символ отображается на экране (выполняется эхо-отображение). Комбинация клавиш Ctrl/С (или Ctrl/Break) прекращает выполнение программ пользователя.

Функции 02Н

Выполняет отображение символа на стандартный вывод (дисплей).

· Вызов:

ah = 02h

dl = отображаемый символ

· Возвращаемое значение: нет

· Примечание. Символ отображается на стандартный вывод. Комбинация клавиш Ctrl/C (или Ctrl/Break) прекращает выполнение программ пользователя.

Функция 09Н

Выполняет отображение строки на стандартный вывод.

· Вызов:

а h = 09Н

ds: dx = указатель на отображаемую строку

· Возвращаемое значение: нет

· Примечание: Строка отображается на стандартный вывод. $ признак конца строки, $ не отображается, dx содержит смещение строки, ds- сегментный адрес. Ниже приведены код управления курсором:

0dh (13) - перевод курсора в начало текущей строки;

0ah (10) - перевод курсора вниз на 1 строку;

08h (8) - перевод влево на 1 позицию;

07h (7) - звонок.

Пример.

Чтобы вывести на экран с новой строки текст: “Функция 09Н для выдачи текста на экран” и затем перевести курсор в следующую строку, следует в сегменте данных описать строку:

beg db 0dh, 0ah, “Функция 09 Н для выдачи текста на экран”, 0 dh,0 ah, “$”

а в программном сегменте записать команды:

              lea dx,beg      ; адрес строки в dx

mov ah,09h             ; номер функции в а h

              int 21h      ; вызов функции

Функция ОАН

Выполняет ввод с клавиатуры в буфер строки символов.

· Вызов:

аh= 0аh

ds: dx = адрес буфера ввода

· Возвращаемое значение:

Строка символов по указанному адресу

· Примечание. Читается со стандартного ввода. dx содержит смещение буфер вывода, DS - сегментный адрес. Буфер вывода имеет следующую структуру: 0-й байт содержит максимальное количество символов в буфере; 1-й байт содержит количество реально введенных символов; начиная со 2-го размещён буфер для ввода размером не менее указанного в в 1-м байте. Выполняется эхо-отображение. Комбинация клавиш Ctrl/C (или Ctrl/Break) прекращает выполнение программы пользователя. Символы вводятся один за другим, до тех пор, пока не будет введен код ODh (код клавиш Enter”), завершающий строку. В ходе ввода строки пользователь может редактировать строку, и, в частности, использовать «забой».

Пример.

Пусть требуется ввести строку длиной не более 10 символов. При этом в сегменте данных можно описать буфер, например, таким образом:

buffer     db 11         ; Нулевой байт буфера

entered   db?            ; Число введенных символов

string              d b 11 dup (?); Введенные символы

 

Ввод выполняется командами:

        lea dx, buffer; Адрес буфера в dx

mov ah, 0ah; Номер функции в аh

              int 21h           ; Вызов функции

Функция 0Bh

Выполняет опрос состояния буфера клавиатуры.

· Вызов:

ah = 0Bh

· Возвращаемое значение:

аl = 00h, если нет символа в буфере клавиатуры;

al = ffh, если есть символ в буфере клавиатуры.

· Примечание. Устанавливает значение AL в зависимости от наличия символов в буфере клавиатуры. Часто используются в задачах, действующих при нажатии определенных клавиш. Комбинация клавиш Ctrl/ (или Ctrl/Break) прекращает выполнение программы пользователя.

 Пример выполнения работы

Ввести строку с клавиатуры, посчитать, сколько и каких десятичных цифр имеется во введенной строке, посчитанные значения вывести на терминал.

Текст программы:

. model small

.data

COUNT db 10 dup (0)              ; счетчик количества цифр

CIFR               db ‘0123456789ABCDEF’    ; таблица преобразования цифр

IN_STR db 80,?, 82 dup (?)    ; буфер ввода

OUT_STR db 0Dh, 0Ah,?,’-‘,?,?,’$’; буфер вывода

.code

START: mov ax, @data

              mov ds, ax    ; Загрузить сегментный адрес данных

        ; Ввод строки

             lea dx, IN_STR

             mov    ah, 0ah

             int 21h

; Обработка

              xor ah, ah   ; обнуление старшего байта AX

              lea bx, IN _ STR +2; адрес начала введённой строки

        xor cx, cx

              mo v cl, IN_STR+1; количество введенных символов

ВВ:        mov al, [BX]; очередной символ строки

cmp al,’0’              ; код символа меньше чем код нуля?

jb NC        ; да, не цифра

              cmp al, ‘9’   ; код символа больше чем код девяти

ja NC        ; да, не цифра

; символ - десятичная цифра

sub al, ‘0’   ; преобразуем ASCII код в число

mov si, ax              ; индекс в массиве счетчиков COUNT

              inc COUNT[si]    ; увеличиваем счетчик цифр

NC:       inc bx        ; получить очередной символ строки

              loop BB

; Вывод результатов

mov cx, 10

lea b x, CIFR; адрес таблицы преобразования цифр в ASCII

xor si, si       ; номер выводимой цифры

OUT:     mov al, ‘0’

              add ax, si    ; ASCII код очередной цифры с номером в si

              mov OUT_STR+2, al; в буфер вывода

mov dl, COUNT[si]; читать количество цифр с номером в si

     mov al, dl

push cx           ;временное сохранение cx

mov cl, 4      ; сдвиг на четыре

shr al, cl     ; выделить старшую цифру

              xlat                ; ASCII старшей цифры в al

              pop cx     ; восстановление cx

        mov OUT_STR+4, al; в буфер вывода

              mov al, dl     ; восстановить количество цифр в al

              and al,00001111 b  ; выделить младшую цифру

              xlat                  ; ASCII младшей цифры в al

            mov     OUT _ STR +5, al; в буфер вывода

lea dx, OUT_STR; подготовка к выводу строки

mov ah, 09h; номер функции

              int 21h       ; вывод строки

              inc si           ; Счетчик очередной цифры

              loop OUT

QUIT:   mov ax, 4C00h; Код завершения 0

              int 21h    ; Выход в DOS

end START



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 30; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.193.129 (0.019 с.)