Меню сайта

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

Фиг. 10.2 программа создания псевдо-диска (продолжение)
— — — — — — — — — — — -007C — — — — — BE 0000 — — — — — — — — — — — — — — — -MOV — SI, 0
— — — — — — — — — — — -007F — — — — — 8E C2 — — — — — — — — — — — — — — — — — — MOV — ES, DX
— — — — — — — — — — — -0081 — — — — — 8B FB — — — — — — — — — — — — — — — — — — MOV — DI, BX
— — — — — — — — — — — -0083 — — — — — — — — — — — — — — — — — — — — — — — DO_MOVE:
— — — — — — — — — — — -0083 — — — — — 8A E8 — — — — — — — — — — — — — — — — — — MOV — CH, AL — — — — Число слов в секторе
— — — — — — — — — — — -0085 — — — — — B1 00 — — — — — — — — — — — — — — — — — — MOV — CL, 0
— — — — — — — — — — — -0087 — — — — — FC — — — — — — — — — — — — — — — — — — — — — CLD
— — — — — — — — — — — -0088 — — — — — F3/ A5 — — — — — — — — — — — — — — — — — — — — — — — REP — MOVSW — — — — — — — — — — — — Пересылка данных
— — — — — — — — — — — -008A — — — — — — — — — — — — — — — — — — — — — — — ALL_DONE:
— — — — — — — — — — — -008A — — — — — 07 — — — — — — — — — — — — — — — — — — — — — POP — ES — — — — — — — — — Восстановление регистров
— — — — — — — — — — — -008B — — — — — 1F — — — — — — — — — — — — — — — — — — — — — POP — DS
— — — — — — — — — — — -008C — — — — — 5F — — — — — — — — — — — — — — — — — — — — — POP — DI
— — — — — — — — — — — -008D — — — — — 5E — — — — — — — — — — — — — — — — — — — — — POP — SI
— — — — — — — — — — — -008E — — — — — 5A — — — — — — — — — — — — — — — — — — — — — POP — DX
— — — — — — — — — — — -008F — — — — — 59 — — — — — — — — — — — — — — — — — — — — — POP — CX
— — — — — — — — — — — -0090 — — — — — 5B — — — — — — — — — — — — — — — — — — — — — POP — BX
— — — — — — — — — — — -0091 — — — — — B4 00 — — — — — — — — — — — — — — — — — — MOV — AH, 0 — — — — — — — — — — — -Нормальное окончание
— — — — — — — — — — — -0093 — — — — — F8 — — — — — — — — — — — — — — — — — — — — — CLC
— — — — — — — — — — — -0094 — — — — — CA 0002 — — — — — — — — — — — — — — — -RET — 2
— — — — — — — — — — — -0097 — — — — — — — — — — — — — — — — — — — — — — DISK ENDP
— — — — — — — — — — — -0097 — — — — — — — — — — — — — — — — — — — — — — — CODE ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -END
— — — — — Фиг. 10.2 (а) Процедура загрузки длявиртуального диска-
— — — — — — — — — — — (b) Программа драйвера виртуальногодиска.

— — — — — Драйвер устройства, приведенный врассматриваемом примере,
— — — реализует модель диска в оперативнойпамяти. Мы возьмем 160К
— — — памяти системы и будем исполльзовать ее некак оперативную
— — — память, а как дискету. Мы выбрали именно160К потому, что это
— — — минимальный объем дискеты фирмы IBM.Очевидно, при большем объеме
— — — оперативной памяти можно моделироватьдискету большего объема.
— — — Подпрограмму псевдо-диска можноиспользовать для повышения
— — — производительности программ, производящихинтенсивный обмен с
— — — диском. -Например, если поместить на псевдо-диск ассемблер и
— — — исходный код программы, ассемблированиебудет произведено не за
— — — минуты, а за секунды. Производительностьнекоторых программ может
— — — быть повышена более чем на порядок. Платойза такое повышение
— — — производительности являются 160K байтоперативной памяти, отводимые
— — — под псевдо-диск. Если в системе, которая восновном используется
— — — для редактирован
ия и ассемблирования,имеется 256 кбайт памяти, то
— — — в действительности для ассемблерадостаточно всего лишь 96 кбайт.
— — — Оставшиеся 160 кбайт можно использоватьдля моделирования диска в
— — — оперативной памяти. — Следует помнить, что содержимое такого диска
— — — теряется при отключении питания, поэтому,прежде чем окончить
— — — работу, убедитесь, что информацияскопирована на настоящую
— — — дискету.

