"Роберт Джордайн. Справочное пособие программиста - 2 (ассемблер, операционная система MS DOS)" - читать интересную книгу автора

таком виде, что не нуждаются в фиксации сегмента. Все в программе
хранится относительно начала кодового сегмента, включая все дан-
ные и стек. По этой причине вся программа не может превышать
65535 байт по длине, что соответствует максимальному смещению,
которое существует в используемой схеме адресации (поскольку
верхняя часть этого блока занята стеком, то реальное пространство
доступное для кода и данных немного меньше чем 65535 байт, хотя
стековый сегмент при необходимости может быть вынесен за границу
64K байтного блока). В файлах COM все сегментные регистры указы-
вают на начало PSP; сравните с файлами EXE, где DS и ES инициали-
зируются аналогичным образом, но CS указывает на первый байт
следующий за PSP.
Для представления программы в виде файла COM требуется соблю-
дение следующих правил:

1. Не оформляйте программу в виде процедуры. Вместо этого,
поместите в самое начало метку, вроде START, и завершите програм-
му оператором END START.

2. Поместите в начале программы оператор ORG 100H. Этот опера-
тор указывает начало кода (т.е. устанавливает счетчик комманд).
Программы COM начинаются с 100H, что является первым байтом,
следующим за PSP, поскольку CS указывает на начало PSP, которое
расположено на 100H байт ниже. Для того чтобы начать выполнение с
любого другого места поместите по адресу 100H инструкцию JMP.

3. Оператор ASSUME должен устанавливать DS, ES и SS таким
образом, чтобы они совпадали со значением для кодового сегмента,
например, ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG.

4. Данные программы могут помещаться в любом месте программы,
до тех пор, пока они не перемешаны с кодом. Лучше начинать прог-
раммы с области данных, поскольку макроассемблер может выдавать
сообщения об ошибках при первом проходе, если имеются ссылки на
идентификатор данных, который еще не обнаружен. Для перехода к
началу кода используйте в качестве первой команды программы инст-
рукцию JMP.

5. Нельзя использовать фиксацию сегментов типа MOV AX,SEG
NEW_DATA. Достаточно указания одного смещения метки. В частности,
нужно опускать обычный код, используемый в начале программы для
установки сегмента данных, MOV AX,DSEG / MOV DS,AX.

6. Стековый сегмент полностью опускается в начальном коде.
Указатель стека инициализируется на вершину адресного пространст-
ва 64K, используемого программой (напоминаем, что стек растет
вниз в памяти). В программах COM он должен быть сделан меньше чем
64K, SS и SP могут быть изменены. Имейте ввиду, что при компонов-
ке программы компоновщик выдаст сообщение об ошибке, указывающее,
что сегмент стека отсутствует. Игнорируйте его.