Меню сайта

Урок 176. Возврат программы в DOS с сохранением ее резидентности ( 1 Часть )

Первый способ написания и загрузкипостоянной функции в DOS состоит
— — — в том, чтобы, возвращая управление DOS,программа оставалась в
— — — памяти резидентной. Такую функциюсуществляет прерывание INT 27H.

— — — — — Обычно для выхода в DOS используетсяпрерывание INT 20H, либо
— — — программа производит переход по адресу 0программного префикса, как
— — — мы делали в программах типа .EXE. Врезультате управление
— — — возвращается DOS. Операционная системаосвобождает память,
— — — предоставленную этой программе. Следующуюпрограмму, которая
— — — загружается после прерывания INT 20H, DOSпомещает в ту же область
— — — памяти, которая использовалась дляпредыдущей.

— — — — — Выход в DOS через прерывание INT 27Hотличается от
— — — рассмотренного. Управление возвращается вDOS точно так же, как и в
— — — случае прерывания INT 20H, но частьпамяти, занимаемая программой,
— — — не возвращается для дальнейшегоиспользования. В регистре DX
— — — указывает на адрес первой свободной ячейкипосле той области
— — — памяти, котрую вы хотите зарезервировать.DOS резервирует эту
— — — область памяти, как часть системы. Этоозначает, что ваша программа
— — — становится частью DOS. Такую программуможно удалить из памяти
— — — только перезагрузив DOS и начав всесначала.

— — — — — Если выход в PC DOS осуществляется припомощи прерывания INT
— — — 27H, то в регистре CS должен находитьсяадрес программного
— — — префикса. Легче всего это сделать, еслиписать использующую INT 21H
— — — программу как .COM программу. Написатьпрограмму типа .EXE,
— — — оставляющую при выходе содержимоерегистров CS и DX корректным,
— — — довольно трудно. Поскольку созданиепрограмм типа .COM было
— — — рассмотрено в гл.5, будем считать, что всенаши остающиеся
— — — резидентными программы имеют тип .COM.

— — — — — Рассматриваемый для прерывания DOS INT 27Hпример довольно
— — — сложен. Он иллюстрирует не толькоиспользование INT 27H, но и
— — — способы замены существующей BIOS другойверсией. В этом примере мы
— — — даже применим несколько трюков с таймеромдля увеличения скорости
— — -обработки.

— — — — — Пример представлен на Фиг. 10.1.Приведенная здесь программа
— — — предназначена для обслуживания буферапечати. Обычно при выдаче на
— — — печать символа программа обращается кпрерыванию INT 17H — драйверу
— — — печати BIOS. Эта функция выдает символ напринтер после
— — — проверки ошибок и ожидания готовностипринтера. Как правило, при
— — — этом обеспечивается достаточнаяпроизводительность. Но допустим,
— — — что вы пишете несколько программ и хотитевывести их на принтер.
— — — Если вы попытаетесь сделать это, то несможете обратиться к системе
— — — до тех пор, пока принтер не закончитработу. Чтобы
— — — продолжить редактирование илиассемблирование другой части
— — — программы, вам придется ждать завершенияпечати.

A
— — — — — — — — — — — — — — — Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — -4/2/89 16:06:27
— — — — — — — — — — — -Фиг. 10.1 Буфер для печати — — — — — — — — — — — — — — — — — — — — — — — — Page — — — -1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — PAGE — — — — — — ,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -TITLE — — — — — Фиг. 10.1 Буфер для печати
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — ABS0 SEGMENT AT 0
— — — — — — — — — — — -0020 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 4*8H
— — — — — — — — — — — -0020 — — — — — ???????? — — — — — — — — — TIMER_INT — DD — — ? — — — — Аппратное прерывание от таймера
— — — — — — — — — — — -005C — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 4*17H
— — — — — — — — — — — -005C — — — — — ???????? — — — — — — — — — PRINTER_INT — — — — — DD — — ? — — — — Прерывание к BIOS для печати
&nbs
p- — — — — — — — — — — -0408 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 408H
— — — — — — — — — — — -0408 — — — — — ???? — — — — — — — — — — — — — PRINTER_BASE — — — — DW — — ? — — — — Базовый адрес адаптера принтера
— — — — — — — — — — — -040A — — — — — — — — — — — — — — — — — — — — — — — ABS0 ENDS

— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — CODE SEGMENT
— — — — — — — — — — — -0100 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 100H
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -CS:CODE,DS:CODE,ES:CODE
— — — — — — — — — — — -0100 — — — — — EB 09 90 — — — — — — — — — — — — — — — JMP — START

— — — — — — — — — — — -0103 — — — — — ???????? — — — — — — — — — PRINT_VECTOR — — — — DD — — ? — — — — Место для хранения исходного вектора 17h
— — — — — — — — — — — -0107 — — — — — ???????? — — — — — — — — — TIMER_VECTOR — — — — DD — — ? — — — — Место для хранения исходного вектора 9h

