Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

CALL. Una Llamada Perdida (Parte 1)

–Llamada a Funciones Sin Argumentos–

En las escuelitas chafas de computación, y en las carreras universitarias de Ingeniería (valga la redundancia)se muestra que un programa tiene 3 tipos de flujo: Secuencial, Condicional y Cíclica. En ensamblador, la cosa es mucho mas sencilla. Pues tan solo puede haber código secuencial y algunos saltos. Hay muchas clases de saltos en un procesador de Intel. Algunos son largos y pueden llegar de un extremo a otro de la memoria de la computadora, otros son pequeños y solo saltan unas cuantasdocenas de instrucciones y hay otros que pueden ejecutar un procedimiento y regresar a donde iban sin necesidad de mas ayuda. Este último tipo de salto es el que vamos a estudiar esta vez. La instrucción CALL.

CALL en idioma inglés significa ‘llamada’, y nos permite ejecutar un procedimiento repetidas veces en diversos momentos del programa sin necesidad de reescribir las mismas instrucciones una y otra vez. Por decirlo así esto es un ejemplo de programación estructurada. Hay 3 clases de llamada en el Ensamblador de Intel:

Llamada sencilla.- Sin argumentos ni parámetros, en ocasiones se usan variables globales. Es también la mas sencilla de aprender.

Llamada con argumentos.- Es lo que hasta ahora hemos hecho con la instrucción PUSH en las llamadas a la API de Windows. Podemos darle datos de entrada

Llamada con Stack Frame.- Esta es la mas dificil e interesante, pues nos permite hacer lo mismo que se hace con los lenguajes como C, con variables locales, recursión, y argumentos de entrada. Tan solo la explicación del stack frame requerirá dos o tres entradas de este blog.

Así que empecemos con la llamada mas sencilla de todas. La llamada sin argumentos.

Supongamos que tenemos una función que suma 2 números y nos regresa el resultado en EAX y que los números que queremos sumar son 2 dwords etiquetados como A y B, y que guardamos el resultado en C.

-sección de datos:

A dd 2

B dd 3

C dd ?

-sección de código donde se llama la función:

call sumar

mov [C], eax

-sección de código donde está la función

sumar:

mov eax,[A]

add eax, [B]

ret

Lo que vemos aquí es que en la posición marcada con A contiene 2 y B 3, C se marca con el signo de interrogación ‘?’porque no está inicializada. En este proceso, la función toma directamente los contenidos de la celda de memoria.

Solo para recordar algo elemental, el par de instrucciones CALL y RET funcionan como un YO-YO. Este juguete puede volver a nuestras manos al lanzarlo porque hay un hilo que lo une con un dedo. Cuando el programa encuentra una instrucción CALL lo que hace es empujar en el STACK la posición de memoria en la que va. (Los códigos también se guardan en memoria como los datos). Luego salta hacia donde el operando de CALL se lo ordena. Cuando encuentra la instrucción RET saca lo que hay inmediatamente en la entrada del STACK y salta a esa posición. Al igual que lo hace un YO-YO. Es importante mantener balanceada la pila, pues un error podría hacer que la función no regresara al lugar desde la que partió originalmente.

Por cierto, es importante mencionar que todo el código de un programa se almacena de manera lineal dentro de la computadora. Pero existen instrucciones que nos permiten que la ejecución se mueva a nuestro antojo a traves de esta. En las próximas notas veremos como llamar funciones con argumentos y parámetros.

enero 18, 2009 - Posted by | Uncategorized

No hay comentarios aún.

Deja un comentario