— — — — — Первая подпрограмма на Фиг. 10.2 -процедура загрузки. Ее
— — — код находится в секторе 1 дорожки 0загрузочной дискеты. Как
— — — поместить программу туда, будет объясненопозже. Подпрограмма POST
— — — при завершении считывает содержимое сетора1 дорожки 0 в память,
— — — по адресу 0:7C00H. Затем POST передаетуправление по первому
— — — адресу этой записи. Таким образом системафирмы IBM загружает в
— — — память DOS или любую другую операционнуюсистему. А мы как раз и
— — — собираемся, загружать свою собственнуюпростую операционную
— — — систему.

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

— — — — — Первое, что делает программа инициализации- пересылает себя по
— — — адресу 0:7A00H. Затем, в процессеинициализации, процедура
— — — перезагружает систему, чтобы загрузитьнастоящую операционную
— — — систему. Эта загрузка производится поадресу 0:7C00H. Если бы
— — — процедура инициализации не переносила себяна другое место, она бы
— — -считывала следующую запись загрузки в ту область памяти, где
— — — находится сама.

— — — — — С адреса NEXT_LOCATION процедураинициализации инсталирует
— — — драйвер устройства. Она изменяют флагиоборудования для указания на
— — — наличие дополнительного дисковода посравнению с установкой внешних
— — — переключателей. Это «убеждает»операционную систему, что диск в
— — — оперативной памяти является частьютехнического обеспечения. — При
— — — инициализации значение MEMORY_SIZEуменьшается на 160 кбайт,
— — — которые резервируются для моделированиядиска. — Это предотвращает
— — — использование предназначенной для негопамяти. — Кроме того,
— — — программа подсчитывает значение сегментадля этой области в 160
— — — кбайт, чтобы знать, куда загружать драйверустройства. Когда это
— — — выполнено, подпрограмма инициализациизагружает в зарезервиро-
— — — ванную память содержимое сектора 2 дорожки0 загрузочной дискеты.
— — — Как поместить драйвер устройства в сектор2 будет описано при
— — — размещении программы загрузки в секторе 1.

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

— — — — — Прежде чем двинуться дальше, рассмотрим,как поместить
— — — процедуру загрузки на новую загрузочнуюдискету. Во-первых,
— — — необходима пустая отформатированнаядискета. Она и станет
— — — загрузочной. Листинг на Фиг. 10.3показывает, что ассемблирование и
— — — редактирование связей процедуры загрузкипроисход
ят, как обычно.
— — — Вызовите программу DOS DEBUG и загрузитепроцедуру инициации.
— — — Она загружается со смещением 7C00H,установленным программой DEBUG.
— — — Регистры устанавливаются таким образом,чтобы использовать BIOS для
— — — записи одного сектора дискеты. — Это выполняет трехбайтовая
— — — программа, находящаяся по адресу200H. — Если после записи нет
— — — состояния ошибки, то запись инициализацииуже на дискете.

— — — — — Для записи драйвера устройства в сектор 2выполните следующие
— — — шаги, показанные на Фиг. 10.3. — С помощью программы DEBUG мы
— — — загружаем в память драйвер псевдодиска.Команда записи программы
— — — DEBUG помещает код драйвера в сектор сотносительным номером 1
— — — (сектор 2 дорожки 0) дискеты, находящейсяна дисководе A:.
— — — Аналогичный способ можно было бы применитьи для занесения на
— — — дискету записи инициализации.

— — — — — Такой способ формирования вызова BIOS впрограмме DEBUG
— — — для записи на дискету может использоватьсяпочти для всех функций
— — — BIOS. Проследить, что именно происходитпри вызове BIOS, можно с
— — — помощью программы DEBUG. Можно установитьрегистры для вызова и
— — — написать несложную трехбайтовую программу,осуществляющую
— — — программное прерывание и производящуювозврат в DEBUG. — Этот прием
— — — удобен также для тестирования собственногодрайвера устройства.

— — — — — Вернемся к процедуре драйвера псевдо-дискаво второй части Фиг.
— — — 10.2. -Заметим, что процедура загрузки сохранила исходный вектор
— — — дискеты (INT 13H) в этом сегменте сосмещением 3. — Подпрограммы-
— — — драйвера используют этот вектор дляреализации всех функций
— — — дискеты, которые не реализуютсяпсевдо-диском. В приведенной
— — — подпрограмме предполагается, чтопсевдо-диск находится на дисководе
— — — 2. На запрос любого другого дисководапроцедура передает управление
— — — BIOS, используя приэтом сохраненный вORIGINAL_VECTOR исходный
— — — вектор. Аналогично и запрос на сменудискеты передается BIOS. Если
— — — функция, запрашиваемая дляпсевдо-дисковода, не считывание и не
— — — запись, то драйвер псевдо-диска непроизводит никаких действий, и
— — — происходит возврат с нормальным кодомзавершения. Псевдо-диск
— — — не требует форматирования, а поскольку унас нет контроля ошибок,
— — — то не остается ничего проверять.

— — — — — Если запрашиваемой операцией являетсясчитывание или запись,
— — — драйвер вычисляет адрес соответствующегопсевдо-сектора в памяти.
— — — При обращении за границу диска поцедуравозвращает запись об ошибке
— — — отсуствия адреса. Код драйвераустанавливает регистры источника и
— — — назначения в соответствии с направлениемоперации. — — — — — Наконец,
— — — команда REP MOVSW передает данные междупсевдо-диском и буфером
— — — пользователя. — Рассматриваемая программа всегда устанавливает
— — — нормальный код завершения и производитвозврат в вызывающую
— — — программу.

— — — — — Данный пример показывает, как реализоватьмоделирование диска,
— — — однако он не готов для продуктивногоиспользования. Для того, чтобы
— — — стать утилитой общего назначения, этапрограмма должна быть
— — — преобразована для обеспечения работы слюбым прсевдоустройством, а
— — — не только со вторым. Программу можно былобы изменить для работы с
— — — сектором любой длины, хотя обычно этого нетребуется. — Фактически,
— — — если моделирование диска применяетсятолько при работе с DOS,
— — — процедура инициализации должнаформатировать дискету, записав
A
— — — — — A&gt-MASM BOOT,,,-
— — — — — The IBM Personal Computer MACRO Assembler
— — — — — Version 1.00 (C)Copyroght IBM Corp 1981

— — — — — Warning Severe
— — — — — Errors — — — — — Errors
— — — — — 0 — — — — 0

— — — — — A&gt-B:LINK BOOT,,,-

— — — — — IBM Personal Computer Linker
— — — — — Version 1.00 (C)Copyroght IBM Corp 1981

— — — — — -Warning: No STACK segment

— — — — — Therhe was 1 error detected

— — — — — A&gt-MASM DISK,,,-
— — — — — The IBM Personal Computer MACRO Assembler
— — — — — Version 1.00 (C)Copyroght IBM Corp 1981

— — — — — Warning Severe
— — — — — Errors — — — — — Errors
— — — — — 0 — — — — 0

— — — — — A&gt-B:LINK DISK,,,-


— — — — IBM Personal Computer Linker
— — — — — Version 1.00 (C)Copyroght IBM Corp 1981

— — — — — -Warning: No STACK segment

— — — — — Therhe was 1 error detected

— — — — — A&gt-DEBUG BOOT.EXE
— — — — — -R

