После вы-
полнения функции подпрограмма EXRTL возвращает управление в под-
программу RTL_TEST по инструкции IRET (Return from Interrupt -
возврат из прерывания).
Стековая структура frame (смотри листинг 3-5) также обеспечи-
вает подпрограмме EXRTL доступ к флажкам вызывающей программы,
которые хранятся в стеке рядом с вектором. Путем копирования
флажков из стека в свой собственный регистр флажков подпрограмма
EXRTL может изменить значение бита переноса; затем, перед выхо-
дом, она может скопировать флажки обратно в стек (включая новое
значение флажка переноса).
Эти операции позволяют подпрограмме
EXRTL использовать флажок переноса для сигнализации условий ошиб-
ки для вызывающей программы, используя инструкцию IRET для восс-
тановления флажков из стека.
Листинг 3-6. Выполнение программы для RTL
----------------------------------------------------------------
;====== RTL_TEST.ASM - Этот файл вырабатывает .COM файл ========
V_NUM EQU 40h ; эта RTL использует вектор 40h
INCLUDE STDMAC.INC ; включение файла макробиблиотеки
;====== СЕКЦИЯ ПРОГРАММНОГО КОДА ===============================
code_seg SEGMENT
ASSUME cs:code_seg
ASSUME ds:code_seg
main PROC FAR
ORG 0100h
start: mov cx,3 ; начало при неправильном значении
loop: push cx ; код функции
int V_NUM ; вызов RTL
pop cx ; очистка параметра возврата
jnc nxt ; переход, если ошибки нет
@DisStr caserr ; показать ошибку
nxt: dec cx
jge loop ; цикл через 0
mov ah,4Ch ; завершение процесса
@DosCall
caserr db 'Case Error - Illegal Function Code',CR,LF,'$'
main ENDP
code_seg ENDS
END start
- 3-41 -
Последний вопрос, насколько полно может использовать подпрог-
рамма EXRTL операционную систему MS-DOS, когда получает управле-
ние непосредственно из другой программы? В некоторых других рези-
дентных программах, представленных в следующих разделах этой
книги, это происходит не так.
антивирус panda, офисные программы, nod32, программа резервного копирования, операционные системы windows, .
1с бухгалтерия
Операция установки очень проста: в регистр AL зано-
сится номер вектора, а адрес для загрузки в вектор заносится в
пару регистров DS:DX (сегмент:смещение). В связи с тем, что в
программах типа .COM регистр DS устанавливается в то же самое
значение, что и регистр CS, содержимое регистра DS уже является
правильным для вызова. Затем загружаются оставшиеся регистры и
делается вызов с помощью следующего программного кода:
mov dx,offset entry ; получение точки входа RTL
mov al,v_num ; установка номера вектора
mov ah,25h ; установка вектора прерывания
doscall ; вызов MS-DOS
- 3-40 -
После того, как подпрограмма EXRTL установлена в памяти и
осуществляет доступ к вектору прерывания, установленному в табли-
це векторов прерываний, RTL готова для использования. Для ее вы-
зова подпрограмма использует инструкцию 40h и управление переда-
ется к подпрограмме EXRTL. Программа RTL_TEST, показанная в
листинге 3-6, является одним из примеров подпрограммы, осущест-
вляющей доступ к этой отдельной RTL.
Интерфейс между подпрограммами EXRTL и RTL_TEST полностью
обеспечивается через стек. Подпрограмма RTL_TEST помещает в стек
код функции и выполняет инструкцию int 40h. Заметим, что схема
стека в RTL отличается от такого интерфейса в инструкции CALL
(вызов), в котором прерывание помещает флажки в стек, а также
сегмент возврата и смещение.
Передача управления между двумя секциями показана на
Рис.3-12. Инструкция int 40h передает управление через таблицу
векторов прерываний в подпрограмму EXRTL. Затем подпрограмма
EXRTL выбирает код функции из стека, используя блок описания
структуры стека. Подпрограмма EXRTL анализирует правильность кода
функции и, если он правилен, передает управление к соответствую-
щему драйверу функции путем использования макроса case.