А что если код с данными в таком .com файле занимают >64кб?
В COM-программах нет раздельных сегментов кода, данных, стека и т.д. -- там всё в одном сегменте. В частности, указатель стека по умолчанию установлен на конец сегмента (стек растёт вниз). То есть, после загрузки системой COM-фала, соотв. сегмент в памяти будет выглядеть так:
Код:
0 PSP
100h код
данные
...
FFFFh конец стека
Размер сегментов в реальном режиме фиксирован -- 64 кб. Следовательно, не бывает COM-программ больших 64 кб.
Если нужно больше, вам нужен формат EXE. В этом случае данные, код и стек можно раскидать по разным сегментам.
Учтите, что система при загрузке исполняемого файла устанавливает только регистр cs (code segment), указывающий на тот сегмент, где будет код (то есть куда указывает IP). Сегменты данных (ds) и др. вы должны инициализировать вручную. Это должно быть в вашем учебнике.
Модель tiny -- это для COM (где один сегмент для всего). В модели small два сегмента: в одном код, во втором данные и стек.
"No stack" -- это, видимо, предупреждение, а не ошибка. Можно игнорировать, я думаю. Но лучше успокоить компилятор, указав размер стека директивой .stack.