#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();
}
выделение памяти в dos
Здраствуйте.У меня возникла нетривиальная задача - создать собственный менеджер кучи под Turbo C без использования функций из стандартных библиотек.Подскажите пожалуйста как получить адрес или выделить память под heap.
[/LEFT]
во первых у меня программа на C.во вторых этим я подключу к программе весь rtl - а у меня в нем надо только пара функций.И потом я хотел бы разобраться как всё это работает.
код такой:
[/LEFT]
Код:
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
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
локальные переменные в C храняться в стеке.после выхода из функции их значение теряется,в стеке освобождается от них место.если только они не объявлены как static - тогда они хранятся в области данных.из кучи программа динамически выделяет память
если кому-нибудь нужны вот функции для выделения памяти в 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
}
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
}