Sunteți pe pagina 1din 14

EC

PRCTICA

1.1

INTRODUCCIN

AL

LENGUAJE ENSAMBLADOR MARS

Javier Gombao Fernndez-Calvillo | Grupo ARA

Javi Gombao

Prctica 1.1 Introduccin al


Lenguaje ensamblador- MARS
ESTRUCTURA DE LOS
COMPUTADORES, ARA.

JAVIER GOMBAO FERNNDEZ-CALVILLO

Breve introduccin terica:


En este ejercicio de Estructura de los Computadores, pondremos en prctica el lenguaje
ensamblador mediante una serie de actividades que se efectuarn y se explicarn a continuacin.
Pero antes centrarnos en los diferentes apartados de la prctica, incorporaremos una breve
explicacin del lenguaje ensamblador y conceptos relacionados con el mismo con la finalidad de
realizar una breve documentacin introductoria.
El lenguaje ensamblador es el nico lenguaje que entienden los microcontroladores, es
decir, es el cdigo mquina formado por ceros y unos del sistema binario. Las caractersticas ms
significativas son las siguientes:
Expresa las instrucciones de una forma ms natural al hombre a la vez que muy
cercana al microcontrolador, ya que cada una de esas instrucciones se corresponde
con otra en cdigo mquina.
Trabaja con nemnicos, es decir, con grupos de caracteres alfanumricos que
simbolizan las rdenes o tareas a realizar. La traduccin de los nemnicos a cdigo
mquina entendible por el microcontrolador la lleva a cabo el programa
ensamblador
El programa escrito en lenguaje ensamblador se denomina cdigo fuente (*.asm).
El programa ensamblador proporciona a partir de este fichero el correspondiente
cdigo mquina, que suele tener la extensin *.hex.
El cdigo fuente, compuesto por una sucesin de lneas de texto en donde cada
lnea puede estructurarse en hasta cuatro campos o columnas separados por uno o
ms espacios o tabulaciones entre s, presenta un campo de etiquetas o expresiones
alfanumricas, un campo de cdigo (que corresponde al nemnico de la
instruccin), un campo de operandos y datos (que contiene los operandos que
precisa el nemnico utilizado) y el campo de comentarios (aquello que no tiene ; al
final de lnea).
Por lo que hace al campo de cdigo puede corresponder a las instrucciones
(nemnicos convertidos por el ensamblador en cdigo mquina en que puede
ejecutar el ncleo del microcontrolador), a las directivas (indicaciones al programa
ensamblador de cmo tiene que generar el cdigo mquina) y a las macros
(secuencias nemnicas que pueden insertarse en el cdigo fuente del ensamblador
de una manera abreviada mediante una simple llamada).

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 1

Javi Gombao
A lo largo de este ejercicio pondremos en prctica los trminos MIPS y MARS cuya definicin y
relacin con el lenguaje ensamblador la expondremos a continuacin:
Por un lado, el MIPS es un procesador de 32 bits con arquitectura RISC (Esta arquitectura es
un tipo de diseo de CPU que se caracteriza por instrucciones de tamao fijo y presentadas en un
reducido nmero de formatos adems, slo las instrucciones de carga y almacenamiento acceden
a la memoria de datos tienen el objetivo de permitir el paralelismo en la ejecucin de instrucciones
y reducir los accesos a memoria) y un banco con 32 registros de 32 bits. Su modelo de ejecucin es
del tipo Registro-Registro y su modelo de memoria corresponde el bit de menor peso con la
direccin de palabra (Little-Endian). Por otra parte, posee tres tipos de instrucciones (R, I y J) todas
ellas de 32 bits.
Por otro lado, el simulador MARS es una aplicacin multiplataforma con licencia MIT
(Massachusetts Institute of Technology), lo que nos permite usarlo sin restricciones adems de
tener una funciones de depuracin muy intuitivas y una interfaz sencilla y cmoda .
A continuacin pondremos en prctica todo este conjunto de conceptos

Dado el siguiente programa escrito en leguaje ensamblador:

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 2

Javi Gombao

Se solicitan las siguientes tareas:


1. Cargar el programa en el simulador MARS y comprobar su funcionamiento paso a paso.

Como hemos mencionado anteriormente, disponemos de 32 registros, cada uno de 32 bits. Esto nos permite
almacenar bytes, medias palabras y palabras. Para hacer referencia a un registro, se escribe el signo de dlar
$, seguido del registro a utilizar.
El funcionamiento paso a paso se detalla a continuacin:
En primer lugar, mostramos por consola una cadena:

