Está en la página 1de 15

El programa ensamblador

Los programas escritos en lenguaje ensamblador, a pesar de representar instrucciones del lenguaje mquina del procesador, no son directamente ejecutables por ste sino que es necesario traducirlas a su codificacin en binario. Este proceso de traduccin es fcilmente automatizable, y por tanto se dispone de programas denominados ensambladores (o ms genricamente compiladores que se encargan de esta tarea. El ensamblador es un programa que recibe como datos de entrada uno o varios ficheros de texto plano con un conjunto de instrucciones y datos escritos en lenguaje ensamblador y produce un fichero binario y ejecutable que contiene la codificacin binaria del programa. La figura 6.1 muestra el funcionamiento del programa ensamblador. Figura 6.1. El programa ensamblador

En general, a los programas encargados de traducir de un lenguaje de programacin a otro se les denomina compiladores y todos ellos trabajan de forma similar. Dado un conjunto de ficheros escritos en un lenguaje, producen como resultado otro fichero que contiene la traduccin a un segundo lenguaje. En el caso del ensamblador, la traduccin es de lenguaje ensamblador a lenguaje mquina. En adelante se utilizarn los trminos compilador y ensamblador de forma indistinta y siempre en referencia al programa que traduce de lenguaje ensamblador a lenguaje mquina. As como el lenguaje mquina de un procesador es nico e inmutable (a no ser que se redisee el procesador), pueden coexistir mltiples lenguajes ensamblador que representen el mismo lenguaje mquina. La representacin de las instrucciones mediante cadenas alfanumricas es un convenio utilizado para facilitar su escritura, por lo que pueden existir mltiples convenios de este tipo

siempre y cuando se disponga del ensamblador los que traduzca al lenguaje mquina del procesador. En el caso concreto del sistema operativo Linux, se incluye como parte de las herramientas del sistema un compilador capaz de traducir de lenguaje ensamblador a lenguaje mquina. Su nombre es as. En la prctica este programa lo suelen invocar otros compiladores tales como gccque es un compilador del lenguaje de alto nivel C a lenguaje mquina, pero tambin permite la traduccin de ficheros con cdigo ensamblador invocando internamente el programa as.

6.1. Creacin de un programa ejecutable en ensamblador


La figura 6.2 muestra un programa en lenguaje ensamblador creado mediante un editor de texto plano, un programa que guarda nicamente el texto codificado en formato

ASCII o UNIcodE sin

informacin alguna sobre estilo. El primer paso, por tanto, para la obtencin de un programa ejecutable es la creacin de un fichero de texto que contenga el cdigo. Figura 6.2. Estructura de un programa en ensamblador

Un programa consta de varias secciones separadas cada una de ellas por palabras clave que comienzan por el smbolo .. La palabra .data que aparece en la primera lnea no tiene traduccin alguna para la ejecucin, sino que es la forma de notificar al ensamblador que a continuacin se

encuentran definidos conjunto de datos. A este tipo de palabras que comienzan por punto se les denomina directivas. El programa tiene definido un nico dato que se representa como una secuencia de caracteres. La lnea que contiene .asciz (tambin una directiva) seguida del string entre comillas es la que instruye al ensamblador para crear una zona de memoria con datos, y almacenar en ella el string que se muestra terminado por un byte con valor cero. El efecto de la directiva .asciz es que, al comienzo de la ejecucin de programa, este string est almacenado en memoria. Antes de la directiva .asciz se incluye la palabra dato seguida por dos puntos. Esta es la forma de definir una etiqueta o nombre que luego se utilizar en el cdigo para acceder a estos datos. La lnea siguiente contiene la directiva .text que denota el comienzo de la seccin de cdigo. La directiva .global main comunica al ensamblador que la etiqueta main es globalmente accesible desde cualquier otro programa. A continuacin se encuentran las instrucciones en ensamblador propiamente dichas. Al comienzo del cdigo se define la etiqueta main que identifica el punto de arranque del programa. Una vez creado y guardado el fichero de texto con el editor, se debe invocar el compilador. En una ventana en el que se ejecute un intrprete de comandos y situados en el mismo directorio en el que se encuentra el fichero ejemplo.s se ejecuta el siguiente comando: gcc -o ejemplo ejemplo.s El compilador realiza una tarea similar a la de un compilador de un lenguaje de alto nivel como Java. Si hay algn error en el programa se muestra la lnea y el motivo. Si el proceso de traduccin es correcto, se crea un fichero ejecutable. En el comando anterior, se ha instruido al ensamblador, por medio de la opcin -o ejemplo para que el programa resultante se deposite en el fichero con nombre ejemplo. El compilador tambin es capaz de procesar ms de un fichero de forma simultanea. Esto es til cuando el cdigo de un programa es muy extenso y est fraccionado en varios ficheros que deben combinarse para obtener un nico ejecutable. En tal caso el comando para compilar debe incluir el nombre de todos los ficheros necesarios. Si el compilador no detecta ningn error en la traduccin, el fichero ejemplo est listo para ser ejecutado por el procesador. Para ello simplemente se escribe su nombre en el intrprete de comandos (en la siguiente lnea, el smbolo $ representa el mensaje que imprime siempre el intrprete de comandos):

$ ejemplo
Mi Primer Programa Ensamblador

$
Todo programa ensamblador debe seguir el siguiente patrn: .data # Comienzo del segmento de datos

<datos del programa> .text .global main main: <Instrucciones> ret # Obligatorio # Comienzo del cdigo # Obligatorio

Se pueden incluir comentarios en el cdigo a partir de smbolo # hasta el final de lnea y son ignorados por el compilador. Basado en este patrn, el programa de la figura 6.2 ha ejecutado las instrucciones: push %eax push %ecx push %edx push $dato call printf add $4, %esp pop %edx pop %ecx pop %eax ret Las primeras tres instrucciones depositan los valores de los registros %eax , %ecx y %edx en la pila. Las tres instrucciones siguientes se encargan de poner la direccin del string tambin en la pila (instruccin push ), invocar la rutina externa printf que imprime el string (instruccin call ) y sumar una constante al registro %esp para restaurar el valor inicial del puntero a la cima de la pila. Las tres ltimas instrucciones restauran el valor original en los registros previamente guardados en la pila. A continuacin se estudia en detalle la sintaxis de las diferentes construcciones permitidas en el lenguaje ensamblador.

6.2. Definicin de datos


Como todo lenguaje de programacin, se permiten definir tipos de datos as como su contenido. En el caso del ensamblador, estos tipos no permiten estructuras complejas ni heterogneas. Todas las definiciones deben incluirse en una seccin del cdigo que comience por la directiva .data . Los datos se almacenan en posiciones contiguas de memoria, es decir, dos definiciones seguidas hacen que los datos se almacenen uno a continuacin de otro. La principal dificultad para manipular los datos en ensamblador es que cuando el procesador accede a ellos, no se realiza ningn tipo de comprobacin. Aunque se definan datos con cierto tamao y estructura en memoria, el procesador trata estos datos como una simple secuencia de bytes. Esta es una diferencia sustancial con los lenguajes de programacin de alto nivel tales como Java. La definicin de datos en ensamblador se realiza a travs de directivas (descritas a continuacin) que nicamente reservan espacio en memoria con los datos pertinentes, pero no se almacena ningn tipo de informacin sobre su tamao. Los lenguajes de alto nivel contienen lo que se conoce como un sistema de tipos que consiste en un conjunto de reglas que permiten la definicin de tipos de datos as como el mecanismo para comprobar su correccin. En ensamblador, al tratarse de los datos que manipula directamente el procesador, no se dispone de tal sistema, y por tanto se manejan como si fuese simples secuencias de bytes.

6.2.1. Definicin de bytes


La definicin de valores numricos almacenados en bytes se realiza mediante la directiva .byte seguida de uno o varios valores separados por comas. Cuando el programa comienza la ejecucin, se han inicializado tantas posiciones en memoria como indica la directiva con los valores dados. El ejemplo 6.1 muestra ejemplos de utilizacin de la directiva .byte as como los valores almacenados en memoria. Ejemplo 6.1. Definicin de bytes en ensamblador y sus valores en memoria

datos:

.byte 38, 0b11011101, 0xFF, 'A, 'b

Si el valor numrico especificado es menor que cero o mayor que 255 el compilador notifica la anomala con un error.

6.2.2. Definicin de enteros

La definicin de enteros de 32 bits se hace mediante la directiva .int seguida de un nmero o una lista de nmeros enteros separados por comas. Los nmeros se codifican con 4 bytes almacenados en little endian. El ejemplo 6.2 muestra ejemplos de definiciones de enteros. Ejemplo 6.2. Definiciones de nmeros enteros y sus valores en memoria

nums: .int 3, 4, 5 .int 0x12AB, 0x10ab, 0b111000, 0B111000 .int 21 .int 07772

La directiva .long es un sinnimo de .int y tambin define enteros de 32 bits. Las directivas .word y .quad son anlogas a las anteriores pero definen enteros de 16 y 64 bits respectivamente.

6.2.3. Definicin de strings


La definicin de strings se puede hacer con dos formatos diferentes mediante la utilizacin de tres directivas. La directiva .ascii permite la definicin de uno o ms strings entre comillas y separadas por comas. Cada smbolo de cada strings codifica con un byte en

ASCIIutilizando

posiciones consecutivas de memoria. Se utilizan tantos bytes como la suma de los smbolos de cada string. La directiva .asciz es similar a la anterior, se escribe seguida de uno o ms strings separados por comas, pero cada uno de ellos se codifica aadiendo un byte con valor cero a final del string. Este formato se suele utilizar para detectar el final del string. La directiva .string es un sinnimo de la directiva .asciz . El ejemplo 6.3 muestra la utilizacin de las directivas de definicin de strings y los valores que se almacenan en memoria. Los bytes resaltados corresponden son los que aaden las directivas .asciz y .string al final de cada string. Ejemplo 6.3. Definicin de strings y sus valores en memoria

msg:

.ascii "S 1", "S 2" .asciz "S 3", "S 4" .string "S final"

6.2.4. Definicin de espacio en blanco


La directiva .space seguida de dos nmeros separados por una coma permite la reserva de espacio en memoria. El primer valor denota el nmero de bytes que se reservan y el segundo es el valor que se utiliza para inicializar dichos bytes y debe estar entre 0 y 255. En el caso de que este parmetro se omita, la memoria se reserva inicializada al valor cero. El uso principal de esta directiva es para reservar espacio que, o se debe inicializar al mismo valor, o su valor ser calculado y modificado por el propio programa. El ejemplo 6.4 muestra el uso de la directiva as como su efecto en memoria. Ejemplo 6.4. Definiciones de espacio en blanco y su valor en memoria

result: .space 4, 0 .space 4 .space 8, 0xFF

6.3. Uso de etiquetas


En lenguaje ensamblador se permite la definicin de un conjunto de datos y las instrucciones para manipularlos que se traducen a su codificacin binaria y se produce un fichero ejecutable. Antes de comenzar la ejecucin del programa, los datos e instrucciones en binario se cargan en la memoria RAM del sistema. Pero en qu posicin de memoria est almacenado el programa? El valor de esta direccin de memoria, o de la direccin en la que est almacenado cualquier dato o instruccin, no se sabe hasta el momento en el que se ejecuta el programa porque es el sistema operativo el que lo decide, y tal decisin se aplaza hasta el ltimo instante para as poder ubicar cada programa en el lugar ms conveniente en memoria. El sistema operativo est ejecutando

mltiples programas de forma simultnea, y por tanto, necesita esta flexibilidad para poder hacer un mejor uso de la memoria. Pero, si no se sabe el valor de la direccin de memoria de ningn dato ni instruccin, cmo se puede, por ejemplo, acceder a un dato en memoria? Para ello se precisa su direccin, pero el valor numrico de esta no se sabe cuando se escribe un programa. El lenguaje ensamblador soluciona este problema mediante el uso de etiquetas. Las etiquetas no son ms que nombres que se ponen al comienzo de una lnea (ya sea definicin de datos o una instruccin) seguido por dos puntos. Dicho nombre representa la posicin de memoria en la que est almacenado el dato o instruccin definido justo a continuacin. Estas etiquetas son, por tanto, un punto de referencia en memoria que el ensamblador sabe interpretar de forma correcta y que en el momento de ejecucin sern reemplazados por el valor numrico de la direccin de memoria pertinente. La definicin de una etiqueta no slo permite referirse a los datos almacenados en esa posicin, sino que ofrece un mecanismo por el que acceder a los datos en posiciones cercanas a ella mediante simples operaciones aritmticas sobre la direccin que representa. Considrese de nuevo la representacin en memoria de los enteros definidos en el ejemplo 6.2. La figura 6.3 ilustra como se pueden deducir las direcciones de los dems enteros en base al smbolo nums: . Figura 6.3. Etiqueta y direcciones relativas a ella

Dado que la directiva .int define valores enteros representados por 32 bits, de la definicin de la etiqueta nums se pueden deducir los valores de las direcciones en las que se almacenan el resto de nmeros enteros definidos. Para efectuar estos clculos es imprescindible saber el tamao de la informacin almacenada a partir de la etiqueta. Las etiquetas, por tanto, se pueden definir en cualquier lugar del cdigo y son nicamente smbolos que representan una direccin de memoria cuyo valor no se sabe y se utilizan como puntos de

referencia para acceder a los datos en memoria de su alrededor. Pero su uso en ensamblador tiene dos versiones igualmente tiles. La primera es acceder al valor contenido en la posicin de memoria a la que se refieren. Para ello se incluye en las instrucciones ensamblador el nombre de la etiqueta tal cual se ha definido (sin los dos puntos). Pero a menudo es necesario manipular la propia direccin de memoria que representa dicha etiqueta. Aunque dicho valor es desconocido, nada impide que se escriban instrucciones mquina que operen con l. El ensamblador permite referirse al valor de la direccin de memoria que representa una etiqueta precediendo su nombre del smbolo $ . Si una instruccin ensamblador contiene como operando el nombre de una etiqueta, este operando es de tipo direccin de memoria (ver laseccin 5.3.3). En cambio, si el operando es el nombre de una etiqueta precedido por $ , este operando es de tipo constante. Esta nomenclatura para diferenciar entre el valor al que apunta una etiqueta y su valor como direccin en memoria es consistente con la nomenclatura de operandos. Dada una etiqueta, de los dos valores, al que apunta en memoria y su direccin, es este ltimo el que permanece constante a lo largo de la ejecucin, y por tanto se representa con el prefijo $ . En cambio, el valor en memoria al que apunta es variable y por ello se representa nicamente por el nombre de la etiqueta. El ejemplo 6.5 muestra una porcin de cdigo en la que se define una etiqueta y se manipula mediante instrucciones mquina. Ejemplo 6.5. Definicin y manipulacin de etiquetas .data .int 3, 4 .string "Mensaje" .byte 17 ... mov dato, %eax add $5, %eax mov %eax, dato movl $4, dato ... mov $dato, %ebx add $8, %ebx ...

dato:

La etiqueta dato corresponde con la direccin de memoria en la que est almacenado el entero de 32 bits con valor 3. En el primer grupo de instrucciones, la instruccin mov dato, %eax mueve el nmero 3 al registro %eax . Ntese que el operando carece del prefijo $ y por tanto se refiere al

valor almacenado en memoria. A continuacin se suma la constante 5 y se transfiere el valor en %eax de nuevo a la posicin de memoria referida por dato . La instruccin movl $4, dato requiere especial atencin. El sufijo de tamao es necesario para desambiguarla porque ni la constante $4 ni el segundo operando contienen informacin sobre su tamao.La informacin de una etiqueta es nicamente la direccin a la que representa sin ningn tipo de informacin sobre el tamao de los datos. Por tanto, a pesar de que dato ha sido definida en una lnea en la que se reserva espacio para enteros, cuando se utiliza en una instruccin y el otro operando tampoco ofrece informacin sobre el tamao, requiere el sufijo. En el segundo grupo de instrucciones, la instruccin mov $dato, %ebx carga en el registro %ebx el valor de la direccin de memoria que representa la etiqueta. Este valor es imposible de saber en tiempo de programacin, pero se puede manipular al igual que cualquier otro nmero. Tras ejecutar la ltima instruccin, el registro %ebx contiene la direccin de memoria en la que est almacenada la primera letra del string. Esto se deduce de las definiciones de datos y sus tamaos. Los dos nmeros ocupan 8 bytes, con lo que en la posicin $dato + 8 se encuentra la letra M del string Mensaje . Las etiquetas no slo se utilizan en las definiciones de datos sino tambin en instrucciones del cdigo. Los destinos de los saltos reciben como operando una direccin de memoria, que por tanto debe ser una etiqueta. Se pueden definir tantas etiquetas como sea preciso en un programa sin que por ello se incremente el tamao del programa. Las etiquetas son smbolos que utiliza el programa ensamblador para utilizar en lugar de los valores numricos de las direcciones que se sabrn cuando el programa comience su ejecucin. El compilador gcc utilizado para traducir de lenguaje ensamblador a lenguaje mquina asume que el punto de comienzo de programa est marcado por la presencia de la etiqueta con nombre main . Por tanto, al escribir un programa que sea traducido por gcc se debe definir la etiqueta main en el lugar del cdigo que contenga su primera instruccin mquina.

6.4. Gestin de la pila


El desarrollo de programas en ensamblador tiene una serie de particularidades derivadas de la proximidad al procesador con la que se trabaja. Uno de los cometidos de los lenguajes de programacin de alto nivel tales como Java es precisamente el ofrecer al programador un entorno en el que se oculten los aspectos ms complejos de la programacin en ensamblador.

La pila se utiliza como depsito temporal de datos del programa en ejecucin. Las operaciones push y pop permiten depositar y obtener datos de la pila, pero no son las nicas que modifican su contenido. El propio procesador tambin utiliza la pila para almacenar datos temporales durante la ejecucin. Esto implica que los programas en ensamblador tienen ciertas restricciones al manipular la pila. La ms importante de ellas es que la cima de la pila debe ser exactamente la misma antes del comienzo de la primera instruccin de un programa y antes de la instruccin RET que termina su ejecucin. Cuando se arranca un programa, el sistema operativo reserva espacio para la pila y almacena el valor pertinente en el registro %esp . Por motivos que se explican en detalle en el captulo 8, el valor de este registro debe ser el mismo al terminar la ejecucin de un programa. Ntese que el respetar esta regla no implica que la pila no pueda utilizarse. Al contrario, como la cima debe ser idntica al comienzo y final del programa, las instrucciones intermedias s pueden manipular su contenido siempre y cuando al final del programa se restaure el valor de la cima que tena al comienzo. En un programa, esta limitacin se traduce en que cada dato que se deposite en la pila debe ser descargado antes de que finalice el programa. En el medio del cdigo, la pila puede almacenar los datos que el programador considere oportunos. Adems de inicializar el registro %esp , el sistema operativo tambin deposita valores en los registros de propsito general. La ejecucin del programa escrito en ensamblador la inicia el sistema mediante una llamada a la subrutina con nombre main (de ah que ste sea el punto de comienzo del programa) y por tanto, los registros tienen todos ciertos valores iniciales. La regla a respetar en los programas ensamblador es que al trmino de la ejecucin de un programa, el valor de los registros de propsito general debe ser exactamente el mismo que tenan cuando se comenz la ejecucin (en la prctica no todos los registros deben ser restaurados, pero por simplicidad se ha adoptado la regla para todos ellos). De nuevo, el que el valor de los registros tenga que ser idntico al comienzo y al final de un programa no quiere decir que no se puedan utilizar. Simplemente se deben guardar los valores iniciales de aquellos registros que se utilicen y restaurarlos antes de terminar la ejecucin. El lugar ms apropiado para guardar los valores iniciales de estos registros es precisamente la pila. No es preciso reservar espacio de antemano, pues la pila ya lo tiene reservado, y mediante varias instrucciones PUSH se depositan los registros que se modifiquen en el cdigo antes de ejecutar las instrucciones propias del clculo. Luego, justo antes del final de la ejecucin se restauran mediante

las instrucciones POP . El ejemplo 6.6 muestra una porcin de un programa que modifica los registros %eax , %ebx , %ecx y %edx , Ejemplo 6.6. Instrucciones para salvar y restaurar registros main: push push push push %eax %ebx %ecx %edx

# Instrucciones del programa que modifican los 4 registros pop pop pop pop ret %edx %ecx %ebx %eax

Las instrucciones para guardar la copia de los registros que se modifican se realiza justo al principio del cdigo. De forma anloga, las instrucciones para restaurar estos valores se realizan justo antes de la instruccin RET . Asimismo, el orden en el que se salvan y restauran los registros es el inverso debido a cmo se almacenan en la pila. El orden en el que se depositan los datos en la pila es irrelevante, tan slo se deben restaurar en orden inverso al que se han depositado. Todo programa ensamblador, por tanto, debe comenzar y terminar con instrucciones de PUSH y POP de los registros que se modifiquen en su interior. La utilizacin de la pila para almacenar los valores de los registros modificados respeta el convenio de mantener la cima de la pila idntica al comienzo y final del programa. Como el nmero de operaciones PUSH es idntico al nmero de operaciones POP , mientras que en el cdigo interno del programa todo dato que se deposite en la pila se extraiga, la cima de la pila es idntica al comienzo y final. A la hora de desarrollar programas en ensamblador, se recomienda primero escribir el cdigo interno de un programa y cuando dicho cdigo se suponga correcto completarlo con las instrucciones que salvan y restauran los registros que se modifican. En general, los datos que se almacenan en la pila se hace de forma temporal y deben eliminarse una vez terminada la tarea para la que se han almacenado.

6.5. Desarrollo de programas en ensamblador

El desarrollo de programas en ensamblador requiere un conocimiento en detalle de la arquitectura del procesador y una meticulosidad extrema a la hora de decidir qu instrucciones y datos utilizar. Al trabajar con el lenguaje mquina del procesador, la comprobacin de errores de ejecucin es prcticamente inexistente. Si se ejecuta una instruccin con operandos incorrectos, el procesador los interpretar tal y como estipula su lenguaje mquina, con lo que es posible que la ejecucin del programa produzca resultados inesperados. Desafortunadamente no existe un conjunto de reglas que garanticen un desarrollo simple de los programas. Esta destreza se adquiere mediante la prctica y, ms importante, mediante el anlisis detenido de los errores, pues ponen de manifiesto aspectos de la programacin que se han ignorado. Las recomendaciones que se hacen para el desarrollo de programas en lenguaje de alto nivel adquieren todava ms relevancia en el contexto del lenguaje ensamblador. Sin ser de ninguna manera una lista exhaustiva, se incluyen a continuacin las ms relevantes. El valor de los registros y el puntero de pila antes de ejecutar la ltima instruccin del programa deben ser idnticos a los valores que tenan al comienzo. Se deben evitar las operaciones innecesarias. Por ejemplo, salvar y restaurar todos los registros independientemente de si son utilizados o no. Debido al gran nmero de instrucciones disponibles y a su simplicidad siempre existen mltiples forma de realizar una operacin. Generalmente elige aquella que proporciona una mayor eficiencia en trminos de tiempo de ejecucin, utilizacin de memoria o registros, etc. Mantener un estilo de escritura de cdigo que facilite su legibilidad. Escribir las etiquetas a principio de lnea, las instrucciones todas a la misma altura (generalmente mediante ocho espacios), separar los operandos por una coma seguida de un espacio, etc. La documentacin en el cdigo es imprescindible en cualquier lenguaje de programacin, pero en el caso del ensamblador, es crucial. Hacer uso extensivo de los comentarios en el cdigo facilita la comprensin del mismo adems de simplificar la deteccin de errores. Los comentarios deben ser lo ms detallados posible evitando comentar instrucciones triviales. Es preferible incluir comentarios de alto nivel sobre la estructura global del programa y los datos manipulados. La mayor parte de errores se detectan cuando el programa se ejecuta. No existe una tcnica concreta para detectar y corregir un error, pero se debe analizar el cdigo escrito de manera

minuciosa. En ensamblador un simple error en el nombre de un registro puede producir que un programa sea incorrecto.

6.6. Ejemplo de programa en ensamblador


El ejemplo 6.7 muestra un programa de ejemplo escrito en ensamblador que dados cuatro enteros almacenados en memoria, suma sus valores y deposita el resultado en el lugar que denota la etiqueta result . Ejemplo 6.7. Programa que suma cuatro enteros .data num1: .int 10 num2: .int 23 num3: .int 34 num4: .int 43 result: .space 4 .text .global main main: push %eax mov add add add num1, num2, num3, num4, %eax %eax %eax %eax # Comienza la seccin de datos

# Deposita aqu el resultado # Comienza la seccin de cdigo # main es un smbolo global # Salva registros # Carga primer nmero y acumula

mov %eax, result pop %eax ret

# Almacena resultado # Restaura registros

La seccin de definicin de datos contiene los cuatro enteros con sus respectivas etiquetas y los cuatro bytes de espacio vaco en el que se almacenar su suma. La directiva .space tiene un nico parmetro, con lo que se reserva espacio en memoria pero no se inicializa. El programa utiliza el registro %eax para acumular los valores de los nmeros, por lo que necesita ser salvado en la pila al comienzo y restaurado al final. Tras salvar %eax en la pila la siguiente instruccin simplemente mueve el primer nmero al registro %eax . No es posible sumar dos nmeros que estn almacenados en memoria, por lo que el programa carga el primer valor en un registro y luego suma los restantes nmeros a este registro.

Finalmente, el programa almacena el resultado de la suma en la posicin de memoria con etiqueta result , restaura los registros utilizados (en este caso slo %eax ) y termina la ejecucin con la instruccin RET .

También podría gustarte