— — — — — AX=0000 -BX=0000 — CX=7CD3 — DX=0000 -SP=0000 — BP=0000 — SI=0000 -DI=0000
— — — — — DS=06D7 -ES=06D7 — SS=06E7 — CS=06E7 -IP=0000 — — NV — UP DI PL NZ NA PO NC
— — — — — 06E7:0000 -0000 — ADD — — [BX+SI],AL — — — — — — — DS:0000=CD
— — — — — -U7C00 — — — — — 7C05
— — — — — 06E7:7C00 8CC8 — — — — — — — — — MOV — — AX,CS
— — — — — 06E7:7C00 8CD8 — — — — — — — — — MOV — — DS,AX
— — — — — 06E7:7C00 8CC0 — — — — — — — — — MOV — — ES,AX
— — — — — -RAX
— — — — — AX 0000
— — — — — :301
— — — — — -RBX
— — — — — BX 0000
— — — — — :7C00
— — — — — -RCX
— — — — — CX 7CD3
— — — — — :1
— — — — — -RDX
— — — — — DX 0000
— — — — — :
— — — — — -RES
— — — — — ES 06D7
— — — — — :6E7
— — — — — -E200
— — — — — O6D7:0200 — — OO.CD — — 00.13 — — 00.CC — — -*** Здесь вставьте загрузочную дискету
— — — — — -g=100

— — — — — AX=0000 -BX=7C00 — CX=0001 — DX=0000 -SP=0000 — BP=0000 — SI=0000 -DI=0000
— — — — — DS=06D7 -ES=06D7 — SS=06E7 — CS=06E7 -IP=0102 — — NV — UP EI PL NZ NA PE NC
— — — — — 06E7:0102 -CC — — — — — — — — — — INT — — 3
— — — — — -NDISK.EXE — — — — — — — — — — — — — — — — — — — -*** Здесь вставьте программную дискету
— — — — — -L
— — — — — -UD 10
— — — — — 06E7:0000 EB05 — — — — — — — — — JMPS — 0007
— — — — — 06E7:0002 90 — — — — — — — — — — — NOP
— — — — — 06E7:0003 -0000 — ADD — — [BX+SI],AL
— — — — — 06E7:0005 -0000 — ADD — — [BX+SI],AL
— — — — — 06E7:0007 -80FA02 CMP — — DL,02
— — — — — 06E7:000A -7405 — CMP — — 0011
— — — — — 06E7:000C -2E — — — — — — — — — — SEG — — CS
— — — — — 06E7:000D -FF2E0300 — — — — JMP — — L,[0003] —*** Здесь вставьте загрузочную дискету
— — — — — -W0 0 1 1
— — — — — -Q
— — — — — A&gt-
A
— — — — — -Фиг. 10.3 Шаги подготовки загрузки в верхние
— — — — — — — — — — — адреса памяти
— — — справочник и таблицу размещения файловFAT. При нынешнем виде этой
— — — процедуры после загрузки DOS вы должны»форматировать» диск C:. Для
— — — псевдо-диска не требуеися физическогоформатирования, но утилита
— — — FORMAT записывает таблицу FAT и каталог,необходимые для
— — — функционирования DOS.

— — — — — Эта процедура обеспечивает такжесохранение процедуры-драйвера
— — — устройства в псевдо-секторе 1 на дорожке0. Система DOS не
— — — использует указанный сектор дисковода C:,однако другие системы
— — — могут это делать. Вы вооозможно, заметили,что программа псевдо-
— — — диска предотвращает запись всмоделированный сектор дорожки 0, так
— — — что программа по крайней мере не уничтожитсаму себя.

— — — — — Вообще говоря, метод загрузки в верхниеадреса оперативной
— — — памяти довольно сложен. Необходимазагрузка с двух дискет, что
— — — требует от оператора дополнительныхманипуляций. Если не
— — — предполагается использование программы вкаких-либо других
— — — системах, кроме DOS, то гораздо удобнееиспользовать прерывание INT
— — — 27H. В противном случае загрузка в верхниеадреса оперативной
— — — памяти может оказаться единственновозможным способом.

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

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