Краткие теоретические и учебно-методические материалы по теме практической работы




Для организации работы с подпрограммами используются команды CALL и RET. Команда CALL address предназначена для организации обращения к подпрограмме расположенной по адресу address (с автоматическим сохранением адреса возврата в стеке). Команда RET применяется для возврата из подпрограммы в основную программу, при этом адрес возврата берётся с вершины стека.

Для передачи входных параметров в подпрограмму и выходных в программу существует несколько способов. Чаще всего передача параметров осуществляется через регистры или через стек. При передаче через регистры перед вызовом подпрограммы параметры заносятся в регистры процессора, а после возврата вызывающая программа забирает из регистров значения результатов. При передаче через стек, параметры перед вызовом подпрограммы заносятся в стек.

Подпрограмма во время выполнения использует регистры процессора. Значения, которые в них хранились, могут ещё понадобиться основной программе. Поэтому каждая подпрограмма обязана сохранить значения регистров перед началом их использования, а после завершения работы перед возвратом восстановить их прежние значения. Для сохранения регистров используется стек.

Команда PUSH служит для занесения содержимого 16-разрядного источника (машинного слова) в стек. Источником могут быть РОН, индексный регистр, сегментный регистр, ячейка памяти. Выполнению команды предшествует автоматически выполняемое действие (SP)←(SP)-2.

Команда POP извлекает 16-разрядный операнд из стека и пересылает его в место назначения, указанное в команде – РОН, индексный регистр, сегментный регистр, ячейку памяти. После извлечения операнда из стека МП автоматически формирует новый адрес вершины стека, выполняя действие (SP)←(SP)+2.

Каждая подпрограмма должна содержать равное количество команд PUSH и POP. При этом возврат значений в регистры осуществляется обратно записи:

PUSH DX

PUSH BX

POP BX

POP DX.

Для обработки особых состояний ЦП необходимо прервать выполнение текущей программы и перейти к выполнению подпрограммы обслуживания прерывания. После её завершения ЦП возвращается к прерванной программе и продолжает её выполнение.

За каждым прерыванием закрепляется его номер. В начальных адресах оперативной памяти располагается особая структура данных – таблица векторов прерываний (ТВП). Каждый вектор – это полный адрес начала подпрограммы обработки соответствующего прерывания, состоящий из адреса сегмента и смещения, занимающий 4 байта.

Получив команду вызова прерывания (например, INT 10h), ЦП сохраняет в стеке полный (CS, IP) адрес очередной команды в прерванной программе, затем там же сохраняет регистр FLAGS, сбрасывает флаги IF и TF, после чего обращается к ТВП и, основываясь на номере прерывания, извлекает из ТВП адрес подпрограммы обработки. Далее ЦП выполняет эту подпрограмму (и тем самым обслуживает прерывание), пока ему не встретится команда IRET (возврат из прерывания). По этой команде ЦП восстанавливает из стека сохранённый ранее адрес (а также и регистр FLAGS) и возвращается к продолжению прерванной программы.

Разница между обычным вызовом подпрограммы (командой CALL) и вызовом подпрограммы через механизм прерываний (командой INT) состоит в следующем. При пользовании командой CALL программист обязан знать адрес начала подпрограммы, в то время как при вызове прерывания знать этот адрес совершенно не нужно – нужен лишь номер соответствующего прерывания. Это удобно при вызове различных сервисов операционных систем (ОС). Ряд ОС, в том числе и MS-DOS-подсистема ОС Windows, содержат в себе большое количество стандартных подпрограмм обслуживания клавиатуры, мыши, дисплея, дисковых устройств, COM- и LPT-портов и т.д.

Команды RET (возврат из подпрограммы) и IRET выполняют различные действия и не являются взаимозаменяемыми.

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

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

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

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

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

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

- занести номер функции в регистр АН;

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

- написать команду INT 21h;

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

 

Таблица 10.1 – Описание функций прерывания 21h

Номер функции Описание Параметры вызова Возвращаемое значение
01h Ввод с клавиатуры одного символа и отображение его на экране АН = 01h AL = код ASCII введенного символа
02h Отображение символа на стандартный вывод (дисплей) АН = 02h DL = отображаемый символ нет
05h Отображение символа на принтер Функция не возвращает ошибки состояния принтера. АН = 05h DL = символ для принтера нет
07h и 08h Выполняет ввод с клавиатуры одного символа. Введенный символ не отображается на экране АН =07h или АН =08h AL = код ASCIL введенного символа
09h Выполняет отображение строки на стандартный вывод. $ – признак конца строки (не отображается). АН = 09Н DS:DX = адрес отображаемой строки нет
ОАh Выполняет ввод с клавиатуры в буфер строки символов. Символы при этом отображаются на экране. Символы вводятся один за другим, до тех пор, пока не будет введен код ODh (код клавиши Enter), завершающий строку. При вводе пользователь может редактировать строку АН = 0Ah DS:DX = адрес буфера ввода строка символов по указанному адресу
0Bh Выполняет опрос состояния буфера клавиатуры. Устанавливает значение AL в зависимости от наличия символов в буфере клавиатуры. Часто используются в задачах, действующих при нажатии определенных клавиш. АН = 0Bh AL = 00h, если нет символа в буфере клавиатуры; AL = FFh, если есть символ в буфере клавиатуры.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: