Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación NO Secuencial

–Saltos dentro del código–

Programar en Ensamblador es muy parecido a construir una de esas pistas de carreras eléctricas de juguete. Uno va agregándole tramos a la pista, pone rizos, saltos y desviaciones. Una vez que uno construyó el camino a su antojo coloca el auto eléctrico a escala sobre los rieles cargados y este avanza a toda velocidad. Si nuestro diseño de pista es bueno, el auto correrá sin problemas pero si cometimos un error, lo mas probable es que se atasque o hasta salga disparado contra la pared del cuarto.

En el caso de la programación. El auto eléctrico sería el CPU, la mesa donde construimos la autopista sería la memoria y las piezas con la que la construimos las instrucciones. Dependiendo de las instrucciones que le dictemos el CPU puede avanzar velozmente sobre ellas o atascarse. Puede cambiar de carril e incluso saltar desde un tramo de la pista a otro por medio de rampas. Esta nota trata sobre este aspecto. La programación no secuencial.

Primero revisemos el concepto de salto. El CPU lee las instrucciones de modo secuencial y cuando se topa con una instrucción JMP, carga el operando de esta instrucción en el EIP (Extended Instruction Pointer) y salta hacia esa parte de la memoria. Dependiendo de la instrucción, el salto puede ser pequeño y brincar sobre unos pocos bytes, o tan grande que lance al CPU al otro lado de la memoria de la computadora. En la siguiente ilustración vemos una representación de los saltos usando el ejemplo de la pista de carreras:


rampa

Como se puede ver hay 2 clases de saltos, unos son los saltos incondicionales, cuando el CPU llega a una de estas instrucciones salta a donde se le indica; esta instruccion es JMP y puede tener gran alcance. Por otra parte hay saltos condicionales que pueden o no ejecutarse dependiendo de si se cumple o no una condición. Quien decide si un salto se ejecuta o no es el registro banderas.

Sin embargo, hay una controversia en el uso de la instrucción JMP. Pues su funcionamiento es idéntico al viejo GOTO de Basic, y cualquiera que tenga cierta experiencia en programación, sabe que si uno no usa esta instrucción con cuidado puede acabar con un código increiblemente enredado. A esta situación la llaman “código espagueti”. Aunque hay muchas situaciones en donde no queda mas remedio que usarla

Saltos condicionales.- Si bien, con los saltos de la instrucción JMP podemos hacer algunos flujos de código interesantes, pero solo con JMP no podemos hacer programación condicional. (o como dirían los lamers con estudios, el IF). Para hacer esto necesitamos del salto condicional. Un salto condicional se parece al salto normal, solo que el CPU puede o no ejecutarlo dependiendo de si se cumple o no una condición. Para entender el tema de los saltos condicionales es necesario ver primero el tema del registro banderas.

El único operando que recibe una instrucción JMP es la posición de memoria de “aterrizaje” El lugar del código donde va a caer, algo así como una gran X marcada en el terreno. Esta X es una etiqueta no muy diferente a las usadas para indicar la posición de las variables. Podemos poner esta equis donde queramos mientras cumpla las reglas del OpCode JMP. ¡Incluso JMP permite hacer saltos hacia atrás! Estos saltos hacia atrás son necesarios para construir estructuras del tipo WHILE / DO WHILE.

En este dibujo vemos una representación de un salto. El CPU recorre el código hasta llegar a la instrucción JMP y al llegar a ella salta hacia donde le indica el operando. En este caso, se evita ejecutar el grupo de instrucciones NOP que están entre la instrucción JMP y la etiqueta de ‘aterrizaje’. Pero la instrucción JMP también permite hacer saltos hacia atrás:


rampa

Aunque hay algunos inconvenientes serios relacionados con los saltos:

*Dar un salto de un lado a otro del código es mas tardado que ejecutar el mismo código sin saltar. Por eso hay que procurar dar la menor cantidad de saltos que sea posible

*Un programa con demasiados saltos incondicionales va perdiendo poco a poco su estructura y es considerablemente mas dificil de mantener.

*Cada que damos un salto debemos de dejar en claro para que lo damos, por lo que es importante que la etiqueta de aterrizaje (la que indica a donde nos llevará el salto) debe de tener un nombre descriptivo o nos vamos a perder.

*Para el caso de los saltos condicionales, los procesadores de Intel tienen la capacidad de ‘adivinar’ si un salto condicional va a ejecutarse o no. Esta capacidad se llama “Branch Prediction”, si el CPU adivina, el salto es tan rápido como si las instrucciones fueran secuenciales, pero si falla puede tardar mas incluso que un salto normal. Aunque existe un modo en el que le podemos advertir al procesador si es o no probable que se ejecute ese salto. Esto se hace con un prefijo.

Con los saltos es posible construir las mas exóticas estructuras de flujo de programa que se nos ocurran, pero si no somos cuidadosos podemos acabar con un código inmanejable. En otra nota hablaré con mas detalles sobre este tipo de construcciones.

La instrucción CALL es una interesante aplicación del salto, pues al saltar guarda en el STACK la posición que tenía cuando leyó la instrucción y luego, al llegar a RET toma la posición de memoria del STACK y salta de regreso hacia ella.

Para terminar, los saltos son espectaculares pero frenan la ejecución del programa y hay que evitarlos hasta donde nos sea posible. Esto se debe a que mientras una función está siendo ejecutada por el procesador, este ya está preparándose para cargar las instrucciones que van adelante. De modo que si lo que está por delante cambia, es necesario actualizarlo. Pero ese es un tema de alta optimizacion del que hablaré mas adelante porque esta nota ya me quedó demasiado larga.

abril 24, 2009 - Posted by | Uncategorized | ,

Aún no hay comentarios.

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: