Меню сайта

Урок 178. Загрузка в верхнюю часть памяти (1 Часть )

Применение — — — прерыванияDOS INT 27H является предпочтительным
— — — способом включения в систему постоянныхфункций типа драйверов
— — — устройств. Это — удобный способ сделатьпрограмму постоянной частью
— — — системы. Пользователь может включитьпрограмму в файл AUTOEXEC.BAT,
— — — тогда она будет загружаться автоматически.Такую автоматическую
— — — загрузку можно использовать, когда в вашейсистеме имеется
— — — специальное устройство ввода-вывода. DOSбудет загружать драйвер
— — — этого устройства при каждой загрузкесистемы. Вы можете даже
— — — предпочесть собственную версию процедурыбуферизации печати,
— — — поскольку вы хотите, чтобы она постояннозагружалась в систему.

— — — — — Однако выход в DOS с фиксацией программы вОЗУ работает не
— — — всегда. Фирма IBM предлагает триоперационные системы для
— — — персональных ЭВМ: DOS, которая ирассматривается в данной книге,
— — — CP/M-86 фирмы Digital Research и UCSDp-System фирмы SofTech
— — — Microsystems. Кроме указанных систем,предлагаемых фирмой IBM,
— — — несколько независимых разработчиковраспространяют свои системы.
— — — Чтобы создать драйвер устройства, которыйработал бы со всеми этими
— — — системами, нужно использовать нечтоотличного от метода,
— — — применяемого для DOS.

— — — — — Допустим, у вас имеется специализированноеустройство печати,
— — — которое вы хотите продавать какприспособление к IBM PC. — Поскольку
— — — ваш -принтер — отноительно дешевое устройство, для него потребуется
— — — больше управления со стороны BIOS, чем дляпринтера фирмы IBM. — Вы
— — — конструируете принтер и устройствоподсоединения и пишете BIOS
— — — программу для поддержки его работы. — Если вы пользуетесь
— — — прерыванием INT 27H, то ваше устройствоможно передавать только
— — — пользователям, имеющим на своейперсональной ЭВМ DOS. — Необходим
— — — такой способ загрузки драйвера устройства,который бы работал во
— — — всех операционных системах.

— — — — — Способ загрузки, годный не только для DOS,называется загрузкой
— — — в верхние адреса оперативной памяти. Приэтом управление системой
— — — перехватывается непосредственно послепроцедуры самоконтроля при
— — — включении питания. Это может бытьреализовано при помощи
— — — специальной дискеты загрузки. Программабудет записана на дискету,
— — — которая вставляется в дисковод передвключением питания.
— — — Подпрограмма загрузки, входящая в BIOS,загружает драйвер
— — — устройства с дискеты в верхнюю частьоперативной памяти. Затем
— — можно изменить размер области данныхсообщаемый BIOS в соответствии
— — — с имеющимся объемом оперативной памяти.При загрузке программы в
— — — верхние адреса размер доступнойоперативной памяти уменьшается.
— — — Если после этого загрузить стандартнуюоперационную систему, будет
— — — восстановлено нормальное функционированиеЭВМ. Все операционные
— — — системы фирмы IBM учитывают объем памятиBIOS при определении
— — — границ оперативной памяти. Указанныесистемы не затрагивают
— — — программ, загруженных в верхние адреса.Если система удовлетворяет
— — — указанным требованиям, то можнопользоваться загрузкой в верхние
— — — адреса оперативной памяти.

— — — — — Приведем пример для иллюстрации описанногоприема. На Фиг. 10.2
— — — представлен листинг ассемблирования двухподпрограмм. Первая
— — — подпрограмма осуществляет инициализацию изагрузку драйвера
— — — устройства. Вторая подпрограмма являетсясобственно драйвером
— — — устройства. Позже станет ясным, почемуудобнее было разделить эту
— — — программу на две части.

A
— — — — — — — — — — — — — — Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — -1/1/80 01:21:50
— — — — — — — — — — — -Фиг. 10.2(а) Загрузчик для создания псевдо-диска — — — — — — — -Page — — — — 1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -PAGE ,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -TITLE — — — — — Фиг. 10.2(а) Загрузчик для создания пс
евдо-диска
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — NEW_DISK — — SEGMENT
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — DISK_BIOS — LABEL — — — — — FAR
— — — — — — — — — — — -0003 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 3
— — — — — — — — — — — -0003 — — — — — — — — — — — — — — — — — — — — — — — OLD_VECTOR LABEL — — — — — WORD
— — — — — — — — — — — -0003 — — — — — — — — — — — — — — — — — — — — — — — NEW_DISK — — ENDS

— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — ABS0 SEGMENT AT 0
— — — — — — — — — — — -004C — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 13H*4
— — — — — — — — — — — -004C — — — — — — — — — — — — — — — — — — — — — — — DISK_VECTOR — — — — — LABEL — — — — — WORD
— — — — — — — — — — — -0410 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 410H
— — — — — — — — — — — -0410 — — — — — — — — — — — — — — — — — — — — — — — EQUIPMENT — LABEL — — — — — WORD
— — — — — — — — — — — -0413 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 413H
— — — — — — — — — — — -0413 — — — — — — — — — — — — — — — — — — — — — — — MEMORY_SIZE — — — — — LABEL — — — — — WORD

— — — — — — — — — — — -= 00A0 — — — — — — — — — — — — — — — DISK_SIZE — EQU — 160
— — — — — — — — — — — -7C00 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 7C00H — — — — — — — — — — — — Место,в которое заносится загрузчик ДОС
— — — — — — — — — — — -7C00 — — — — — — — — — — — — — — — — — — — — — — — BOOT_RECORD — — — — — LABEL — — — — — FAR
— — — — — — — — — — — -7C00 — — — — — — — — — — — — — — — — — — — — — — — ABS0 ENDS

— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — CODE SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -CS:CODE,DS:ABS0
— — — — — — — — — — — -7C00 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ORG — 7C00H
— — — — — — — — — — — -7C00 — — — — — 8C C8 — — — — — — — — — — — — — — — — — — MOV — AX,CS
— — — — — — — — — — — -7C02 — — — — — 8E D8 — — — — — — — — — — — — — — — — — — MOV — DS,AX
— — — — — — — — — — — -7C04 — — — — — 8E C0 — — — — — — — — — — — — — — — — — — MOV — ES,AX
— — — — — — — — — — — -7C06 — — — — — 8D 36 7C00 R — — — — — — — — — — — — — — — — — LEA — SI,BOOT_RECORD
— — — — — — — — — — — -7C0A — — — — — 8D 3E 7A00 R — — — — — — — — — — — — — — — — — LEA — DI,BOOT_RECORD-200H — — — -Место,на которое переносится
— — — — — — — — — — — -7C0E — — — — — B9 0200 — — — — — — — — — — — — — — — -MOV — CX,512 — — — — — — — — — — -загрузчик ДОС
— — — — — — — — — — — -7C11 — — — — — F3/ A4 — — — — — — — — — — — — — — — — — — — — — — — REP — MOVSB — — — — — — — — — — — — Перенесение загрузчика
— — — — — — — — — — — -7C13 — — — — — E9 7A16 R — — — — — — — — — — — — — — JMP — NEXT_LOCATION-200H
— — — — — — — — — — — -7C16 — — — — — — — — — — — — — — — — — — — — — — — NEXT_LOCATION:

