Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Signos y símbolos

De acuerdo, supongo que para estas alturas del partido ya les debió de quedar claro que la computadora solo conoce el cero y el uno y que con sus dichosas celditas de byte, de las cuales tiene miles de millones, puede almacenar numeritos. Que estos numeritos pueden representar cualquier cosa que se nos antoje y que para dar con cada una de estas mentadas celditas necesitamos saber un número que nos indica su posición en la memoria y que hasta ahora hay 8 celdotas de 32 bits que son las encargadas de subyugar a todas esas miles de millones de celditas de bytes. Por cierto, no hay manera de que el contenido de un registro general que es de 32 bits quepa en una celdita de 8 bits. Cuando escribimos el valor de un registro en memoria, este abarca 4 celdas de memoria. (8 bits de cada celda multiplicada por 4 de estas da 32 bits). Hay un concepto llamado Little Endian que deja claro en que orden se escriben los bits en estas celdas cuando pasan de la barrera de 8 bits, pero de eso hablaré en la siguiente entrada. A lo que voy es que en resumen, la computadora maneja puros números.

Sin embargo, a menos que estemos programando en código máquina puro (proceso largo y tedioso pero no imposible) o revirtiendo el código de alguien mas con fines no muy legales, no usamos posiciones de memoria en hexadecimal para intercambiar datos entre los registros y la memoria. En lugar de eso, usamos nombres como ‘sueldo’, ‘vidas’, ‘fecha’, ‘nombre’, etcétera. Existe un concepto llamado Tabla de Símbolos que asocia una palabra entendida por humanos con una posición de memoria en hexadecimal. De modo que a la hora de ensamblar el código, todos los lugares en los que se encuentra dicha palabra la cambia por su respectiva posición de memoria. Esto es bueno, pues a medida de que escribimos un código, dichas posiciones van cambiando de lugar. El nombre de una variable es un SIMBOLO, también lo son las etiquetas que se usan en instrucciones de control de flujo de programa, los nombres de las funciones, etc. En el programa PEDEMO.EXE tenemos una tabla de símbolos con únicamente 2 elementos:

Símbolo Valor

_caption 402000

_message 402017

Esta tabla nos dice que la cadena ASCII _caption comienza en la posición de memoria 402000. Mientras que la cadena ASCII _message comienza inmediatamente después de la anterio en la celda de memoria 402017. Debo de advertir que estas direcciones en realidad son virtuales. El tema de la memoria virtual es lo que permite a un programa disponer a una aplicación de 4 gigabytes de memoria anuque en realidad el equipo no los tenga y también es responsable de la multitarea y de que la lucecita del disco duro no se apague nunca cuando la memoria se satura pero eso ya es otro tema.

En el ejemplo de PEDEMO.EXE solo tenemos estos 2 símbolos. Pero en la práctica también tenemos los nombres de las funciones que se traducen como posiciones de memoria dentro del segmento de código. Haciendo referencia a la nota sobre el ‘Addressing’. Los valores en la tabla de símbolos corresponden a los números azules.

Otro detalle importante, estas direcciones son ABSOLUTAS dentro de la memoria. En la práctica la mayor parte de las posiciones de memoria son relativas a otros registros. Por ejemplo, dentro de un proceso con variables locales. Todos los valores son relativos a EBP. El problema es que la mayor parte de los procesos de sistema, entre ellos los de la API de Windows, usan direcciones absolutas. Este es un tema bastante avanzado, pero para quienes quieran investigar pueden buscar una instrucción que en apariencia no sirve para nada llamada LEA.

Otro concepto muy interesante y directamente relacionado con las tablas de simbolos es algo llamado Location Counter. El location counter es como un ‘odometro’ (para los que no saben que es un odómetro, es esa cosa integrada en el velocímetro de nuestro auto viejo que marca cuantos kilómetros ha recorrido. Internamente se usa para darle valor a los simbolos de esta tabla. Recuerdo que la primera vez que me topé con estos conceptos fue cuando intenté hacer mi propio compilador.

Para acabar este show, solo me resta resumir que a cada nombre de variable corresponde un número en hexadecimal que puede ser una posición de memoria (memory address) que puede ser absoluta o relativa a otra cosa. En notas venideras veremos con mas detalle como se mueven los datos entre la memoria y el CPU.

enero 7, 2009 Publicado por | Uncategorized | , , , | Deja un comentario

   

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 42 seguidores