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

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

  1. Skycorner

    Skycorner New Member

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

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

    Ultrin Faern New Member

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

    Skycorner New Member

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

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

    Skycorner New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    21
    Извините, если немного не в тему вопрос. Подскажите, почему данный код:
    Код (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
    Регистрация:
    7 май 2007
    Сообщения:
    21
    ну или подскажите литературу по дин. памяти ):
     
  6. Ultrin Faern

    Ultrin Faern New Member

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

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

    Skycorner New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    21
    Большое спасибо. Еше б неделю искал ошибку :)
     
  8. Ultrin Faern

    Ultrin Faern New Member

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