En segundo lugar, cargamos un entero desde el segmento de datos (en concreto el nmero 40) y lo
mostramos por consola:

Leemos un entero introducido por teclado (por ejemplo el 4) y lo mostramos por consola:

Posteriormente mostramos un elemento desde un array de enteros:

Mostramos un carcter desde el segmento de datos


Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 3

Javi Gombao

Mostramos otro carcter desde el segmento de datos

Mostramos, despus, un carcter de una cadena de datos

Leemos una cadena de caracteres y la mostramos por consola (por ejemplo, la cadena de caracteres
introducida ha sido: EC):

Por ltimo, finaliza el programa


Con cada paso efectuado, el segmento de datos y tambin los diferentes valores de registro se modifican.
Por ejemplo, en el registro se obtiene:
Antes de la ejecucin

Despus de la ejecucin

Por lo que hace al contenido del segmento de datos, lo veremos en el prximo apartado
Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 4

Javi Gombao
2. Mostrar el contenido del segmento de datos de memoria antes y despus de la ejecucin
del programa como se muestra en el ejemplo:
Segmentos de datos antes de la ejecucin

Segmentos de datos despus de la ejecucin

3. Hay cambios en todas las posiciones de memoria indicadas? Raznalo


Como podemos observar en las dos imgenes anteriores; slo se produce cambio en esta posicin de
memoria:
Adress
0x10010060

Value (+18)
0x00004242

Adress
0x10010060

Value (+18)
0x000a4345

Observando este cambio en dicha posicin de memoria (y teniendo en cuenta todas las dems, por
supuesto), rellenaremos la siguiente tabla:
Direccin de memoria

Contenido inicial

Contenido final

0x10010078

(0)x00

(0)x00

0x10010079

(0)x00

(0)x0a

0x1001007A

(0)x42

(0)x43

0x1001007B

(0)x42

(0)x45

0x1001008C

(0)x00

(0)x00

0x1001008D

(0)x00

(0)x00

4. Codificar las siguientes instrucciones del programa en cdigo mquina, indicando el tipo
de instruccin (R, I, J) y separando cada uno de sus campos como se muestra en el
ejemplo:
Para este ejercicio debemos de tener en cuenta los siguientes campos:
-

Opcode: cdigo de la operacin (6 bits)

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 5

Javi Gombao
-

Rs: registro fuente (5 bits)


Rt: registro auxiliar (5 bits)
Rd: registro destino (5 bits)
Immediate: para operaciones y desplazamientos (16 bits)
Instr_dex: para saltos (26 bits)
Sa: desplazamiento (5 bits)
Function: especifica funciones junto con op-code.

Adems de lo indicado antes, es necesario remarcar que existen diversos modos de direccionamiento en
MIPS. Para este ejercicio nos centraremos en:
Direccionamiento inmediato:
o

o
o
o

Campos:
Inmediato de 16 bits
Los datos inmediatos se extienden a 32 bits
En ciertas instrucciones se hacen extensin de signo
En otras instrucciones se hacen extensin de signo
Tambin se usa para indicar la longitud de un desplazamiento.
En este caso el inmediato es de 5 bits
Permitido solo para operandos fuente :

Notacin: dato (sin prefijo).

Ejemplo: addi $16, $17, 1 suma una unidad al contenido del registro

17 y el resultado lo almacena en el registro 16.

Direccionamiento indirecto a registro con desplazamiento


o

o
o

Campos:
Registro: 5 bits
Desplazamiento: 16 bits
Permitido para operando fuente en almacenamiento y destino en cargas:

Notacin: desplazamiento ($n)


Ejemplo: lw $16, 20($17) carga (load word) en el registro 16 la palabra
contenida 20 bytes ms all de la direccin almacenada en el registro.

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 6

Javi Gombao
Instruccin
ensamblado
r

Instruccin
cdigo
mquina

Tipo

opcode
(6)

rs
(5)

rt
(5)

rd
(5)

immediate
(16)

instr_index
(26)

sa
(5)

function

lw
$10,8($7)

0x8CEA0008

10001
1

0011
1

0101
0

000000000
0001000

lw
$a0,array(
$t3)

0x3c011001

0011
11

0000
0

0000
1

0001 0000
0000 0001

addi
$t2,$t2, 8

0x214a0008

00100
0

0101
0

0101
0

