Você está na página 1de 9

1.

El programa ensamblador
El programa ensamblador es la herramienta que realiza la traduccin de
un fichero que contiene instrucciones para el procesador del estilo mov
%eax, %ebx a su correspondiente representacin como secuencia de ceros
y unos. Este programa, por tanto, sabe cmo codificar todas y cada una
de las operaciones posibles en el procesador, as como sus operandos,
modos de direccionamiento, etc.
Los datos de entrada al programa ensamblador (de ahora en adelante
simplemente ensamblador) es uno o varios ficheros de texto plano que
contienen un programa o secuencia de instrucciones a ejecutar por el
procesador tal y como muestra la figura 1.
Figura 1. El programa ensamblador


El lenguaje en el que se escriben estas instrucciones se conoce como
lenguaje ensamblador. Un mismo procesador puede tener diferentes
programas ensambladores con diferentes lenguajes de entrada, pero
todos ellos producen idntico cdigo (o lenguaje) mquina.
El lenguaje ensamblador no slo permite utilizar los nombres de las
instrucciones, operandos y modos de direccionamiento, sino que
tambin permite especificar etiquetas y definir porciones de memoria
para almacenar datos. La figura 2 muestra un fichero que contiene un
programa escrito en ensamblador:
Figura 2. Estructura de un programa en ensamblador


Un programa est dividido en varias secciones. La palabra .data es una
directiva y comunica al ensamblador que a continuacin se define un
conjunto de datos. El programa tan slo tiene un nico dato que se
representa como una secuencia de caracteres. La lnea .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.
Ntese que el efecto de la directiva .asciz no se traduce en cdigo sino
que son rdenes para que el ensamblador haga una tarea, en este caso
almacenar un string en memoria.
Antes de la directiva .asciz se incluye la palabra dato seguida por dos
puntos. Esta es la forma de definir una etiqueta 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. Ntese
que todas las directivas tienen como primer carcter un punto. La lnea
.globl main contiene la directiva que comunica al ensamblador que la
etiqueta con nombre main ser globalmente accesible desde otro
programa.
A continuacin se encuentran las instrucciones en ensamblador
propiamente dichas. La primera de ellas es push %eax que almacena el
registro %eax en una zona especfica de memoria que se denomina la
pila.
Al comienzo del cdigo se define la etiqueta main. Esta etiqueta identifica
la posicin por la que el procesador va a empezar a ejecutar, o lo que es
lo mismo, la primera instruccin del programa. Todo programa debe
incluir esta etiqueta obligatoriamente. Al final del cdigo se puede ver
una segunda etiqueta (esta opcional) con nombre done.
Una vez creado el fichero de texto con el editor y guardado con el
contenido de la figura 2 con nombre programa.s, se pasa a ejecutar el
compilador. Para ello primero es preciso abrir una ventana con el
intrprete de comandos y situarse mediante comandos cd en el mismo
directorio en el que se encuentra el fichero programa.s. El comando para
compilar el programa se muestra en la siguiente figura (en las
siguientes figuras, la palabra shell$ es el mensaje que imprime siempre
el intrprete de comandos al comienzo de lnea, tambin conocido como
prompt):

El compilador que se utilizar se llama gcc y realiza una tarea similar a
la de un compilador de un lenguaje de alto nivel como Java. La cadena -
o programa es la forma de decirle al compilador que queremos que el
ejecutable resultante se llame programa. Si al compilar se detecta algn
error en el programa se muestra la lnea y el motivo. Si no se detectan
errores, se genera un fichero con el ejecutable resultante.
En el caso de tener el cdigo escrito en varios ficheros que deben
combinarse para obtener un nico programa, la lnea anterior se
modifica incluyendo todos los ficheros con extensin .s necesarios.
Si no ha habido ningn error, el fichero programa est listo para ser
ejecutado por el procesador. Para ello simplemente se ha de teclear su
nombre en el intrprete de comandos:

Volvamos al cdigo para analizar detenidamente lo que acabamos de
ejecutar. La etiqueta main marca el punto en el cdigo en el que el
programa comienza a ejecutar. Todo programa debe seguir el siguiente
patrn:
.data # Comienzo del segmento de datos

<datos del programa>

.text # Comienzo del cdigo
.global main # Obligatorio

main:
<Instrucciones>

