Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 88; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.3 (0.007 с.) |