0000 0000
0000 1000

(6)

Para la obtencin de los siguientes resultados se ha efectuado los siguientes pasos:


Escribir la instruccin ensamblador en el cdigo
Comprobar el correcto funcionamiento de las instrucciones
Pasar el nmero hexadecimal a binario teniendo en cuenta el nmero de bits permitidos en los
campos.
El formato de las instrucciones es de tipo I :
Inst (6 bits)

Rs (5 bits)

Rt (5 bits)

Inm (16 bits)

5. Cul es la funcin del registro t1 en el programa y que nos permite hacer en funcin del
valor que pongamos en l? Podemos poner cualquier valor?
Una vez ledo un entero introducido por teclado y mostrado por consola; se muestra un elemento desde un
array de enteros en donde solo se puede tener valores mltiplos de 4i. Donde i es el ndice. As pues,
podemos poner cualquier valor siempre que vayan en comillas y en el array sean mltiplos de 4 en su versin
del cdigo ASCII.

6. Cul es la funcin del registro t2 en el programa y que nos permite hacer en funcin del
valor que pongamos en l? Podemos poner cualquier valor?
Con la funcin t2, en el programa se muestra un carcter de una cadena de datos, una vez mostrado dos
veces unos caracteres desde el segmento de datos. ste a diferencia del anterior, no tiene porqu ser
mltiple de 4. En este caso, se podr poner cualquier valor siempre que vayan entre comillas y estn en su
versin del cdigo ASCII, sin tener presente que sean mltiplos o no.

7. Modifica el programa para que antes de introducir tanto el valor del nmero como la
cadena de caracteres te muestre unos comentarios por consola que te invite a ello de una
forma ordenada.
Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 7

Javi Gombao
Si nos ceimos a lo que nos especifica el enunciado, realizando las modificaciones del programa oportunas y
utilizando los comandos necesarios expuesto en la teora, obtenemos el siguiente cdigo.

8. Qu sucede si el string introducido por teclado es muy largo? Qu podemos hacer para
solucionarlo?
El string est definido por un tamao especfico. En el caso de que nuestro valor introducido sea mayor que
dicho tamao la ejecucin del programa se reanuda de mane automtica asta llega siguiente syscall y no os
permite seguir escribiendo. Entonces, atendiendo a enunciado cmo se podra solucionar? Pues ,
aumentando el tamao el string (es decir, aumentar el nmero de la lnea 39).

9. Modifica el programa para que copie dato2 a la direccin del segmento de datos
0x10010100 y a continuacin almacene dato1.
Para afrontar este problema, utilizaremos los siguientes comandos del lenguaje ensamblador (li, lw, sw,
lw, sw). En primer lugar, copiamos de un dato, concretamente el 256, en el registro $t3 (carga
inmediata). El dato que se escribe en este registro corresponde a los dos conjuntos (estndar y
extendido) del cdigo ASCII cuya funcin primordial es permitir que los ordenadores y programas
informticos intercambien informacin.
En segundo lugar, cargamos una palabra para su posterior almacenamiento en el identificador de dicho
registro. Finalmente, cargamos otra palabra para que, nuevamente, sea almacenada en el identificador
de registro $t3. De esta manera, el programa copie el dato2 a la direccin del segmento de datos
0x10010100 y posteriormente se almacene en el dato1:

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 8

Javi Gombao

Y observamos que, efectuando el programa paso a paso, el contenido del de la direccin del segmento de
datos cambia:
Paso inicial
Paso final

Como hemos podido observar; se han empleado dos comandos relevantes:


-

Carga palabra (lw, rt, direccin): carga los 32 bits almacenado en la palabra de memoria
especificada por la direccin del registro rt.

Almacenamiento de palabra (sw, rt, direccin): almacena el contenido del registro rt en la palabra
de memoria indicada por la direccin,

10. Modifica el programa para que calcule el nmero de nmeros negativos y el nmero de
nmeros impares del array.
En ocasiones, no nos bastan los 32 registros de 32 bits para almacenar lo que necesitamos . En
este caso, recurrimos a la memoria principal y trabajamos con direcciones de memoria, mediante
etiquetas. stas son nombres que se le asignan a una posicin de memoria. Bien sea de la seccin
de datos, o de la seccin de cdigo pero slo se refiere a una sola direccin de memoria que no
cambia durante toda la ejecucin del programa.
Aprovechamos esta definicin para aadir que cuando tenemos, bien un dato muy grande, o
una serie de datos que necesitamos manipular, es recomendable usar la memoria principal. Para
ello podemos reservar memoria al inicio de nuestro programa para los datos que ya sabemos
vamos a manipular. Las reservas de memoria se especifican en la seccin .data de nuestro cdigo
mediante etiquetas y tipos. Estos tipos especifican el tamao del dato o el tipo de dato que se va a
almacenar. Son:
.word reserva una palabra
.half reserva media palabra

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 9

