Образ.exe программы в памяти [_], представленный на рис. 2.5, начинается с префикса программного сегмента PSP (Program Segment Prefix). Вслед за PSP располагаются сегменты программы. Сегментные регистры ES и DS автоматически инициализируются на начало PSP. Это даёт возможность, при сохранении значения одного из регистров, обращаться к нему в случае необходимости. В указатель команд IP загружается относительный адрес точки входа в программу, а в указатель стека SP - смещение конца сегмента стека.
Таким образом, после загрузки программы в память адресуемыми являются все сегменты, кроме сегмента данных. Инициализация регистра DS производится обычно в первых строках программы.
Листинг 1.4. Шаблон стандартного формата.exe программы.
TITLE “Шаблон упрощенного формата.com программ”
;Директивы INCLUDE “filename”
;Макроопределения EQU и =
DATASG SEGMENT Para ‘Data’
;Если программа будет прервана по ошибке, то соответствующий код ошибки записывается в exCode и выполняется команда перехода на метку Exit.
exCode DB 0
;Описания других переменных
DATASG ENDS
STACKSG SEGMENT Para STACK ‘Stack’
db 100h dup(?)
STACKSG ENDS
CODESG SEGMENT Para ‘Code’
ASSUME CS:CODESG, DS:DATASG, SS:STACKSG
Start:
MOV AX, DataSg; инициализация сегмента данных
MOV DS, AX
;Тело программы
MOV AH, 004Ch; Функция DOS выхода из программы
MOV AL, [exCode]; Возврат значения кода выхода
INT 21h; Вызов DOS. Останов программы.
CODESG ENDS
END Start; Конец программы
Листинг 1.5. Шаблон упрощенного формата.exe программы.
%TITLE “Шаблон стандартного формата.exe программ”
IDEAL
MODEL small
STACK 256
;Директивы INCLUDE “filename”
;Макроопределения EQU и =
DATASEG
;Если программа будет прервана по ошибке, то соответствующий код ошибки записывается в exCode и выполняется команда перехода на метку Exit.
exCode DB 0
;Описания других переменных
CODESEG
Start:
MOV AX, @DATA; Установка в DS адреса сегмента данных
MOV DS, AX;
MOV ES, AX; Установка ES = DS
INT 21h; Вызов DOS. Останов программы.
; Тело программы
Exit:
MOV AH, 004Ch; Функция DOS выхода из программы
MOV AL, [exCode]; Возврат значения кода выхода
INT 21h; Вызов DOS. Останов программы.
END Start; Конец программы