Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Программные прерывания и системные вызовыСодержание книги
Поиск на нашем сайте
Операционная система MS DOS, как известно, является однозадачной операционной системой, т.е. одновременно может исполнять только одну задачу. Вместе с тем имеется необходимость во время выполнения основной задачи производить некоторые вспомогательные действия. Подход, основанный на предварительной загрузке резидентных программ, использованный в аппаратных прерываниях, которые можно вызывать в момент выполнения основной программы, например, переключение раскладки клавиатуры или обращение к дисководу, оказался очень продуктивным, так как делает MS DOS псевдомногозадачной системой. Вызовы резидентных программ, адрес которых заранее известен процессору, стали называть, по аналогии с аппаратными прерываниями, программными прерываниями, хотя никаких прерываний на самом деле не происходит. В систему команд процессора ввели команду вызова программного прерывания, которая вызывает соответствующую резидентную программу. Команда вызова программного прерывания имеет вид int <номер прерывания> <номер прерывания> - число, обычно шестнадцатеричное, в диапазоне 00 h – 0 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; просмотров: 46; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.148.105.127 (0.008 с.) |