TEIMSI
Plataforma del desarrollador de textos programados
Inicio|Utilidades|Foro|Documentación

Indice de contenido -> Capítulo 19 - Introducción al uso de funciones para el manejo de memoria


Teismi incorpora funciones para el manejo de memoria, es importante saber que un objeto de cadena es referenciado mediante un número (manejador) entero largo de 32 bits sin signo. Un objeto de cadena se aloja internamente en un espacio que la función NwMemory en ensamblador crea, para programar lo básico y necesario a saber es el uso de las siguientes tres funciones:

1- NwMemory

2- NwMemoryResize

3- NwMemoryFree_p

La función NwMemory crea un espacio en memoria y devuelve un manejador (eso es un número entero de 32 bits) que se utiliza para acceder al espacio asignado. Las funciones de memoria se las arreglan para administrar cadenas con tan solo dos funciones del sistema operativo (GlobalAlloc y GlobalFree en Win * 2000/XP/7/...), si se requiere un espacio que exceda el límite interno disponible del búfer, se utiliza el sistema de archivos para ayudarse a redimensionar y reconstruir el búfer de cadenas. Además toda llamada a NwMemory garantiza buenas posibilidades de funcionar si no se excede el límite de memoria física disponible en el sistema, en caso contrario si falla se considera un error fatal: el programa muestra el error y termina. El general es difícil que un programa exceda el límite.

El siguiente código muestra un ejemplo de buen uso de las funciones de memoria solamente con ensamblador.


_direct{
	call2 NwMemory, 10000
		;	eax ahora contiene el manejador del espacio de 10000 bytes.

	call2 NwMemoryResize, eax, 1000000, -1		;	Redimensiona el espacio asignado previamente a 1000000 bytes. El -1 indica que no se
									;	quiere preservar ningún byte del espacio original (de otra forma se debe indicar cuantos bytes se 
									;	copiarán del espacio original de 10000 bytes empezando desde el inicio).

	push eax						;guarda en la pila eax
		NWPOS_eaxedi				;guarda en el espacio de 1000000 de bytes los caracteres "?"
		mov ecx, 1000000
		mov eax, "????"

		mov ebx, ecx
		shr ecx, 2
		and ebx, 3
		rep stosd
		mov ecx, ebx
		rep stosb

	pop  eax						;recupera el manejador
	call2 NwMemoryFree_p, eax			;libera el espacio en memoria.
}

La llamada a la función NwMemoryFree_p, puede haber sido reemplazado por la macro NwMemoryFree, la cual realiza lo mismo que la función. Quedaría entonces:

NwMemoryFree eax

No es necesario llamar a NwMemory para asignar espacio con TEIMSI, para eso está la función "makestring", el siguiente ejemplo muestra su uso:


	var miespacio=makestring(1000000);		//	makestring crea una cadena de caracteres chr(0) repetidos uno tras otro.
	_direct{
		mov eax, [miespacio+reg.vo]		;	carga el manejador de la cadena.
		NWPOS_eaxedi				;	determina el puntero a la cadena poniéndolo en el registro edi.

		mov ecx, [miespacio+reg.nu]		;	carga la longitud de la cadena, =1000000

		mov eax, "????"				;	guarda en la misma los caracteres "?" repetidos un millón de veces.
		mov ebx, ecx
		shr ecx, 2
		and ebx, 3
		rep stosd
		mov ecx, ebx
		rep stosb
	}
	miespacio=undefined;				//	libera la cadena en memoria.


El siguiente ejemplo hace lo anterior, con mayor lentitud pero con sólo dos instrucciones:

	var miespacio=str_repeatn("?", 1000000)		//	Crea la cadena
	miespacio=undefined;					//	libera la cadena en memoria.

Otras macro instrucciones similares a "NWPOS_eaxedi" se muestran a continuación:

NWPOS_ebxedi ; pone en el registro edi el puntero a la cadena cuyo manejador está en ebx.

NWPOS_eax ; pone en el registro esi el puntero a la cadena cuyo manejador está en eax.

NWPOS_ebx ; pone en el registro esi el puntero a la cadena cuyo manejador está en ebx.

NWPOS_regarea lparea ; pone en el registro esi el puntero a la cadena cuyo puntero a la estructura de la variable está en "lparea"

; la utilidad de la macro es que puede obtenerse el puntero también de una variable tipo cadena en modalidad estática.

; por más información sobre modalidades ver capítulo "Variables de TEIMSI".

NWPOS mindex ; pone en el registro esi el puntero a la cadena cuyo manejador está en un registro arbitrario indicado por "mindex"

NWLEN mindex ; pone en el registro ecx la longitud interna que se ha asignado para la cadena indicada según el manejador está

; en un registro arbitrario indicado por "mindex". La longitud interna es algo mayor (usualmente 256 bytes) que la longitud

; brindada por propiedad de la variable, su cometido de existencia es para las funciones de ensamblador de manejo de cadenas

; en la memoria (que a su vez realizan optimizaciones y alojamiento de espacio para cadenas).

MACRO NWPOSLEN mindex ; pone en el registro esi el puntero a la cadena y pone en el registro ecx la longitud interna que se ha asignado

; para la cadena indicada según el manejador que está en un registro arbitrario indicado por "mindex". (ver NWLEN)



Volver arriba