Глава 1. Системные ресурсы.
Раздел 3. Управление программами.
1.3.6 Преобразование программ из типа .EXE в тип .COM.
Программисты на ассемблере имеют возможность преобразовать свои программы из обычного формата EXE в формат COM. Файлы EXE имеют заголовок, содержащий информацию для привязки; DOS привязывает некоторые адреса программы при загрузке. С другой стороны, файлы COM существуют в таком виде, что привязка не требуется они хранятся уже в том виде, в котором загружаемая программа должна быть в памяти машины. По этой причине файлы EXE по меньшей мере на 768 байтов больше на диске, чем их COM эквиваленты (хотя при загрузке в память они будут занимать одинаковое место). Файлы COM также быстрее загружаются, поскольку не требуется привязки. Других преимуществ у них нет, а некоторые программы слишком сложны и слишком велики, чтобы их можно было преобразовать в тип COM.
Привязка - это процесс установки адресов, связанных с сегментным регистром. Hапример, программа может указывать на начало области данных следующим кодом:
MOV AX,SEG DATA_AREA | |
MOV DS,AX |
Файлы COM не нуждаются в привязке, поскольку они хранятся в таком виде, что не нуждаются в фиксации сегмента. Все в программе хранится относительно начала кодового сегмента, включая все данные и стек. По этой причине вся программа не может превышать 65535 байт по длине, что соответствует максимальному смещению, которое существует в используемой схеме адресации (поскольку верхняя часть этого блока занята стеком, то реальное пространство доступное для кода и данных немного меньше чем 65535 байт, хотя стековый сегмент при необходимости может быть вынесен за границу 64K байтного блока). В файлах COM все сегментные регистры указывают на начало PSP; сравните с файлами EXE, где DS и ES инициализируются аналогичным образом, но CS указывает на первый байт следующий за PSP.
Для представления программы в виде файла COM требуется соблюдение следующих правил:
После того как программа сконструирована таким образом, ассемблируйте и компонуйте ее как обычно. Затем преобразуйте ее в форму COM c помощью утилиты EXE2BIN, имеющейся в MS DOS. Если имя программы, построенной компоновщиком MYPROG.EXE, то просто введите команду EXE2BIN MYPROG. В результате Вы получите программный файл с именем MYPROG.BIN. Все что Вам останется после этого сделать - переименовать этот файл в MYPROG.COM. Вы можете также сразу использовать команду EXE2BIN MYPROG MYPROG.COM, для получения файла с расширением COM.
Hизкий уровень.
В данном примере содержится полная короткая программа, которая по установке переключателей определяет количество накопителей в машине и затем выводит сообщение на экран. Она может служить примером короткой утилиты того сорта, для которых формат COM идеален.
CSEG SEGMENT | |
ORG 100H | |
ASSUME CS:CSEG, DS:CSEG, SS:CSEG | |
;---данные | |
START: JMP SHORT BEGIN | ;переход к коду |
MESSAGE1 DB 'The dip switches are set for $' | |
MESSAGE2 DB 'disk drive(s).$' | |
;---печать первой части сообщения | |
BEGIN: MOV AH,9 | ;функция 9 прерывания 21H - вывод |
MOV DX,OFFSET MESSAGE1 | ;строки |
INT 21H | ;выводим строку |
PUSH AX | ;сохраняем номер функции на будущее |
;---получаем установку переключателей из порта A микросхемы 8255 | |
IN AL,61H | ;получаем байт из порта B |
OR AL,10000000B | ;устанавливаем бит 7 |
OUT 61H,AL | ;заменяем байт |
IN AL,60H | ;получаем установку переключат. |
AND AL,11000000B | ;выделяем старшие 2 бита |
MOV CL,6 | ;подготовка к сдвигу AL вправо |
SHR AL,CL | ;сдвигаем 2 бита в начало |
ADD AL,49 | ;добавляем 1, чтобы считать с 1 |
;и 48 для перевода в ASCII | |
MOV DL,AL | ;помещаем результат в DL |
MOV AL,61H | ;должны восстановить порт B |
AND AL,01111111B | ;сбрасываем бит 7 |
OUT 61H,AL | ;возвращаем байт |
;---печать числа накопителей | |
MOV AH,2 | ;функция 2 прерывания 21H |
INT 21H | ;печатаем число из DL |
;---печать второй половины сообщения | |
POP AX | ;берем номер функции со стека |
MOV DX,OFFSET MESSAGE2 | |
INT 21H | ;выводим строку |
INT 20H | ;завершение программы |
CSEG ENDS | |
END START |
<~-1.3.5 Загрузка и запуск программных оверлеев.
Содержание
Глава 2. Таймеры и звук.-~>