ret # Obligatorio
Ntese que se pueden incluir todo tipo de comentarios utilizando el
carcter '#'. Todo lo que se escriba desde este carcter hasta el final de
la lnea es ignorado por el compilador. Basado en este patrn, el
programa anterior 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 zona de memoria denominada la pila. Las tres
instrucciones siguientes se encargan de poner la direccin del string
tambin en la pila (instruccin push), invocar una rutina externa que
imprime el string (instruccin call) y sumar el valor 4 al registro %esp.
Finalmente, las tres ltimas instrucciones restauran el valor original en
los registros previamente guardados en la pila.
La subrutina printf modifica el contenido de los registros %eax, %ecx y
%edx. Por tanto, antes de llamar a esta rutina es necesario salvar su
contenido en memoria (en este caso en la pila) y restaurar su valor al
terminar. Con las instrucciones de push al comienzo y pop al final se
garantiza que el programa termina con idnticos valores con los que
comenz la ejecucin en los registros.
2. Traduccin de lenguaje ensamblador a
lenguaje mquina
El programa ensamblador, aparte de traducir de lenguaje ensamblador a
lenguaje mquina, tambin puede mostrar por pantalla el resultado de
la codificacin de las instrucciones y datos en binario
Para la resolucin de este ejercicio se trabaja con el siguiente programa
que suma dos nmeros (valor1 y valor2) y almacena el resultado
multiplicado por 2 en la posicin de memoria etiquetada como result.
Adems se muestra el valor de la suma por pantalla. El fichero debe
tener como nombre nombre sumadospordos.s y su cdigo se muestra en la
siguiente figura.
.data # Comienza la seccin de datos
# Se define el formato a imprimir
string: .asciz "Resultado = %d\n"
valor1: .int 530 # Variable que almacena el primer valor
valor2: .int -927 # Variable que almacena el segundo valor
result: .space 4 # Espacio reservado para el resultado

.text # Comienza la seccin de cdigo
.globl main # Declaracin de main como smbolo global

main: push %eax
push %ecx
push %edx

mov valor1, %eax
add valor2, %eax
mov %eax, result
add %eax, result

push %eax
push $string
call printf
add $8, %esp

pop %edx
pop %ecx
pop %eax
ret # termina el programa

El compilador o ensamblador es el programa que traduce este fichero a
un fichero ejecutable en lenguaje mquina. Sin embargo, se puede
ejecutar este programa con la orden para que, en lugar de generar un
ejecutable, muestre por pantalla el resultado de la traduccin de
ensamblador a lenguaje mquina. Esto se consigue incluyendo la opcin
-Wa,-a (ntese la ausencia de espacios en blanco). El comando para
ensamblar el programa y ver el resultado por pantalla es:
gcc -Wa,-a -o [ejecutable] [fichero.s]
donde [ejecutable] se debe reemplazar por el nombre del fichero
ejecutable a crear y [fichero.s] por el del fichero que contiene el cdigo
ensamblador.
El compilador muestra por pantalla el resultado del proceso de
traduccin a lenguaje mquina en un formato especfico. Para analizar
en detalle este listado se puede capturar el resultado en un fichero y
visualizarlo mediante un editor. Para obtener un fichero que contenga el
resultado producido por el compilador, es preciso ejecutar el comando
anterior aadiendo al final el sufijo > listado.txt:
gcc -Wa,-a -o [ejecutable] [fichero.s] > listado.txt
donde de nuevo [ejecutable] se debe reemplazar por el nombre del
fichero ejecutable a crear y [fichero.s] por el del fichero que contiene el
cdigo ensamblador.
Al ejecutar este comando el compilador no muestra ningn dato por
pantalla y nicamente el intrprete de comandos escribe de nuevo el
prompt. Sin embargo, en el directorio actual se ha creado un fichero
listado.txt. Este fichero se puede abrir y ver su contenido con el editor.
El listado producido por el compilador est organizado en columnas. El
compilador muestra el cdigo del fichero en la parte derecha, y en la
parte izquierda incluye tres columnas de nmeros. En la primera
columna se muestra el nmero de lnea del fichero original. Los nmeros
incluidos en la segunda y tercera columna estn escritos en
hexadecimal. La segunda columna muestra en hexadecimal el nmero
del primer byte de la codificacin que se muestra en la tercera columna.
El nmero de la segunda columna se puede obtener sumando al nmero
de esta columna de la lnea anterior, el nmero de bytes de la tercera
columna. La codificacin comienza a partir del byte 0 y se van
almacenando los bytes en posiciones correlativas.
En la tercera columna se muestra el resultado de la codificacin de cada
lnea (tambin en hexadecimal). Cuando dicha codificacin ocupa ms
de una lnea, se repite en la primera columna el nmero de lnea
incluyendo el valor de los siguientes bytes. La siguiente figura muestra
un ejemplo de este listado.
GAS LISTING sumadospordos.s page 1


1 .data # Comienza la seccin de
datos
2 # Se define el formato a
imprimir
3 0000 52657375 string: .asciz "Resultado = %d\n"
3 6C746164
3 6F203D20
3 25640A00
4 0010 12020000 valor1: .int 530 # Variable que almacena el
primer valor
5 0014 61FCFFFF valor2: .int -927 # Variable que almacena el
segundo valor
6 0018 00000000 result: .space 4 # Espacio reservado para
el resultado
7
8 .text # Comienza la seccin de
cdigo
9 .globl main # Declaracin de main como
smbolo global

