Комментарии 16
Вы, возможно, помните, что файлам .com при запуске неявно предоставляется вся оставшаяся доступная память, предназначенная для обработки соглашений. Программы могут освободить эту память обратно системе, если хотят сделать её доступной для других программ.
Нет, не помним. Программы для DOS ничего просто так не получали, особенно такие простые, как com-программы. Неявно предоставленная память могло подразумеваться, что программа могла вызвать API DOS или EMM, XMM для выделения дополнительных блоков памяти для своей работы. Но это не давалось просто так, надо было явно попросить выделить память.
DOS была однозадачной и вызов программы из программы был реализован по принципу матрёшки. Т.е. при запуске новой программы ваша замирала до завершения вызванной, а вызванная работала в пределах оставшейся неиспользуемой памяти.
Так что что именно делал win.com остаётся непонятным. Возможно он выделял память, чтобы загрузить ядро Windows, которое переключалось в защищённый режим и загружало остальные части Windows. Возможно при перезапуске по каким-то причинам win.com освобождал эту память, чтобы тут же снова попытаться её выделить.
Ну я тоже не помню, да и никогда не знал, но простой поиск в Интернете доказывает всё-таки правоту Чена: исполняемые файлы в формате EXE указывают в заголовке сколько памяти им нужно преаллоцировать, .COM файлы слишком просты и не имеют такого заголовка, поэтому DOS выделяет им памяти по максимуму:
The absence of a header leaves MS-DOS with no way of knowing how much memory the .COM program requires in addition to the size of the program's image. Therefore, MS-DOS must always allocate the largest free block of memory to the .COM program, regardless of the program's true memory requirements. As was discussed for .EXE programs, this allocation of the largest block of free memory usually results in MS-DOS's allocating all remaining free memory--an action that can cause problems for multitasking supervisor programs.
Section II: Programming in the MS-DOS Environment
Собственно доступ к предвыдкеленной памяти осуществлялся через структуру PSP.
Так это exe, а он пишет - com, да ещё и написанный на ассемблере. Надо кому-нибудь посмотреть что там в заголовке win.com, есть MZ или нет...
По com надо отдельно смотреть что он там выделяет. По умолчанию com должен укладываться в пределах своего 64kb - 256 байт. Теоретически никто не мешает обратиться к менеджеру памяти DOS, но смысл? Проще тогда exe делать, благо он для этого и существует.
Собственно вот карта памяти, com получает свои 64 кб памяти и всё...

com загружается в один сегмент (и не должен быть больше 64кб - 256байт). Но программе доступна вся DOS-память. Можно культурно попросить у DOS-а адреса свободной памяти такого-то размера. А можно просто считать, что выше сегмента в который загружен com - память не занята, и ее можно использовать. Как правило так и есть, хотя теоритически есть риск пересечься с памятью которую юзает какой-то резидент. DOS ведь за этим не следит.
И да, речь конечно о 640кб конвенциональной памяти.
Ну так я об этом и писал. По этому и не понятно что там и кому отдаёт com-программа. Лучшая догадка - что win.com всё-таки явно выделяет память через int 21h, чтобы драйверы и резиденты реального режима случайно туда не сунулись.
вы хотели сказать "свыше 640К"?
Но вообще, можно. Менеджер памяти ведь тоже программа :) Так что ничто не мешает и самостоятельно делать то, что делает тот же HIMEM.SYS (гугли unreal mode).
COM-программа собственно ничем особо не ограничена. Она может и защищенный режим процессора включить, и даже многопоточность использовать.
если же вы таки имели ввиду 64кб, то почитайте про адресацию памяти в Real mode. Адрес состоит из двух частей: адрес сегмента и смещения внутри него. Так что обращаться можно ко всей дос-памяти.
В смысле? У вас регистры кто-то отнял? ;-) В DOS защиты памяти нет - откуда хочешь, оттуда читай.
Что такое
память, предназначенная для обработки соглашений
? Не помню такого, хотя резидентов писал, было время
да это "гугл транслэйт". "Охладите траханье, уголёк" (с)
В исходном тексте "convention memory", т. е. первые 640к.
Вы, возможно, помните, что файлам .com
Прекрасно помню, что 64 КБ максимум и в этом своя прелесть была когда пишешь на ассемблере, не нужны были всякие пляски

Рэймонд Чен объяснил работу старого трюка в Windows 95 по перезапуску ПК через зажатие Shift