INTRODUCCIN AL LENGUAJE
ENSAMBLADOR DE SPARC
B.1. Introduccin
En este apndice se estudiarn las caractersticas especcas del lenguaje ensamblador para
los procesadores con arquitectura SPARC.
Aunque este ensamblador se asemeja mucho a otros, tiene algunas caractersticas espec-
cas; por ejemplo, en el ensamblador de SPARC las constantes inmediatas no requieren ningn
smbolo especco y las referencias a memoria van entre corchetes, tanto si provienen de eti-
quetas como de registros.
Permanentes: son smbolos que representan en todos los programas a las mismas entidades. De
este tipo son los nombres de los registros y los operadores, estos smbolos se caracterizan
por comenzar por el carcter %.
Denidos por el usuario: son smbolos que tienen una signicacin especca en cada progra-
ma: constantes, direcciones, nombres de procedimientos, etc.
Los smbolos denidos por el usuario toman valor cuando el programa se compila y en el
momento de la ejecucin quedan sustituidos por el valor al que representan que es inalterable.
La forma de asignar valores a los smbolos se efecta de forma distinta en funcin de lo que
representen:
231
232 Introduccin al lenguaje ensamblador de SPARC
1. Pueden ponerse como una etiqueta en algn punto del programa, en este caso el smbolo
representa la direccin de la instruccin o dato que vaya a continuacin. Las etiquetas se
caracterizan por ir al principio de la lnea y seguidas por dos puntos (:).
Para asignar valor a este tipo de smbolos el ensamblador lleva una variable interna de-
nominada location counter (LC) (contador de direccin). Este contador se inicializa a 0
al comenzar la compilacin y se incrementa por el nmero de bytes necesarios para cada
instruccin mquina traducida o cada rea reservada para datos. Dicho de otra forma, el
LC lleva un control de la direccin de memoria de cada dato o instruccin pero relativa
al principio del programa. Cuando aparece una etiqueta el compilador le asigna el valor
que tenga LC en ese momento. Este valor ser una referencia, ya que el valor real de la
direccin representada por las etiquetas ser el valor del LC en el momento de compilar
esa lnea ms la direccin de comienzo de programa. A los smbolos asignados de esta
forma se les denomina smbolos relocalizables.
2. Pueden asignarse tambin mediante el signo =, en este caso el smbolo toma el valor de lo
que haya a la derecha del signo = que debe ser constante. Despus del signo = puede haber
algo ms que una simple constante numrica, es decir, puede aparecer una expresin.
Para estos operadores el argumento se pone entre parntesis. Estos operandos son especialmente
tiles para la instruccin sethi que sirve para cargar los 22 bits ms altos de un registro.
Uno de los trminos que pueden aparecer en las expresiones es el valor del LC en el momen-
to de compilarse la expresin que se representa por un punto (.). Esto es muy habitual cuando
se quiere tener en una constante la longitud de una cadena ya que se toma el valor del LC des-
pus de reservar su espacio y se le resta el smbolo que represente la direccin de comienzo de
la cadena. La base en que se interpretan las constantes sigue las mismas convenciones que el
lenguaje C.
Es necesario dejar bien claro que las expresiones que dan valores a los smbolos se evalan
cuando el programa se compila y por tanto todos los trminos que en ellas aparecen deben estar
previamente denidos. Por ello estas expresiones y las que aparecen en los lenguajes de alto
nivel no tienen casi nada en comn.
Absolutos: Son smbolos cuyo valor es constante independientemente del lugar de memoria
donde se site el programa.
Relocalizables: Son smbolos cuyo valor depende de la posicin del programa en memoria.
Locales: Slo se reconocen en el chero fuente actual que normalmente contendr uno o varios
procedimientos.
Externos o referencias no resueltas: Son smbolos que no estn denidos en el programa,
normalmente corresponden a procedimientos o constantes que radican en libreras. Estos
smbolos son localizados por el montador que es quien al nal da valores a estos smbolos.
Para los comentarios que ocupan varias lneas, puede emplearse la sintaxis del lenguaje
C, es decir, abriendo el comentario con /* y cerrndolo con */.
Si el comentario ocupa una lnea, o slo su parte nal, basta con iniciarlo con el signo !.
234 Introduccin al lenguaje ensamblador de SPARC
Nota:
Las instrucciones sintticas que se sustituyen por varias instrucciones no deben
situarse en un ciclo adelantado detrs de una instruccin de control de ujo.
.data
.text
.global main
Este directivo tambin debe usarse cuando se programan funciones o procedimientos a los
que se pueda llamar desde fuera de nuestro programa, y en general, cuando un smbolo deba
reconocerse desde el exterior del programa. En este caso, se pueden poner todos los smbolos
afectados en un mismo directivo .global separndolos por comas.
.skip n
donde n es el nmero de bytes que se quieren reservar. Este directivo causa que el LC se
incremente en n.
Para reservar espacio inicializado de variables escalares utilizaremos los directivos .byte,
.half, .word, .xword, .single, .double o .quad en funcin del tipo de dato que queramos
inicializar: byte, media palabra (16 bits), palabra (32 bits), nmeros en punto otante en simple,
doble o cudruple precisin, respectivamente.
La sintaxis de estos directivos es la siguiente:
.byte
.half
.word
.xword
v1 [, v2 , ....]
.single
.double
.quad
aqu v1 , v2 , etc. representan los valores a los que se inicializa la unidad de almacenamiento
especicada. Se pueden especicar uno o ms valores para la inicializacin, reservndose tantas
unidades del tipo especicado como valores se indiquen.
Las mquinas con arquitectura SPARC exigen alineacin para todos los tipos de datos, lo
que supone que antes de la mayora de los directivos anteriores el LC debe estar alineado. Para
conseguir la alineacin basta incluir el directivo
B.5. Operaciones de entrada y salida 237
.align n
que fuerza a que el LC sea mltiplo de n, dejando algunos bytes a 0.
Para reservar espacio para cadenas de caracteres podra emplearse el directivo .byte con
los cdigos ASCII de los caracteres de la cadena pero son ms tiles los directivos .ascii y
.asciz cuya sintaxis es la siguiente:
.ascii
"cadena de caracteres 1" [,"cadena de caracteres 2"...]
.asciz
Ambos directivos guardan en bytes sucesivos los cdigos ASCII de los caracteres que se
indican. La diferencia entre ambos es que .ascii reserva espacio estrictamente para las cadenas
de caracteres que se indican y .asciz hace lo mismo, pero terminando cada una de las cadenas
con un byte nulo.
Fig. B.1. Programa en lenguaje ensamblador de SPARC para leer una cadena de caracteres y escribirla.
B.7. Ejemplo de programacin 239
Fig. B.2. Programa en lenguaje ensamblador de SPARC para leer una cadena de caracteres y es-
cribirla. Este programa hace uso de instrucciones sintticas
240 Introduccin al lenguaje ensamblador de SPARC
tado para facilitar su comprensin. En una primera versin no emplearemos las instrucciones
sintticas (gura B.1).
En la versin ms evolucionada de la gura B.2 se muestra el mismo programa pero utili-
zando instrucciones sintticas. Como puede verse, esta ltima versin es muchsimo ms legible
que la anterior.
Bibliografa y referencias
PAUL , R.P. 2000. SPARC Arquitecture, Assembly Language Programming & C. 2 edn. Prentice-Hall.
W EAVER , D.L., & G ERMOND , T. ( EDITORES ). 1994. The SPARC Architecture Manual, version 9.
Prentice-Hall International.
CUESTIONES Y PROBLEMAS
B.1 Escribir una versin del programa de ejemplo citado en el texto que efecte la lectura de
la cadena por teclado mediante una funcin. Esta funcin debe depositar la cadena leda
a partir de la direccin de memoria especicada en su registro i0 (o0 para los programas
que la llamen) y devolver la longitud de la cadena leda en su registro i1 (o1 para los
programas que la llamen).
B.2 Escribir una nueva versin de la funcin citada en el problema anterior que almacene en
memoria la cadena terminada con un carcter nulo. El segundo parmetro (i1) debe tener
una doble funcin: actuando como parmetro de entrada, recibir el nmero mximo de
caracteres que se espera en la cadena, y, como parmetro de salida, devolver el nmero
de caracteres realmente ledo.
B.3 Escribir una funcin en lenguaje ensamblador de SPARC que escriba en la pantalla del
terminal la cadena que se encuentra en memoria a partir de la direccin especicada en
su registro i0 (o0 para los programas que la llamen). La funcin debe escribir caracteres
hasta que se encuentre un carcter nulo.
B.5 Haciendo uso de algunas de las funciones escritas en los problemas anteriores, escribir
un programa, en lenguaje ensamblador de SPARC, que lea una cadena de caracteres del
Cuestiones y problemas 241
teclado del terminal, la almacene en memoria y luego la escriba por pantalla pasada a
maysculas.
B.6 Escribir una funcin, en lenguaje ensamblador de SPARC, que tome una cadena cuya
direccin se especique en el registro i0 (o0 para los programas que la llamen), la inter-
prete como un nmero en hexadecimal y deposite ese nmero en el registro i1 (o1 para
los programas que la llamen).
B.7 Escribir una funcin, en lenguaje ensamblador de SPARC, que escriba a partir de la di-
reccin dada por el registro i1, una cadena que represente el valor del contenido de su
registro i0 (o0 para los programas que la llamen) en hexadecimal.
B.8 Utilizando las funciones de los problemas anteriores, escribir un programa en lenguaje
ensamblador de SPARC que pida por teclado un nmero hexadecimal y escriba por la
pantalla, tambin en hexadecimal, el doble de ese nmero.
B.9 Escribir una funcin en ensamblador de SPARC con dos parmetros. La funcin debe
extraer de la cadena que comienza en la direccin especicada por el primer parmetro
un nmero, interpretarlo en decimal y devolver el valor obtenido en el segundo parme-
tro. Se puede suponer que la cadena especicada por el primer parmetro slo contiene
caracteres numricos.
B.10 Escribir una funcin en ensamblador de SPARC con dos parmetros. La funcin debe
devolver, en la direccin especicada por el primer parmetro, una cadena que contenga
el valor del segundo parmetro escrito en decimal.
B.11 Empleando algunas de las funciones anteriores escribir un programa en lenguaje ensam-
blador de SPARC que pida por teclado un nmero en hexadecimal y lo escriba por pantalla
en decimal.
B.12 Empleando algunas de las funciones anteriores escribir un programa en lenguaje ensam-
blador de SPARC que pida por teclado un nmero en decimal y lo escriba por pantalla en
hexadecimal.
B.13 Escribir un programa, en lenguaje ensamblador de SPARC, que pida por teclado un n-
mero en hexadecimal, lo almacene en un registro, y escriba por pantalla en decimal el
valor del contenido de su byte de orden ms bajo.