Программа содержит 3 сегмента: сегмент стека, сегмент данных и сегмент команд. Каждый сегмент открывается директивой SEGMENT а закрывается директивой ENDS.
Директива ASSUME устанавливает для Ассемблера соответствие между конкретными сегментами и сегментными регистрами.
Для любого загрузочного модуля в оперативной памяти выделяется специальная область размером в 256 Байт. Эта область выделяется перед размещением программы, обозначается PSP и называется префикс программного сегмента. Начальный адрес области PSP загружается в регистр DS при запуске загрузочного модуля.
Так как программа будет использовать регистр DS для своих целей, то она должна сохранить начальный адрес PSP в стековой памяти. Эту операцию выполняет команда PUSH DS.
Команда SUB AX,AX выполняет вычитание AX – AX = 0. Это позволяет получить число 0 в регистре AX.
Команда PUSH AX записывает число 0 из регистра AX в стековую память.
Следующая команда MOV AX,DATASG записывает начальный адрес сегмента данных в регистр AX.
Команда MOV DS,AX переписывает начальный адрес сегмента данных из регистра AX в регистр DS.
Начальный адрес сегмента команд и начальный адрес сегмента стека автоматически загружаются в регистры CS и SS соответственно при запуске загрузочного модуля.
Таким образом, в исходном модуле программа всегда должна начинаться с 5 перечисленных команд для определения сегмента данных.
Последней командой программы должна быть команда RET, которая восстанавливает начальный адрес PSP в регистре DS из стека и обеспечивает выход из программы.
Далее директива ENDP закрывает основную процедуру, а директива ENDS закрывает сегмент команд.