— — — — — — — — — — — -Фиг. 10.2 программа создания псевдо-диска — (начало)
— — — — — — — — — — — -7C16 — — — — — 83 06 0410 R 40 — — — — — — — -ADD — EQUIPMENT,40H — — — — Увеличение числа дисководов< br> — — — — — — — — — — — -7C1B — — — — — A1 0413 R — — — — — — — — — — — — — — MOV — AX,MEMORY_SIZE
— — — — — — — — — — — -7C1E — — — — — 2D 00A0 — — — — — — — — — — — — — — — -SUB — AX,DISK_SIZE
— — — — — — — — — — — -7C21 — — — — — A3 0413 R — — — — — — — — — — — — — — MOV — MEMORY_SIZE,AX — Уменьшение доступной ДОС памяти,необхо-
— — — — — — — — — — — -7C24 — — — — — B1 06 — — — — — — — — — — — — — — — — — — MOV — CL,6 — — — — — — — — димое для размещения псевдо-диска
— — — — — — — — — — — -7C26 — — — — — D3 E0 — — — — — — — — — — — — — — — — — — SHL — AX,CL — — — — — — — — — — — — Умножениена 1024/16
— — — — — — — — — — — -7C28 — — — — — 8E C0 — — — — — — — — — — — — — — — — — — MOV — ES,AX — — — — — — — — — — — — Сегментнаячасть адреса нового диска
— — — — — — — — — — — -7C2A — — — — — B8 0201 — — — — — — — — — — — — — — — -MOV — AX,201H — — — — Чтение сектора в эту область
— — — — — — — — — — — -7C2D — — — — — BB 0000 — — — — — — — — — — — — — — — -MOV — BX,0
— — — — — — — — — — — -7C30 — — — — — B9 0002 — — — — — — — — — — — — — — — -MOV — CX,2
— — — — — — — — — — — -7C33 — — — — — BA 0000 — — — — — — — — — — — — — — — -MOV — DX,0
— — — — — — — — — — — -7C36 — — — — — CD 13 — — — — — — — — — — — — — — — — — — INT — 13H
— — — — — — — — — — — -7C38 — — — — — 72 1A — — — — — — — — — — — — — — — — — — JC — — BOOT_ERROR
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -ES:NEW_DISK
— — — — — — — — — — — -7C3A — — — — — A1 004C R — — — — — — — — — — — — — — MOV — AX,DISK_VECTOR
— — — — — — — — — — — -7C3D — — — — — 26: A3 0003 R — — — — — — — — — — — — — — — — MOV — OLD_VECTOR,AX
— — — — — — — — — — — -7C41 — — — — — A1 004E R — — — — — — — — — — — — — — MOV — AX,DISK_VECTOR+2 — Сохранениестарого вектора пре-
— — — — — — — — — — — -7C44 — — — — — 26: A3 0005 R — — — — — — — — — — — — — — — — MOV — OLD_VECTOR+2,AX — — — рывания 13h
— — — — — — — — — — — -7C48 — — — — — C7 06 004C R 0000 — — — — — — MOV — DISK_VECTOR,0 — — — — — — — — — — Установка векторапрерывания 17h
— — — — — — — — — — — -7C4E — — — — — 8C 06 004E R — — — — — — — — — — — — — — — — — MOV — DISK_VECTOR+2,ES — — на новое место
— — — — — — — — — — — -7C52 — — — — — EB 07 — — — — — — — — — — — — — — — — — — JMP — SHORT REBOOT — — — — — — — — — — -Чтение загрузчика с другой дискеты
— — — — — — — — — — — -7C54 — — — — — — — — — — — — — — — — — — — — — — — BOOT_ERROR:
— — — — — — — — — — — -7C54 — — — — — 8D 36 7A93 R — — — — — — — — — — — — — — — — — LEA — SI,ERROR_MSG-200H — — — — — -Печать сообщения об ошибке
— — — — — — — — — — — -7C58 — — — — — E8 7C81 R — — — — — — — — — — — — — — CALL PRINT_MSG
— — — — — — — — — — — -7C5B — — — — — — — — — — — — — — — — — — — — — — — REBOOT:
— — — — — — — — — — — -7C5B — — — — — 8D 36 7AA5 R — — — — — — — — — — — — — — — — — LEA — SI,BOOT_MSG-200H — Печатьсообщения о загрузке ДОС
— — — — — — — — — — — -7C5F — — — — — E8 7C81 R — — — — — — — — — — — — — — CALL PRINT_MSG
— — — — — — — — — — — -7C62 — — — — — — — — — — — — — — — — — — — — — — — WAIT_BOOT:
— — — — — — — — — — — -7C62 — — — — — B4 00 — — — — — — — — — — — — — — — — — — MOV — AH,0
— — — — — — — — — — — -7C64 — — — — — CD 16 — — — — — — — — — — — — — — — — — — INT — 16H — — — — — — — — Ожидание вводас клавиатуры
— — — — — — — — — — — -7C66 — — — — — 3C 20 — — — — — — — — -&nbs
p- — — — — — — — — CMP — AL,’ ‘ — — — — — — — — — Ожидаетсяввод пробела
— — — — — — — — — — — -7C68 — — — — — 75 F8 — — — — — — — — — — — — — — — — — — JNE — WAIT_BOOT
— — — — — — — — — — — -7C6A — — — — — B8 0201 — — — — — — — — — — — — — — — -MOV — AX,201H
— — — — — — — — — — — -7C6D — — — — — BB 7C00 — — — — — — — — — — — — — — — -MOV — BX,7C00H
— — — — — — — — — — — -7C70 — — — — — B9 0001 — — — — — — — — — — — — — — — -MOV — CX,1
— — — — — — — — — — — -7C73 — — — — — BA 0000 — — — — — — — — — — — — — — — -MOV — DX,0
— — — — — — — — — — — -7C76 — — — — — 8E C2 — — — — — — — — — — — — — — — — — — MOV — ES,DX — — — — — — — — — — — — Ввод настандартное место загрузчика
— — — — — — — — — — — -7C78 — — — — — CD 13 — — — — — — — — — — — — — — — — — — INT — 13H
— — — — — — — — — — — -7C7A — — — — — 72 D8 — — — — — — — — — — — — — — — — — — JC — — BOOT_ERROR
— — — — — — — — — — — -7C7C — — — — — EA 7C00 —- R — — — — — — — — — — — — — — — JMP — BOOT_RECORD