— — — — — — — — — — — -010B — — — — — — — — — — — — — — — — — — — — — — — START:
— — — — — — — — — — — -010B — — — — — 2B C0 — — — — — — — — — — — — — — — — — — SUB — AX,AX — — — — — — — — — — — — Установкарегистра ES на сегмент ABS0
— — — — — — — — — — — -010D — — — — — 8E C0 — — — — — — — — — — — — — — — — — — MOV — ES,AX
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -ES:ABS0
— — — — — — — — — — — -010F — — — — — 26: A1 005C R — — — — — — — — — — — — — — — — MOV — AX,WORD PTR PRINTER_INT
— — — — — — — — — — — -0113 — — — — — 26: 8B 1E 005E R — — — — — — — MOV — BX,WORD PTR PRINTER_INT+2
— — — — — — — — — — — -0118 — — — — — 26: 8B 0E 0020 R — — — — — — — MOV — CX,WORD PTR TIMER_INT
— — — — — — — — — — — -011D — — — — — 26: 8B 16 0022 R — — — — — — — MOV — DX,WORD PTR TIMER_INT+2
— — — — — — — — — — — -0122 — — — — — A3 0103 R — — — — — — — — — — — — — — MOV — WORD PTR PRINT_VECTOR,AX
— — — — — — — — — — — -0125 — — — — — 89 1E 0105 R — — — — — — — — — — — — — — — — — MOV — WORD PTR PRINT_VECTOR+2,BX
— — — — — — — — — — — -0129 — — — — — 89 0E 0107 R — — — — — — — — — — — — — — — — — MOV — WORD PTR TIMER_VECTOR,CX
— — — — — — — — — — — -012D — — — — — 89 16 0109 R — — — — — — — — — — — — — — — — — MOV — WORD PTR TIMER_VECTOR+2,DX

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ——- -Во время занесения векторов прерываний прерывания запрещены

— — — — — — — — — — — -0131 — — — — — FA — — — — — — — — — — — — — — — — — — — — — CLI

— — — — — — — — — — — — — — — — — — — — — — — -Фиг. 10.1 Буфер печати (начало)
— — — — — — — — — — — -0132 — — — — — 26: C7 06 005C R 0162 — — — — — — — — MOV — WORD PTR PRINTER_INT,offset PRINT_HANDLER
— — — — — — — — — — — — — — — — — -R
— — — — — — — — — — — -0139 — — — — — 26: 8C 0E 005E R — — — — — — — MOV — WORD PTR PRINTER_INT+2,CS
— — — — — — — — — — — -013E — — — — — 26: C7 06 0020 R 0196 — — — — — — — — MOV — WORD PTR TIMER_INT,offset TIMER_HANDLER
— — — — — — — — — — — — — — — — — -R
— — — — — — — — — — — -0145 — — — — — 26: 8C 0E 0022 R — — — — — — — MOV — WORD PTR TIMER_INT+2,CS
— — — — — — — — — — — -014A — — — — — B0 36 — — — — — — — — — — — — — — — — — — MOV — AL,00110110b
— — — — — — — — — — — -014C — — — — — E6 43 — — — — — — — — — — — — — — — — — — OUT — 43H,AL
— — — — — — — — — — — -014E — — — — — B0 00 — — — — — — — — — — — — — — — -&n
bsp- — MOV — AL,0 — Увеличение скоростиработы таймера в 256 раз
— — — — — — — — — — — -0150 — — — — — E6 40 — — — — — — — — — — — — — — — — — — OUT — 40H,AL
— — — — — — — — — — — -0152 — — — — — B0 01 — — — — — — — — — — — — — — — — — — MOV — AL,1
— — — — — — — — — — — -0154 — — — — — E6 40 — — — — — — — — — — — — — — — — — — OUT — 40H,AL
— — — — — — — — — — — -0156 — — — — — FB — — — — — — — — — — — — — — — — — — — — — STI
— — — — — — — — — — — -0157 — — — — — 8D 16 28FE R — — — — — — — — — — — — — — — — — LEA — DX,BUFFER_END — — — — Занесениеадреса конца программы
— — — — — — — — — — — -015B — — — — — CD 27 — — — — — — — — — — — — — — — — — — INT — 27H — — — — — — — — Выход с сохранениемпрограммы в памяти

— — — — — — — — — — — -015D — — — — — 00 — — — — — — — — — — — — — — — TIMER_COUNT — — — — — DB — — 0
— — — — — — — — — — — -015E — — — — — 01EE R — — — — — — — — — — — — — — — — — BUFFER_HEAD — — — — — DW — — BUFFER_START
— — — — — — — — — — — -0160 — — — — — 01EE R — — — — — — — — — — — — — — — — — BUFFER_TAIL — — — — — DW — — BUFFER_START

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ——- -Эта подпрограмма управляет вызовом прерывания 17h

