• Lunes 18 de Noviembre de 2024, 16:50

Autor Tema:  Memoria Actual  (Leído 770 veces)

Hoodman

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Memoria Actual
« en: Lunes 21 de Junio de 2004, 15:36 »
0
Necesito hacer un programa usando codigo de C y/o Assembler que tenga una lista enlazada de n elementos. Los elementos de la lista se van a ir agregando automaticamente y cada vez que se agregue un elemento debo de imprimir en pantalla cuanta memoria queda en el sistema.

Mi problema esta en que no se que tipo de memoria se va ocupando cuando agrego un elemento a lista enlazada. El codigo que genera la lista ya lo hice, y le he puesto codigo que he encontrado a ver si me devuelve la memoria que queda. En todas la pruebas siempre me devuelve el mismo numero a veces 640k o dependiendo de la memoria que le asigne al programa atravez de windows. Por ejemplo le doy un click derecho en el archivo ejecutable de mi programa, en propiedades voy a memoria y le pongo en la memoria convencional un total de 80 y entorno inicial 256, y a toda las demas memoria que aparecen (extendida EMS y SMS) le pongo ninguna y entonces el codigo me devuelve 148k en vez de 640k.

Bueno para no hacerle el cuento mas largo hay le pongo unos de los codigo que he encontrado que me devuelve supuestamente la memoria disponible.

void set_xy(int x, int y)
{
union REGS r;

r.h.ah=2;
r.h.bh=0;
r.h.dh=y-1;
r.h.dl=x-1;
int86(0x10,&r,&r);
}

void _set_xy(char x, char y)
{
asm mov ah,02h // _AH=2
asm mov bh,0h // _BH=0
asm mov dh, y // _DH=y-1
asm dec dh
asm mov dl, x // _DL=x-1
asm dec dl
asm int 10h
}

int get_memory_size(void)
{
union REGS r;

int86(0x12,&r,&r);
return(r.x.ax); // kbyte
}

int _get_memory_size(void)
{
asm int 12h

return(_AX);
}

int put_print(char ch)
{
union REGS r;

r.h.ah=0;
r.h.al=ch;
int86(0x17,&r,&r);
return(r.h.ah); // Status code
}

int _put_print(char ch)
{

_AH=0;
_AL=ch;
asm int 17h;

return(_AH);
}

void main(void)
{
int h,m,s,s100;

set_xy(5,5); printf("dfghjkl\n");
_set_xy(10,10);printf("123456789\n");
printf("Memory size = %dkbyte.\n",get_memory_size());
printf("Memory size = %dkbyte.\n",_get_memory_size());
put_print('A');
_put_print('B');
getch();
}

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Memoria Actual
« Respuesta #1 en: Lunes 21 de Junio de 2004, 18:00 »
0
lamentablemente esos codigos que has conseguido no funcionan en ningun sistema operativo moderno, maximo te funcionaran en windows ME, ya que en 2000, nt, xp etc.. no te va a funcionar ya que ninguno de ellos posee la estructura del dos, y por lo mismo no funcionan ni las interrupciones del DOS, ni el uso de los registros del DOS, y mucho menos se puede acceder desde assembler a las interrupciones ya que los nuevos sistemas no lo permiten..
todo lo que quieras hacer a ese nivel debes hacerlo a travez de la API de windows.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io