Javi Gombao
.byte reserva un byte
.ascii reserva una cadena de caracteres .
asciiz reserva una cadena de caracteres terminados con el carcter nulo
.space reserva un nmero especificado de bytes que comienza sin contenido.

Por lo que hace a los comandos utilizados en este apartado de la prctica; incidiremos en los siguientes:
-

Divisin (div rs, rt): divide el registro rs por el de rt. El cociente se almacena en LO y el resto en HI

Mueve desde HI (mfhi rd): se trata de un comando que transfiere el contenido del registro HI al
registro rd.

AND entre registros (and rd, rs, rt): operacin AND bit a bit entre los registros rs y rt. El resultado
se almacena en rd.

Suma inmediata: (rt, rs, rt): suma el contenido del registro rs con el valor inmediato, considerando
el signo. El resultado se almacena en el registro rt.

Salto si distinto (bne rs, rt, etiqueta): salta a etiqueta si rs es diferente de rt.

Salto mayor (bgt reg1, reg2, etiqueta): salta a etiqueta si reg1 es mayor o igual que reg2.

Teniendo todo esto en cuenta y incorporando los comandos adecuados en cada lnea se efecta la solucin
del problema.

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 10

Javi Gombao
Debemos de tener presente que el resultado se almacena en el registro, concretamente en t3.

11. Haz que a continuacin muestre por consola de forma separada (en forma de columna)
cada uno de los caracteres que has introducido y posteriormente calcule el nmero de
caracteres a que tiene el string introducido por teclado.
En este ejercicio se nos plantea modificar el cdigo de tal manera que aparezcan cada uno de los
caracteres que hemos introducido y que calculo el nmero de caracteres de a existentes. Para ello,
utilizaremos cargas de direcciones (la), cargas inmediatas (li), salto si igual (beq: salta a etiqueta si un
registro es igual a otro), saltos mayores (bgt: salta a etiqueta si un registro es mayor que otro registro),
cargas de bytes y extensin del signo (lb: carga los 8 bits almacenados en el byte de memoria
especificado por la direccin en el LSB de un registro determinado y extiende el signo), salto si distinto
(bne: salta a etiqueta si un registro determinado es diferente a otro) y la suma inmediata (suma el
contenido de un registro con el valor inmediato considerando el signo, cuyo resultado se almacena en
otro registro diferente).

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 11

Javi Gombao

A continuacin, detallaremos algunas definiciones, que por cuestin de espaci no hemos incorporado al programa:
Beq $t4, $zero, finpara compara t4 (caracteres del string1) con el valor cero que en ASCII es el representante de
NULL o salto de lnea . La primera vez que se compara t4, posee valor inicial auxiliar. Posteriormente se saltar al final
en las siguientes iteraciones del bucle cuando el usuario pulsa enter (esto es, cuando se inserta NULL o un salto de
lnea) o bien, que el string1 sea menor que las iteracciones mximas del bucle (es decir, introducir un nmero menor
que 8 caracteres.
Bgt $t0, $t1, finpara en este caso si $t0>$t1; se compara t0 tantas veces que se repita el bucle con el nmero de
veces que queremos repetirlo ($t1)

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 12

Javi Gombao
Lb $t4, 0 ($t2) aqu se carga el elemento vector string1 que se ha introducido previamente en $t4 (v[i] t4 es el
nmero insimo del vector e; i es t2 que se utiliza como 0 (t2) porque no se va ms lejos de t2.
Dicho esto; pongamos un ejemplo de ejecucin. Supongamos que el nmero introducido por teclado es el 1 y la cadena
de caracteres escrita es casa:

Como podemos observar se muestra por consola de forma separada (en forma de columna) cada uno de los caracteres
que hemos introducido.
El clculo de nmero de caracteres a lo podemos observar a la derecha del programa, donde aparecen todos los
registros. Concretamente el registro t3:
2: nmero de letras a.

Prctica 1.1- Introduccin al lenguaje ensamblador

Pgina 13

S-ar putea să vă placă și