Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_2.DOC
Скачиваний:
13
Добавлен:
02.05.2019
Размер:
689.66 Кб
Скачать
      1. Программа типа ехе

ЕХЕ-программы имеют более сложную структуру, но благодаря этому для них отсутствует ограничение размера в 64 Кб, и поэтому все достаточно большие программы оформляются именно в этом формате. ЕХЕ-программа может содержать произвольное число сегментов, хотя доступ в каждый момент времени возможен лишь к четырем (или шести для 80386) из них; для использования остальных необходима перенастройка сегментных регистров.

Исходный текст программы ЕХЕ (так же, как и программы СОМ) может быть описан с использованием моделей памяти либо с помощью директив сегментации и директивы ASSUME. Ниже приведены примеры описаний для первого и второго вариантов соответственно.

.model small ; модель памяти, используемая для ЕХЕ-программ

.stack 100h ; сегмент стека размером 256 байт

.code ; начало сегмента кода

start: ; точка входа

mov ax, DGROUP ; сегментный адрес данных

mov ds, ax ; помещается в DS

[. . .] ; (содержательная часть)

mov ah, 4Ch

int 21h ; вызов функции DOS Exit («завершить программу»)

.data ; конец сегмента кода и начало сегмента данных

message db 1, 2, 3, 'data'

end start ; конец сегмента данных и программы

В этом примере определяются три сегмента — сегмент стека директивой .STACK размером в 256 байт, сегмент кода, начинающийся с директивы .CODE, и сегмент данных, начинающийся с .DATA и содержащий данные. Порядок сегментов в большинстве случаев может быть произвольным.

Команда MOV AX,DGROUP загружает в АХ сегментный адрес группы сегментов данных DGROUP, a MOV DS,AX копирует его в DS. Для ассемблеров MASM и TASM можно использовать вместо DGROUP предопределенную метку “@data”, но единственная модель памяти, в которой группа сегментов данных называется иначе,— FLAT (используемая реже остальных).

Сразу же за командами настройки регистра DS идет вызов функции Exit выхода из программы.

Компиляция name.asm:

Для TASM:

tasm name.asm

tlink /x name.obj

Для MASM:

ml /c name.asm

1.2.Использование служебных функций dos и bios

Одним из основных средств, имеющихся в распоряжении системного программиста, является набор служебных подпрограмм базовой системы ввода-вывода (BIOS) и операционной системы (ОС). Их использование избавляет от необходимости настраиваться на работу каждого конкретного устройства, разрабатывать каждый раз заново служебные базовые процедуры и, поскольку эти подпрограммы являются стандартными, повышает совместимость программ.

В DOS доступ к служебным подпрограммам (их называют функциями) осуществляется с помощью программных прерываний, вызываемых по команде INT. В качестве операнда этой команды указывается номер прерывания. Всего имеется 256 номеров, часть из них не используется. Подпрограмм значительно больше, поэтому их группируют и назначают номер прерывания целой группе. При вызове прерывания уточняют, к какой подпрограмме нужно обратиться. Чаще всего для этого используют регистр AH — в него заносят непосредственно перед вызовом прерывания номер функции. Пример вызова 1-й функции прерывания 21h:

mov ah, 01h

int 21h

В результате выполнения команды INT управление передается программе обработки соответствующего прерывания (в данном случае 21h); по окончании работы управление возвращается в прерванную программу.

Многие функции нуждаются в определенных входных данных (параметрах), определяющих результат их работы. Входные параметры чаще всего передаются через регистры и/или ячейки памяти. Адреса входных ячеек памяти обычно также передаются через регистры.

Функция может возвращать в прерванную программу определенный результат — в выходных регистрах или ячейках памяти. Таким образом, в общем случае процедуру вызова N‑й функции прерывания X можно записать так:

;заполнение входных регистров (ячеек памяти)

mov ah, N ; AH = номер функции

int X ; вызов прерывания X

;анализ выходных регистров (ячеек памяти)

Часть номеров прерывания закреплена за функциями BIOS, часть — за функциями DOS, а несколько могут быть использованы программистом для собственных подпрограмм (функций).

Как уже отмечалось, доступ к большинству функций DOS осуществляется через прерывание 21h. Среди них — функции для ввода с клавиатуры и вывода на экран, функции работы с файлами, управления памятью и процессами и другие. Информацию о номерах функций и прерываний, входных и выходных регистрах, а также описание действия функций можно найти в справочниках по DOS. Кроме того, многие из них рассматриваются далее.

Выше мы уже сталкивались с использованием одной из функций DOS — функции выхода из программы (4Ch — Exit). Отличие данной функции от большинства других заключается в том, что она не возвращает управление вызвавшей ее программе. Управление передается вызвавшей программу среде (командному процессору, оболочке или какой-либо другой родительской программе). При вызове функции входной регистр AL содержит код возврата, который может быть проверен вызвавшей средой. Нулевой код возврата традиционно считается признаком успешного завершения. В соответствии с этими сведениями, более корректный вариант вызова функции выхода предусматривает явное определение кода возврата, например:

mov ah, 4Ch ; функция DOS 4Ch завершения программы

mov al, 00h ; код 0 успешного завершения

int 21h ; вызов DOS

либо

mov ax, 4C00h ; номер функции и код возврата

int 21h ; вызов DOS

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]