© Prof. José Mª Foces Morán PCSpim: SPIM sobre Windows Ventana principal de PCSpim Consola: permite interactuar con el programa que está siendo simulado. DATA SEGMENT: Ver el segmento de datos del programa simulado. MESSAGES: Progreso de la simulación. REGISTERS: Ver los registros arquitecturados de MIPS en tiempo real TEXT SEGMENT:Ver instrucciones en su formato binario y ensamblador
© Prof. José Mª Foces Morán SPIM: Arquitectura Arquitectura de 32 bits. Los registros son de 32 bits de ancho Las direcciones de memoria Las instrucciones tienen 32 bits de ancho. Arquitectura Load/Store: Las operaciones con la memoria están limitadas a cargas y almacenamientos. No hay ninguna instrucción de incremento de memoria. No hay modos indirectos. Las instrucciones emplean tres direcciones: destino, fuente1, fuente2 add t0, t1, t2 Tiene 32 registros Uno de ellos, llamado $zero, contiene un cero, siempre. Little-endian: extremista inferior. Esta versión de Spim, la cual, corre sobre Windows para Intel-32, es little-endian, igual que la plataforma Intel-32. Sobre UNIX o LINUX para SPARC, por ejemplo, es big- endian.
© Prof. José Mª Foces Morán SPIM: MIPS assembly language. Lenguaje ensamblaje de MIPS(assembly). Ofrece un nivel de abstracción superior al de la arquitectura. Los programas se van escribiendo instrucción-a- instrucción, igual que en el caso anterior. Constituye una forma más "simbólica" de escribir un programa. Una sentencia de lenguaje de ensamblaje tiene: Etiqueta - nombres simbólicos: Permite nombrar tanto instrucciones como datos simples y arrays. Campo de instrucción: Nemónico de la operación (P.ej.: add ). Operandos : Pueden ser etiquetas o números. Bandera de indirecto. Campo de comentarios: ;
© Prof. José Mª Foces Morán SPIM: Registros. MIPS posee 32 registros de propósito general: $0 a $32. El lenguaje de ensamblaje de MIPS (y también SPIM) les asocia un nombre simbólico representativo de los convenios que se aplican al uso de cada registro. REGISTROS de SPIM/MIPS. El nombre indica el propósito del registro: $v0-$v1, el valor de retorno de una función. $a0-$a3, los argumentos 1-4 $t0-$t9, registros temporales $s0-$s7, registros temporales con garantía de que se salvan entre llamadas a subrutinas. $gp, puntero al area global $sp, puntero de pila $fp, puntero de marco de pila $ra, dirección de retorno $k0-$k1, reservados para el kernel del SO. INSTRUCCIONES QUE MANEJAN REGISTROS. Copiar el contenido de rs a rd move rd, rs Obtener la suma de rs1 y rs2 y poner el resultado en rd addu rd, rs1, rs2 Obtener la resta rs1- rs2, sin signo y poner resultado en rd: subu rd, rs1, rs2
© Prof. José Mª Foces Morán SPIM: Segmentos. Los programas que simula SPIM son programas escritos en ensamblador de MIPS y su estructura contiene al menos tres segmentos: datos, código y pila. SEGMENTOS Dentro de un fichero ejecutable los datos y los programas están separados en tres áreas : SEGMENTO DE CODIGO: Contiene las instrucciones del programa Es de sólo lectura El directivo empleado para delimitar el segmento de código en el texto fuente es:.text SEGMENTO DE DATOS: Contiene datos estáticos Lectura y escritura El directivo empleado para delimitar el segmento de datos en el texto fuente es:.data SEGMENTO DE PILA: Guarda información sobre los procedimientos/subrutinas en ejecución. Guarda la dirección de retorno de proc/subrutina. Guarda las variables locales de una proc/subrutina.
© Prof. José Mª Foces Morán SPIM: Reserva de espacio de memoria para constantes y variables. Cadenas terminadas en ‘\0’. El directivo es.asciiz.El ejemplo siguiente crea una cadena llamada auto-terminada en ‘\0’ llamada mi_mensaje mi_mensaje.asciiz “Hola mundo!\n” bytes, fp-simple precisión, fp-doble, words: El directivo.byte reserva espacio para datos de 8 bits. El ejemplo siguiente crea una lista de bytes cuya dirección base es mis_datos_de_8bits inicializados con los valores 45 decimal, 50 hexadecimal, etc. mis_datos_de_8bits.byte 45, 0x50, 0x10, 0 .word reserva espacio para datos de 32 bits. El ejemplo siguiente crea una lista de bytes cuya dirección base es mis_datos_de_32bits inicilaizados con los valores siguientes separados por comas. mis_datos_de_32bits.word 0x , 0xFF00FF00El .float reserva espacio para datos de punto flotante de 32 bits(simple precisión). mis_datos_de_fp32.float 3.14E0, 1.0, -1.0 .double reserva espacio para datos de punto flotante de 64 bits (doble precisión). mis_datos_de_fp32.double E-600, 1.0, -1.0
© Prof. José Mª Foces Morán SPIM: Llamadas del sistema El simulador Spim incluye algunas llamadas del sistema compatibles con UNIX para imprimir datos en la ventana Console, leer datos desde Console, salir del programa, etc.
© Prof. José Mª Foces Morán SPIM: Un programa de ejemplo. # Universidad de Leon, Dept. IEE, 1998 # Estructura y Tecnolog¡a de Computadores # Maquinas Electronicas # Jose M. Foces Moran..data # Aqui comienza el segmento de datos prompt1:.asciiz "Entre un entero: " # Cadena del mensaje 1.align 2 # Alinear el dato siguiente en # frontera de palabra. prompt2:.asciiz "\nEntre otro entero: " # Cadena del mensaje 2.align 2 resultado:.asciiz "\nLa suma es: " # Cadena del mensaje de resultado.text # Comienzo del segmento de codigo.globl main # La etiqueta main ha de ser global (se verá # desde cualquier fichero del proyecto). main: # Creamos main, el punto de entrada a nuestro # programa desde el kernel de Spim. Esto es un # convenio que hay que respetar. li $v0, 4 # la $a0, prompt1 # Imprimir mensaje 1 en la consola syscall # li $v0, 5 # syscall # Leer el primer entero desde la consola move $s0, $v0 # Salvar el primer entero en $s0 li $v0, 4 # la $a0, prompt2 # Imprimir mensaje 2 en consola syscall # li $v0, 5 # syscall # Leer el segundo entero move $s1, $v0 # Salvar el entero en $s1 add $s2, $s0, $s1 # hacer $s0 + $s1 --> $s2 li $v0, 4 la $a0, resultado syscall # Imprimir mensaje del resultado en consola li $v0,1 # Llevar el resultado a $a0 move $a0, $s2 # Imprimir $a0 en consola syscall