Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Avenida RAM

–Direccionamiento de la Memoria Para Dummies–

Los ancianos de Estados Unidos tiene una simpática expresión para describir esas conversaciones nostálgicas de los años pasados: “Memory Lane”, lo que se traduciría como “camino de los recuerdos”. Sin embargo, tal término es perfecto para explicarle a un principiante como demonios funciona la memoria de una computadora. Hace muchas notas se dijo que la memoria de una computadora es similar a un enorme array de bytes que es tan grande como la capacidad de la propia memoria. Pero como se supone que ustedes son principiantes voy a explicarlo de una forma mas ‘amigable con el usuario’.

###Poner aqui el dibujo 1###

Este es un dibujo de la Avenida RAM. Se trata de una muy larga carretera con casitas a un lado. Cada casa se identifica por su número que es único e irrepetible. Es decir que no hay 2 o mas casas con el mismo número en esta calle. Dentro de estas simpáticas casitas viven los bytes, como ya saben (y si no lean la nota llamada “Cuantos Bits tiene un Byte” )los bytes pueden almacenar un nu\mero entero ente 0 y 255 porque tienen 8 bits. Como estas casitas son tan pequeñas solo puede vivir un byte en cada una de ellas. Aunque como buenos vecinos, algunos se ponen de acuerdo para trabajar juntos cuando se trata de representar cantidades mas grandes. Aunque esto se verá un poco mas adelante en esta nota. Por ahora hay que dejar claro ese concepto de “Direccionamiento” o “Addressing”

En idioma inglés, la palabra “Address” se traduce como “Domicilio” y la terminación “-ing” singifica el llevar a cabo una acción. Entonces el concepto de “Addressing” se traduce como “La acción de ubicar un domicilio dado” pero como esto es muy largo en idioma español la mayoría de los profesores usan el extraño término de “Direccionamiento”. Este término es sumamente confuso porque puede interpretarse como si la memoria pudiera moverse hacia una dirección en particular. Yo personalmente prefiero usar el término “Posicionamiento” porque da la idea de algo que busca colocarse en un espacio dado. Ahora sigamos con el asunto de la Avenida RAM.

Normalmente a uno no le interesa la casa de otras personas(a menos que seamos ladrones), sino el hecho de saber donde se encuentran para ir a visitarlas. Para llegar al domicilio de alguien necesitamos saber donde vive, por ejemplo la colonia, calle y número. Esta clase de datos normalmente se guardan en una agenda o libreta de direcciones. Una entrada de una de estas agendas puede verse así:

Nombre: Rosa Mesta

Domicilio: #700 de la Avenida Palo Alto

Ahora, dentro de la memoria RAM lo que almacenamos son datos. Y auque la computadora puede manejar números como posiciones de memoria sin ningún problema este no es el caso de los programadores tradicionales. Y al igual que la entrada de la Agenda anterior, tenemos un nombre (de variable) y su “Domicilio”:

Nombre: Salario

Domicilio: #1234 de la Avenida RAM

Entonces, supongamos que queremos llegar a donde está la variable salario. Para llegar ahí recorremos toda la Avenida RAM hasta llegar frente a la casa marcada con el número 1234. Al llegar ahí, quien vive en el número 1234 nos va a dar la información del salario, que en este caso es bastante cercano al mio:

###Poner aqui el dibujo 2

Un error bastante común es confundir el número que representa una localidad de memoria con la cantidad que esta almacena. Esto es como confundir a una persona con su casa. Pero pasa muy a menudo al manejar los famosos PUNTEROS. Para quienes tengan algo de experiencia programando en C/C++ tienen una vaga idea de lo que estoy hablando. De nuevo no me gusta el término puntero porque se presta a ambiguedad en español. En inglés esta palabra es “Pointer” y aunque no se exactamente lo que significa estoy seguro que no tiene nada que ver con cualquiera de las definiciones en español que hasta ahora he encontrado. Pues su significado es marcar una posición de memoria específica y no indicar una dirección a la que hay que moverse. Ahora volvamos con la analogía de la calle y la agenda:

Lo primero que hay que dejar en claro antes de continuar es que en Ensamblador no existe el concepto de “Tipo de datos” el contenido de un registro de CPU o de una localidad de memoria puede significar cualquier cosa porque para la computadora todos son números binarios, así que es posible hacer cosas locas como restar letras, usar cualquier variable como un puntero o revolver diferentes tipos de datos que no tienen nada que ver entre si. De lo único que hay que preocuparse es que los datos tengan el mismo ancho en bits y aún así hay muchas excepciones a esta regla. Ahora sigamos con los punteros.

No se si a ustedes les haya pasado que van a visitar a alguien que no habían visto en años y al tocar a la puerta los recibe un completo desconocido y les dice que la persona que buscan se casó, cambió de sexo, se fue de misionero al tercer mundo, tuvo hijos (en ese orden) y ahora vive feliz con su nueva pareja en un lugar muy lejano. Luego de eso el desconocido nos da la nueva dirección de la persona que ibamos a ver, y ya si luego de haber escuchado todo lo anterior aun queremos visitarle; pues anotamos en la agenda esos datos y vamos al nuevo domicilio.

###Poner aqui el dibujo 3###

Como ya se dijo, lo único que pueden almacenar las celdas de memoria son números; el significado de esos números no le interesa a la computadora; pero si a nosotros. Entonces, del mismo modo que la información que usamos la información dada por el desconocido para ubicar el nuevo domicilio de la persona que queremos encontrar, en programación podemos usar numero contenido en esta celda de memoria para ubicar la siguiente. Por ejemplo, si buscábamos a Rosa Mesta en el #700 de la Avenida RAM pero nos dicen que ahora vive en el #6941 de la misma calle, vamos al domicilio marcado con el #6941 a buscar a Rosa Mesta.

Esto niños, es lo que se conoce como “Puntero” una celda de memoria cuyo contenido se interpreta como la posición de una celda de memoria. Pero como nosotros programamos en Ensamblador tal cosa no es mas que una celda de memoria con un simple número que no se diferencia en nada de las otras miles de millones de celdas en una memoria convencional.

Pues esta nota ya quedó demasiado larga y aún no acabo de subirle todos los dibujos, espero continuarla mas adelante; algunas de las cosas que veremos serán los “memory alignment”, la verdadera razón por la que las posiciones de memoria se deben de escribir en Hexadecimal, el manejo de los registros generales como punteros y detalles importantes de los accesos eficientes a la memoria.

octubre 19, 2009 - Posted by | Uncategorized | , ,

1 comentario »

  1. IMPRESIONANTE Y SENCILLA ADMIRABLE EXPLICACION!!!

    Comentario por Luis | febrero 20, 2014 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: