¡Descarga Prácticas de Fundamentos de Computadores: Ensamblador y MIPS R2000 - Prof. Guirao Puerta y más Apuntes en PDF de Ingeniería Telemática solo en Docsity!
PRÁCTICAS DE FUNDAMENTOS DE COMPUTADORES
• OBJETIVOS DE LAS PRÁCTICAS
- Saber diferenciar entre los diferentes lenguajes de programación de sistemas microprocesadores.
- Conocer el sistema de representación numérica en distintos códigos: binario, hexadecimal, etc.
- Programar en lenguaje ensamblador.
- Saber implementar algoritmos (bucles, sentencias IF...THEM, CASE..., etc), en lenguaje ensamblador.
- Conocer estructuras de procesadores (ej. MIPS R
- Reconocer cómo se ejecuta una instrucción en una estructura procesadora.
- Reconocer el funcionamiento de estructuras tales como: memorias, ALU’s, registros, etc.
• elementos a utilizar en las prácticas
- Lenguaje de programación: Ensamblador
- Entorno de programación: PC SPIM
- Procesador: MIPS R
CONCEPTOS PREVIOS
• tipos de lenguajes de PROGRAMACIÓN
• Los microprocesadores ( F 06 DP ) trabajan con ceros y unos (niveles altos y bajos de tensión).
• Toda la información que almacenan y procesan los F 06 DP está formada por ceros y unos.
- Los lenguajes de programación se pueden clasificar dependiendo de la proximidad y dependencia con el procesador que va a interpretar las órdenes:
• Lenguaje máquina: Es el lenguaje más cercano al F 06 DP , las instrucciones están formadas
por ceros y unos. Es sumamente complejo y puede dar lugar a muchos errores.
Ejemplo: Sumar dos variables (20+15) 1010 1101 00010100 0000 1111
Sumar 20 15
- Lenguaje ensamblador: Las instrucciones se dan como abreviaturas o nemónicos.
Este lenguaje es propio de cada F 06 DP , que tiene su propio conjunto de instrucciones o
nemónicos.
Ejemplo: Sumar dos variables (20+15) ADDI 14H,0FH
- Lenguajes de alto nivel: Las instrucciones se dan como frases simples. Este lenguaje
no depende del F 06 DP. Como ejemplos de éstos tenemos: BASIC, PASCAL, C.
Ejemplo: Sumar dos variables (20+15) Sumar (20,15)
ESTRUCTURA DE UN PROGRAMA ENSAMBLADOR
- Los programas de ensamblador de los MIPS están divididos en dos partes principales:
- Segmento de datos: Contiene todos los datos constantes de nuestro programa.
- Segmento de texto: - Es la parte del programa que contiene el programa en sí. - El programa se estructura en subrutina. - Subrutina: Pequeños programas que hacen una función determinada dentro del programa principal.
- Ejemplo: ############### SEGMENTO DE DATOS ############### .data var_a: .word 255 var_b: .word 0xFF cadena: .asciiz “El resultado es: “ ############### SEGMENTO DE TEXTO ############### .text __start: ####### RUTINA PRINCIPAL ######## jal print cadena #Llama a la rutina que imprime la cadena lw $8,var_a #Carga una variable desde memoria ($8=$t0) lw $t1,var_b #Carga otra variable desde memoria add $t2,$t0,$t1 #Suma y pone el resultado en otro registro move $a0,$t2 #Pone en $a0 el resultado a imprimir. li $v0,1 #Código de llamada al sistema print_int syscall #Imprime el resultado li $v0,10 #Código de llamada al sistema exit syscall #Termina el programa print_cadena: ########### SUBRUTINA ########## la $a0,cadena #Pone en $a0 la dirección de la cadena a imprimir li $v0,4 #Código de llamada al sistema Print_string syscall #Imprime la cadena jr $31 #Vuelve a la rutina principal
SINTAXIS DEL ENSAMBLADOR
- Las principales reglas de escritura para un programa en ensamblador para el procesador MIPS R2000 son: - Cada instrucción debe ir en una sola línea. - Los comentarios comienzan con el símbolo “#”. - Es aspecto de cualquier línea es:
[etiqueta:] <código operación> [#comentarios]
- Etiqueta: Secuencia de caracteres alfanuméricos, subrayados y puntos, terminado con “:” (nunca pueden empezar con números) y que sirven para hacer referencia a la posición de memoria donde se ubican los datos o instrucciones.
- Código de operación: Son palabras reservadas, que nunca se pueden utilizar como etiquetas, y que pueden ser : directivas, instrucciones o pseudoinstrucciones.
- Directivas: Comienzan con un punto y sirven para indicar al ensamblador como debe tratar los datos y/o las instrucciones que vienen a continuación. Las directivas no generan código máquina, son de carácter informativo, y de algún modo guían el proceso de ensamblaje.
- Instrucciones: Representan una orden o tarea del procesador y son las que verdaderamente componen el programa que va a ejecutar el procesador.
- Pseudoinstrucciones: Son un conjunto de instrucciones no reales, ofrecidas por el ensamblador, y que este traduce en una o varias instrucciones reales. La función de estas pseudoinstrucciones es la de facilitar la elaboración de los programas.
- Operandos (argumentos): Para el caso de las instrucciones es habitual encontrarse registros, datos inmediatos o referencia a etiquetas.
- Los registros se pueden acceder directamente a través de su número o nombre, y lo normal es que sirvan de argumentos de las operaciones que representan las instrucciones.
Número de registro
Nombre (^) Utilización
Directiva Significado .align n (^) Alinea el siguiente dato sobre un límite 2 n^ bytes. Si se usa el valor 0 se desactiva
automáticamente la alineación de las directivas .half, .word, .float y .double hasta la siguiente directiva .data.
.ascii str (^) Almacena la cadena str en memoria, pero no la termina con un carácter nulo. La cadena
str debe estar entre comillas dobles. .asciiz str (^) Almacena la cadena str en memoria terminándola con un carácter nulo. La cadena str
debe estar entre comillas dobles. .byte b1, b2, ..., bn
Almacena los n valores en bytes consecutivos en memoria.
.data (^) Los elementos declarados tras esta directiva son almacenados en el segmento de datos, concretamente a partir de la dirección expresada en . Si el argumento no aparece se tomará la dirección por defecto. .double d1, d2, ..., dn
Almacena los n valores en coma flotante de doble precisión (64 bits) consecutivamente en memoria. .end (^) Fin de programa
.float f1, f2, ..., fn
Almacena los n valores en coma flotante de simple precisión (32 bits) consecutivamente en memoria. .globl simbolo (^) Declara simobolo como global y puede ser referenciado desde otros archivos.
.half h1, ..., hn (^) Almacena los n valores en medias palabras (16 bits) consecutivos en memoria.
.space n (^) Reserva n bytes de espacio en el segmento de datos.
.text (^) Los elementos declarados tras esta directiva son almacenados en el segmento de
código, concretamente a partir de la dirección . Estos elementos sólo pueden ser instrucciones o palabras (.word). Si el argumento no se utiliza, se tomará la dirección por defecto. .word w1, w2, ..., wn
Almacena los n valores en palabras (32 bits) sucesivas en memoria.
- CARGA DEL PROGRAMA
Una vez editado el programa con cualquier procesador de textos, se procede a su simulación. Para ello
se carga el fichero ( file F 0A E open ). Esta opción ensambla el programa, la carga en memoria, traduce las
etiquetas, chequea las instrucciones y pseudoinstrucciones y hace el análisis sintáctico y semántico del programa.
- EJECUCIÓN DEL PROGRAMA
Una vez cargado el programa en el simulador, la ejecución de éste se puede realizar de dos formas distintas:
- Opción Go del simulador: Con esta opción se ejecuta el programa sin pausas. Si se quiere
detener la ejecución del programa, se puede elegir la opción Break, y si se quiere detener el
programa en una dirección de memoria determinada se puede elegir la la opción Breakpoints.
- Depurador: El depurador o debugger del simulador permite que el programa se ejecute paso a
paso (instrucción a instrucción), opción single step (F10), o también permite ejecutar un
número determinado de instrucciones múltiple step (F11).