— — — — — — — — — — — -0162 — — — — — — — — — — — — — — — — — — — — — — — PRINT_HANDLER — — — PROC FAR
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -CS:CODE,DS:nothing,ES:nothing
— — — — — — — — — — — -0162 — — — — — 0A E4 — — — — — — — — — — — — — — — — — — OR — — AH,AH
— — — — — — — — — — — -0164 — — — — — 74 05 — — — — — — — — — — — — — — — — — — JZ — — BUFFER_CHARACTER — Проверкана функцию вывода символа
— — — — — — — — — — — -0166 — — — — — 2E: FF 2E 0103 R — — — — — — — JMP — PRINT_VECTOR — — — — — — — — — — — Переход настандартный обработчик
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — прерывания 17h
— — — — — — — — — — — -016B — — — — — — — — — — — — — — — — — — — — — — — BUFFER_CHARACTER:
— — — — — — — — — — — -016B — — — — — FB — — — — — — — — — — — — — — — — — — — — — STI
— — — — — — — — — — — -016C — — — — — 53 — — — — — — — — — — — — — — — — — — — — — PUSH BX
— — — — — — — — — — — -016D — — — — — 51 — — — — — — — — — — — — — — — — — — — — — PUSH CX
— — — — — — — — — — — -016E — — — — — 56 — — — — — — — — — — — — — — — — — — — — — PUSH SI
— — — — — — — — — — — -016F — — — — — 2B C9 — — — — — — — — — — — — — — — — — — SUB — CX,CX — — — — — — — — — — — — Счетчикотсчетов таймера
— — — — — — — — — — — -0171 — — — — — — — — — — — — — — — — — — — — — — — PRINT_LOOP:
— — — — — — — — — — — -0171 — — — — — 2E: 8B 1E 0160 R — — — — — — — MOV — BX,BUFFER_TAIL — Выборка адреса конца буфера
— — — — — — — — — — — -0176 — — — — — 8B F3 — — — — — — — — — — — — — — — — — — MOV — SI,BX
— — — — — — — — — — — -0178 — — — — — E8 01E2 R — — — — — — — — — — — — — — CALL ADVANCE_POINTER — Перемещение указателя на следующий байт
— — — — — — — — — — — -017B — — — — — 2E: 3B 1E 015E R — — — — — — — CMP — BX,BUFFER_HEAD — Проверка на наличие места в буфере
— — — — — — — — — — — -0180 — — — — — 74 0E — — — — — — — — — — — — — — — — — — JE — — BUFFER_FULL — — — — — — Нетместа,ожидается пока оно появится
— — — — — — — — — — — -0182 — —
— — — 2E: 88 04 — — — — — — — — — — — — — — MOV — CS:[SI],AL — Вывод символа вбуфер
— — — — — — — — — — — -0185 — — — — — 2E: 89 1E 0160 R — — — — — — — MOV — BUFFER_TAIL,BX — Занесение нового адреса конца буфера
— — — — — — — — — — — -018A — — — — — B4 00 — — — — — — — — — — — — — — — — — — MOV — AH,0 — — — — — — — Код возврата изпрерывания 17h
— — — — — — — — — — — -018C — — — — — — — — — — — — — — — — — — — — — — — PRINT_RETURN:
— — — — — — — — — — — -018C — — — — — 5E — — — — — — — — — — — — — — — — — — — — — POP — SI
— — — — — — — — — — — -018D — — — — — 59 — — — — — — — — — — — — — — — — — — — — — POP — CX
— — — — — — — — — — — -018E — — — — — 5B — — — — — — — — — — — — — — — — — — — — — POP — BX
— — — — — — — — — — — -018F — — — — — CF — — — — — — — — — — — — — — — — — — — — — IRET
— — — — — — — — — — — -0190 — — — — — — — — — — — — — — — — — — — — — — — BUFFER_FULL:
— — — — — — — — — — — -0190 — — — — — E2 DF — — — — — — — — — — — — — — — — — — LOOP PRINT_LOOP — Повторить циклпроверки занятости буфера
— — — — — — — — — — — -0192 — — — — — B4 01 — — — — — — — — — — — — — — — — — — MOV — AH,1 — — — — — — — Буфер занятслишком долго,ошибка
— — — — — — — — — — — -0194 — — — — — EB F6 — — — — — — — — — — — — — — — — — — JMP — PRINT_RETURN
— — — — — — — — — — — -0196 — — — — — — — — — — — — — — — — — — — — — — — PRINT_HANDLER — — — ENDP

— — — — — — — — — — — — — — — — — — — — — — — -Фиг. 10.1 Буфер печати (продолжение)

Категория: Программирование на Ассемблере | Дата: 25.02.13

Меню раздела
Блок