14
Javier Gombao Fernández-Calvillo | Grupo ARA EC PRÁCTICA 1.1 INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR –MARS

Introducción al lenguaje ensamblador (ESTRUCTURA DE LOS COMPUTADORES)

Embed Size (px)

DESCRIPTION

Estructura de los computadores. Lenguaje ensamblador. Javi Gombao.Universidad de Alicante.

Citation preview

  • Javier Gombao Fernndez-Calvillo | Grupo ARA

    EC PRCTICA 1.1 INTRODUCCIN AL

    LENGUAJE ENSAMBLADOR MARS

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 1

    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- MARS ESTRUCTURA DE LOS COMPUTADORES, ARA. JAVIER GOMBAO FERNNDEZ-CALVILLO

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 2

    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:

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 3

    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

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 4

    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

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 5

    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 Value (+18)

    0x10010060 0x00004242

    Adress Value (+18)

    0x10010060 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)

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 6

    - 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 Campos:

    Inmediato de 16 bits

    o Los datos inmediatos se extienden a 32 bits

    En ciertas instrucciones se hacen extensin de signo

    En otras instrucciones se hacen extensin de signo

    o Tambin se usa para indicar la longitud de un desplazamiento.

    o En este caso el inmediato es de 5 bits

    o Permitido solo para operandos fuente :

    o Notacin: dato (sin prefijo).

    o 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 Campos:

    Registro: 5 bits

    Desplazamiento: 16 bits

    o Permitido para operando fuente en almacenamiento y destino en cargas:

    o Notacin: desplazamiento ($n)

    o 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.

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 7

    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.

    Instruccin ensamblado

    r

    Instruccin cdigo

    mquina Tipo

    opcode (6)

    rs (5)

    rt (5)

    rd (5)

    immediate (16)

    instr_index (26)

    sa (5)

    function (6)

    lw $10,8($7)

    0x8CEA0008 I 10001

    1 0011

    1 0101

    0 -

    0000000000001000

    - - -

    lw $a0,array(

    $t3) 0x3c011001 I

    0011 11

    00000

    00001

    - 0001 0000 0000 0001

    - - -

    addi $t2,$t2, 8

    0x214a0008 I 001000

    01010

    01010

    0000 0000 0000 1000

    - - -

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 8

    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:

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 9

    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

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 10

    .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.

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 11

    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).

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 12

    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)

  • Javi Gombao

    Prctica 1.1- Introduccin al lenguaje ensamblador Pgina 13

    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.