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

Discussion in 'WASM.BEGINNERS' started by Skycorner, Jun 3, 2007.

  1. Skycorner

    Skycorner New Member

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

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

    Ultrin Faern New Member

    Blog Posts:
    0
    Joined:
    Jun 25, 2006
    Messages:
    170
    В паскале модель памяти менять нелзя. Но в нем-же есть функции выделения памяти (GetMem/FreeMem) которые выделяют память за пределами сегмента данных.
     
  3. Skycorner

    Skycorner New Member

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

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

    Skycorner New Member

    Blog Posts:
    0
    Joined:
    May 7, 2007
    Messages:
    21
    Извините, если немного не в тему вопрос. Подскажите, почему данный код:
    Code (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

    Blog Posts:
    0
    Joined:
    May 7, 2007
    Messages:
    21
    ну или подскажите литературу по дин. памяти ):
     
  6. Ultrin Faern

    Ultrin Faern New Member

    Blog Posts:
    0
    Joined:
    Jun 25, 2006
    Messages:
    170
    Выделенная память хранится линейно (гы! :) ).

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

    Skycorner New Member

    Blog Posts:
    0
    Joined:
    May 7, 2007
    Messages:
    21
    Большое спасибо. Еше б неделю искал ошибку :)
     
  8. Ultrin Faern

    Ultrin Faern New Member

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