Подскажите, существует ли какая-то функция DOS дополнительного выделения еще одного сегмента данных, помимо уже указаного в заголовке EXE-файла? Может есть какие-то заранее известные свободные сегменты в адресной памяти DOS (кроме видеобуффера)? Заранее благодарен P.S. нужно для программы на паскале, там, насколько мне известно, модель памяти менять нельзя.. или можно?
В паскале модель памяти менять нелзя. Но в нем-же есть функции выделения памяти (GetMem/FreeMem) которые выделяют память за пределами сегмента данных.
Ну а можно как-то "попросить" у загрузчика ДОС выделить сегмент данных, как это происходит при старте екзешника? И еще хотел спросить по поводу кучи: это структура ДОСа, или Паскаля? Есть какие-то ограничения на ее размер? Если да, то кем и где они устанавливаются? p.s. Вся проблема в том, что мне нужно, чтоб данные хранились линейно, а не кусками, как это происходит в куче
Извините, если немного не в тему вопрос. Подскажите, почему данный код: Code (Text): var h:pointer; hofs, hseg:word; begin allocamem(h,2) hofs:=ofs(h^); hseg:=seg(h^); asm push ds mov ax, hseg mov ds, ax mov di, hofs mov ds:[di+1], 14 pop ds end; writeln(byte(ptr(hseg, hofs+1)^)); freemem(h, 2); end. Выводит не число 14, а число из какой-то другой области памяти. Что-то во всех учебниках TPascal написано, что цельные блоки в дин. памяти хранятся линейно, без дырок, и что указатель h в данном случае должен указывать на 1-й байт выделенной памяти.. А он не указывает.. Что может быть не так?
Выделенная память хранится линейно (гы! ). В твоем коде ошибка. Дело в том, что переменная hofs адресуется относительно регистра ds, который ты в предыдущей команде ПОМЕНЯЛ. И соответсвенно ты пишешь число "14" непонятно куда.
Совет на будущее - в паскале не трогай регистр ds. Есть же куча других - es (а если у тебя не 8086 процессор то и fs gs) их вполне достаточно.