Использование нескольких сегментов данных

Тема в разделе "WASM.BEGINNERS", создана пользователем Skycorner, 3 июн 2007.

  1. Skycorner

    Skycorner New Member

    Публикаций:
    0
    Подскажите, существует ли какая-то функция DOS дополнительного выделения еще одного сегмента данных, помимо уже указаного в заголовке EXE-файла? Может есть какие-то заранее известные свободные сегменты в адресной памяти DOS (кроме видеобуффера)? Заранее благодарен

    P.S. нужно для программы на паскале, там, насколько мне известно, модель памяти менять нельзя.. или можно?
     
  2. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    В паскале модель памяти менять нелзя. Но в нем-же есть функции выделения памяти (GetMem/FreeMem) которые выделяют память за пределами сегмента данных.
     
  3. Skycorner

    Skycorner New Member

    Публикаций:
    0
    Ну а можно как-то "попросить" у загрузчика ДОС выделить сегмент данных, как это происходит при старте екзешника?
    И еще хотел спросить по поводу кучи: это структура ДОСа, или Паскаля? Есть какие-то ограничения на ее размер? Если да, то кем и где они устанавливаются?

    p.s. Вся проблема в том, что мне нужно, чтоб данные хранились линейно, а не кусками, как это происходит в куче
     
  4. Skycorner

    Skycorner New Member

    Публикаций:
    0
    Извините, если немного не в тему вопрос. Подскажите, почему данный код:
    Код (Text):
    1. var h:pointer; hofs, hseg:word;
    2. begin
    3.   allocamem(h,2)
    4.   hofs:=ofs(h^);
    5.   hseg:=seg(h^);
    6.   asm
    7.     push ds
    8.       mov ax, hseg
    9.       mov ds, ax
    10.       mov di, hofs
    11.       mov ds:[di+1], 14
    12.     pop ds
    13.   end;
    14.   writeln(byte(ptr(hseg, hofs+1)^));
    15. freemem(h, 2);
    16. end.
    Выводит не число 14, а число из какой-то другой области памяти. Что-то во всех учебниках TPascal написано, что цельные блоки в дин. памяти хранятся линейно, без дырок, и что указатель h в данном случае должен указывать на 1-й байт выделенной памяти.. А он не указывает.. Что может быть не так?
     
  5. Skycorner

    Skycorner New Member

    Публикаций:
    0
    ну или подскажите литературу по дин. памяти ):
     
  6. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Выделенная память хранится линейно (гы! :) ).

    В твоем коде ошибка. Дело в том, что переменная hofs адресуется относительно регистра ds, который ты в предыдущей команде ПОМЕНЯЛ. И соответсвенно ты пишешь число "14" непонятно куда.
     
  7. Skycorner

    Skycorner New Member

    Публикаций:
    0
    Большое спасибо. Еше б неделю искал ошибку :)
     
  8. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Совет на будущее - в паскале не трогай регистр ds. Есть же куча других - es (а если у тебя не 8086 процессор то и fs gs) их вполне достаточно.