— — — — — — — — — — — -7C81 — — — — — — — — — — — — — — — — — — — — — — — PRINT_MSG — PROC NEAR
— — — — — — — — — — — -7C81 — — — — — 2E: 8A 04 — — — — — — — — — — — — — — MOV — AL,CS:[SI] — Взять символ дляпечати
— — — — — — — — — — — -7C84 — — — — — 46 — — — — — — — — — — — — — — — — — — — — — INC — SI
— — — — — — — — — — — -7C85 — — — — — 3C 24 — — — — — — — — — — — — — — — — — — CMP — AL,’$’ — — — — — — — — Проверка на символ конца вывода
— — — — — — — — — — — -7C87 — — — — — 75 01 — — — — — — — — — — — — — — — — — — JNE — OUTPUT
— — — — — — — — — — — -7C89 — — — — — C3 — — — — — — — — — — — — — — — — — — — — — RET
— — — — — — — — — — — -7C8A — — — — — — — — — — — — — — — — — — — — — — — OUTPUT:
— — — — — — — — — — — -7C8A — — — — — B4 0E — — — — — — — — — — — — — — — — — — MOV — AH,14
— — — — — — — — — — — -7C8C — — — — — BB 0000 — — — — — — — — — — — — — — — -MOV — BX,0
— — — — — — — — — — — -7C8F — — — — — CD 10 — — — — — — — — — — — — — — — — — — INT — 10H — — — — — — — — Вывод надисплей через BIOS
— — — — — — — — — — — -7C91 — — — — — EB EE — — — — — — — — — — — — — — — — — — JMP — PRINT_MSG
— — — — — — — — — — — -7C93 — — — — — 8E E8 A8 A1 AA A0 20 — — — ERROR_MSG — DB — — ‘Ошибка загрузки’,13,10,’$’
— — — — — — — — — — — — — — — — — A7 A0 A3 E0 E3 A7 AA
— — — — — — — — — — — — — — — — — A8 0D 0A 24

— — — — — — — — — — — — — — — — — — — — — — — Фиг. 10.2 программа создания псевдо-диска (продолжение)
— — — — — — — — — — — -7CA5 — — — — — 82 E1 E2 A0 A2 EC E2 — — — BOOT_MSG — — DB — — ‘Вставьте новую дискету с ДОС’,13,10
— — — — — — — — — — — — — — — — — A5 20 AD AE A2 E3 EE
— — — — — — — — — — — — — — — — — 20 A4 A8 E1 AA A5 E2
— — — — — — — — — — — — — — — — — E3 20 E1 20 84 8E 91
— — — — — — — — — — — — — — — — — 0D 0A
— — — — — — — — — — — -7CC3 — — — — — A8 20 AD A0 A6 AC A8 — — — — — — — — — — — — — — — DB — — ‘и нажмите на пробел’,10,13,’$’
— — — — — — — — — — — — — — — — — E2 A5 20 AD A0 20 AF
— — — — — — — — — — — — — — — — — E0 AE A1 A5 AB 0A 0D
— — — — — — — — — — — — — — — — — 24
— — — — — — — — — — — -7CD9 — — — — — — — — — — — — — — — — — — — — — — — PRINT_MSG — ENDP
— — — — — — — — — — — -7CD9 — — — — — — — — — — — — — — — — — — — — — — — CODE ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -&nbs
p- — -END

— — — — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — — — 1/1/8004:06:49
— — — — — — — — — — — -Фиг. 10.2(б) Программа обслуживания псевдо-диска — — — — — — — -Page — — — — 1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -PAGE ,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -TITLE — — — — — Фиг. 10.2(б) Программа обслуживания псевдо-диска
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — CODE SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -CS:CODE
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ———————————————-
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Эта программа находится в секторе 1 трека 0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -псевдо-диска. Чтение и запись на устройство 2
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -переадресуется на эту программу
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ———————————————-
Продолжение в комментариях…

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

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