A la vista del cdigo mostrado por el compilador, responder a las
siguientes preguntas:
1. Cuntos bytes ocupa la traduccin a lenguaje mquina de la lnea
3?
2. En la tercera columna de la lnea con el nmero 5 aparece el
nmero 0x61FCFFFF. Cmo se ha obtenido este nmero?
3. En la lnea 6 se utiliza la orden .space seguida de un nmero. Qu
significa este nmero? (puedes probar a modificarlo y ver qu
efecto tiene en el listado que muestra el compilador).
4. A la vista del resultado de la traduccin de la lnea 3, cul es el
cdigo ASCII en hexadecimal que representa el smbolo =?
5. Cul es la codificacin en hexadecimal de la instruccin push %eax?
6. La instruccin push seguida de un registro se codifica con 8 bits. El
procesador dispone de ocho registros con nombres %eax, %ebx, %ecx,
%edx, %esi, %edi, %ebp y %esp. Deducir con esta informacin qu bits
del byte que codifica la instruccin son los que ms probablemente
se utilicen para codificar el registro (se permite modificar el
cdigo).
7. Por qu crees que la codificacin de las instrucciones en las lneas
20 y 21, a pesar de ser ambas del tipo push tiene diferente
tamao?
8. La instruccin add %eax, result se codifica con 6 bytes. El
procesador dispone de ocho registros con nombres %eax, %ebx, %ecx,
%edx, %esi, %edi, %ebp y %esp. Deducir con esta informacin qu bits
de los seis bytes que codifican la instruccin son los que ms
probablemente se utilicen para codificar el registro (se permite
modificar el cdigo).
9. La instruccin add $8, %esp se codifica con tres bytes. Cuntos
bits se utilizan para codificar la constante que aparece como
primer operando de la suma?
10. Explica qu sucede con la codificacin de la instruccin
anterior si la constante del primer operando es mayor que 127.
11. Para definir un string, adems de la directiva .asciz que se
utiliza en la lnea 3, el ensamblador tambin permite la directiva
.ascii. En qu se diferencian?
12. En la lnea 6 se utiliza la directiva .space. Esta directiva
permite que en lugar de ir seguida de un nmero, vaya seguida de
dos nmeros separados por comas. Cul es el efecto del segundo
nmero?
13. Cul es la longitud en bytes de la codificacin de los datos
del programa?
14. Cul es la longitud en bytes de la codificacin del cdigo del
programa?
15. En las lneas finales del listado se incluye una seccin con
ttulo DEFINED SYMBOLS. Esta seccin consta de cinco lneas que
comienzan por el nombre del fichero seguido de dos puntos,
seguido de un nmero, luego aparece la palabra .data o .text, a
continuacin un nmero, y termina con un nombre. Qu crees
que significa el nmero que aparece en penltimo lugar?
16. La representacin en lenguaje mquina de la instruccin mov
valor1, %eax debe contener en su interior un conjunto de bits que
codifique el smbolo valor1. Qu bits de su codificacin se utilizan
para esto? (se permite modificar el cdigo y se sugiere consultar
la informacin de la seccin DEFINED SYMBOLS al final del listado).
17. La ltima seccin del listado lleva por ttulo UNDEFINED
SYMBOLS. Por qu crees que esta seccin incluye el smbolo printf?
3. Envo de resultados al depsito central
de Subversion
En este ejercicio vamos a enviar las respuestas del ejercicio anterior al
depsito central de ficheros con la herramienta subversion. El fichero
Respuestas.txt que se ha creado en el directorio de trabajo de esta
prctica contiene una plantilla para responder a las 17 preguntas del
apartado anterior. Puedes editar este fichero e incluir las respuestas a
tus preguntas. Modifica este fichero (no hace falta que incluyas todas las
respuestas) y manda la versin modificada al depsito mediante el
comando svn commit -m 'Mensaje aclaratorio'. El mensaje aclaratorio es
para explicar qu cambios has hecho y se suele poner para facilitar la
bsqueda de una versin anterior de tu trabajo y para comunicar al
resto de usuarios de los cambios que has introducido.
Tras ejecutar el comando, y utilizando el navegador, vete a la URL de tu
grupo en el depsito central y cercirate de que los cambios que has
mandado a subversion estn en el fichero del depsito. A continuacin
realiza un segundo cambio y esta vez ejecuta el comando svn commit
pero sin ninguna opcin -m. Vers que el programa abre un editor para
que introduzcas un comentario. Toda operacin de commit debe incluir un
comentario, ya sea en la propia lnea del comando mediante la opcin -m
o introduciendo un texto en el editor que se abre cuando esta opcin no
est presente. Es muy recomendable (y prctica extendida en equipos
de trabajo industriales) enviar los cambios al depsito, al menos, cada
vez que se termina una sesin de trabajo.

Você também pode gostar