Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

выделение памяти в dos

25K
01 апреля 2007 года
alex4
8 / / 04.03.2007
Здраствуйте.У меня возникла нетривиальная задача - создать собственный менеджер кучи под Turbo C без использования функций из стандартных библиотек.Подскажите пожалуйста как получить адрес или выделить память под heap.
502
01 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]А чем не устраивает стандартный? new, delete и всё, никаких проблем с выделением памяти.
[/LEFT]
25K
01 апреля 2007 года
alex4
8 / / 04.03.2007
во первых у меня программа на C.во вторых этим я подключу к программе весь rtl - а у меня в нем надо только пара функций.И потом я хотел бы разобраться как всё это работает.
25K
01 апреля 2007 года
alex4
8 / / 04.03.2007
код такой:
vout.h - это собственная библиотечка для вывода в видеопамять
Код:
#include "vout.h"
void far*GETMEM(DWORD size)
 {
 DWORD r;
 _BX=size>>4+1;
 _AH=0x48;
 asm int 0x21
 asm jc ret0
 r=_AX;
 r<<=4;
 return (void far*)r;
 ret0:return (void far*)NULL;
 }
void FREEMEM(void far*mem)
 {
 asm push es
 _ES=(DWORD)mem>>4;
 _AH=0x49;
 asm int 0x21
 asm pop es
 }
main()
 {
 DWORD cs,ds,ss,es,mem1,mem2,mem3,size,endprog;
 cs=_CS;ds=_DS;ss=_SS;es=_ES;
 mem1=(DWORD)GETMEM(10);mem1>>=12;
 mem2=(DWORD)GETMEM(10);mem2>>=12;
 mem3=(DWORD)GETMEM(10);mem3>>=12;
 SetTxtMode();
 vCR();
 vPut("CS: ");vPut(l2s(cs<<4));
 vPut(" DS: ");vPut(l2s(ds<<4));
 vPut(" SS: ");vPut(l2s(ss<<4));
 vPut(" ES: ");vPut(l2s(es<<4));
 _AH=0x51;
 asm int 0x21
 asm push es
 asm mov es,bx
 asm mov ax,es:2
 asm pop es
 endprog=_AX;endprog<<=4;
 vPut(" END IMAGE: ");vPut(l2s(endprog));
 vCR();vPut("GETMEM(10) 1: ");vPut(l2s(mem1));
 vPut(" GETMEM(30) 2: ");vPut(l2s(mem2));
 vPut(" GETMEM (1000) 3: ");vPut(l2s(mem3));
 FREEMEM((void far*)(mem3<<12));vCR();vPut("FREEMEM 3 ");
 FREEMEM((void far*)(mem2<<12));vPut(" FREEMEM 2 ");
 mem2=(DWORD)GETMEM(10);mem2>>=12;
 vCR();vPut("GETMEM(1000) 2: ");vPut(l2s(mem2));
 FREEMEM((void far*)(mem3<<12));vCR();vPut("FREEMEM 3 ");
 FREEMEM((void far*)(mem2<<12));vPut(" FREEMEM 2 ");
 FREEMEM((void far*)(mem1<<12));vPut(" FREEMEM 1 ");
 size=MEMSIZE();vCR();vPut("MEMSIZE() : ");vPut(l2s(size));
 mem3=(DWORD)GETMEM(size);mem3=HIWORD(mem3);mem3<<=4;
 vCR();vPut("GETMEM(MEMSIZE()) : ");vPut(l2s(mem3));
 size=MEMSIZE();vCR();vPut("MEMSIZE() : ");vPut(l2s(size));
 mem2=(DWORD)GETMEM(size);mem2=HIWORD(mem3);mem2<<=4;
 vCR();vPut("GETMEM(MEMSIZE) 2: ");vPut(l2s(mem2));
 size=MEMSIZE();vCR();vPut("MEMSIZE() : ");vPut(l2s(size));
 mem2=(DWORD)GETMEM(size);mem2=HIWORD(mem3);mem2<<=4;
 vCR();vPut("GETMEM(MEMSIZE) 2: ");vPut(l2s(mem2));
 size=MEMSIZE();vCR();vPut("MEMSIZE() : ");vPut(l2s(size));
 ReadKey();
 }
502
01 апреля 2007 года
Jail
550 / / 30.01.2007
[LEFT]Как Вам известно куча и нужна для того, что бы при выходе из функции, локальные переменные автоматически не удалялись, а оставалась память выделенная под них в области кучи. Указатель указывает на эту память. Я думаю можно обойтись и проще, не вижи причин для использования кучи в Си. Помоему это вобще излишняя бирюлька, так же как и объединения (хотя иногда бывают полезны, как раз в распределителях памяти).
[/LEFT]
25K
01 апреля 2007 года
alex4
8 / / 04.03.2007
результат:
Код:
CS: 586000 DS: 589632 SS: 589632 ES: 589632 END IMAGE: 655344
GETMEM(10) 1: 8 GETMEM(30) 2: 8 GETMEM (1000) 3: 8
FREEMEM 3  FREEMEM 2
GETMEM(1000) 2: 8
FREEMEM 3  FREEMEM 2  FREEMEM 1
MEMSIZE() : 752
GETMEM(MEMSIZE()) : 16
MEMSIZE() : 368
GETMEM(MEMSIZE) 2: 0
MEMSIZE() : 176
GETMEM(MEMSIZE) 2: 0
MEMSIZE() : 160
25K
01 апреля 2007 года
alex4
8 / / 04.03.2007
локальные переменные в C храняться в стеке.после выхода из функции их значение теряется,в стеке освобождается от них место.если только они не объявлены как static - тогда они хранятся в области данных.из кучи программа динамически выделяет память
25K
02 апреля 2007 года
alex4
8 / / 04.03.2007
спасибо всем кто читал этот топик.я уже нашел ошибку.
если кому-нибудь нужны вот функции для выделения памяти в dos.
работает под turbo c 3.0 в модели памяти small
Код:
#define DWORD unsigned long

DWORD MEMSIZE()
 {
 DWORD r;
 _BX=0xffff;
 _AH=0x48;
 asm int 0x21
 asm jnc reterr
 r=_BX;
 return r<<4;
 reterr:return 0;
 }
void far*GETMEM(DWORD size)
 {
 DWORD r;
 _BX=size+15>>4;
 _AH=0x48;
 asm int 0x21
 asm jnb succ
 _AX=0;succ:
 r=_AX;
 r<<=16;
 return (void far*)r;
 }
void FREEMEM(void far*mem)
 {
 asm push es
 _ES=(DWORD)mem>>16;
 _AH=0x49;
 asm int 0x21
 asm pop es
 }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог