Assembly y el Simulador SPIM 66.20 Organización de Computadoras

Preview:

Citation preview

Assemblyy el Simulador SPIM

66.20 Organización de Computadoras

Generación de un Ejecutable

SOURCEFILE COMPILER

ASSEMBLY SOURCE

FILEASSEMBLER

OBJECTFILE

SOURCEFILE COMPILER

ASSEMBLY SOURCE

FILEASSEMBLER

OBJECTFILE

SOURCEFILE COMPILER

ASSEMBLY SOURCE

FILEASSEMBLER

OBJECTFILE

LINKEREXECUTABLE

FILE

EXTERNALLIBRARIES

Código de alto nivel

Código en lenguaje

ensamblador

Código binario

Assembly

Es un lenguaje de programación de bajo nivel. Es una representación simbólica del código binario de

las intrucciones. Utiliza mnemónicos para representar cada instrucción.

001000 01010 01001 1111 1111 1111 1110

OPCODE OPERANDOS

addi $t1, $t2, 0xfffe

Assembler (ensamblador)

Programa encargado de traducir código Assembly en su equivalente binario.

Como salida genera un archivo objeto.

001000 01010 01001 1111 1111 1111 1110

PROCESO DE ENSAMBLADO

addi $t1, $t2, 0xfffe

Assembler (cont.)

Label: nombre simbólico para un objeto. Puede aplicarse a una instrucción, a un procedimiento (dir. de 1ra instrucción), a un string, etc. Externo: se puede acceder desde fuera del módulo

donde se define (.globl main); Local: solo puede accederse desde el módulo que lo

define. Todas las referencias externas deben quedar resueltas

para que un programa pueda ejecutarse

Linker (vinculador)

Enlaza los archivos objeto que pertenecen a un programa, y genera un programa ejecutable.

Resuelve referencias a bibliotecas externas (ojo: printf es realmente una funcion de librería no un syscall).

Asigna las posiciones finales de memoria.

main:

... call printf ...

printf:

...

Referencia no resuelta

Símbolo externo o

global

LINKER

main:

... call printf ...

printf:

...

OBJECT FILE

OBJECT FILE

EXECUTABLE FILE

Modelo de Memoria

La arquitectura MIPS divide la memoria en tres secciones: Segmento de texto. Segmento de datos (estáticos y dinámicos). Pila (stack).

Registros

La arquitectura MIPS presenta 32 registros de propósito general, y 32 registros para punto flotante.

Debería respetarse una convención para su uso (en general es muy mala idea no hacerlo):

$a0-$a3 primeros 4 argumentos a un procedimiento. $v0 y $v1 valor de retorno de un procedimiento. $t0-$t9 almacenamiento temporal. $s0-$s7 almacenamiento de largo plazo. $sp puntero a la pila. $fp puntero al stack frame. $ra dirección de retorno en la llamada a un procedimiento.

Ejemplos

Operación aritmética (adición):addu $t0, $t6, 1

($t0 $t6 + 1)

Pasaje de un parámetro:li $a0, 10

($a0 10)

Retorno de un valor:li $v0, 1

($v0 1)

Llamada a Procedimientos

Debe respetarse la convención para el uso de registros.

Debe tomarse una porción de la pila (stack frame): Para almacenar los

argumentos pasados (1 al 4: registros, 5+: stack frame del caller).

Para almacenar registros de largo plazo.

Para almacenar las variables locales al procedimiento.

Llamada a Procedimientos (cont.)

Ojo: printf no es syscall, aqui se quiso usar print_str del SPIM

Simulador SPIM

Permite ejecutar programas escritos en Assembly para arquitecturas MIPS32.

Home page: http://www.cs.wisc.edu/~larus/spim.html

Última versión: 7.2 Disponible en varios “sabores”:

Spim: simulador manejado por línea de comandos. XSpim: para ambientes X-windows (UNIX/Linux) PCspim: para ambientes Microsoft Win32.

Mensajes del simulador.

Registros de la CPU y de la unidad de punto flotante.

Instrucciones assembly del programa y del sistema.

Datos cargados en el espacio de memoria del programa.

PCspim

Características

No implementa memorias caché. No simula latencias (de memoria o de operaciones

aritméticas). Maneja pseudoinstrucciones (instrucciones que provee

el ensamblador, y que se implementan a partir de otras más simples).

Soporta formatos big y little-endian.

BIG-ENDIAN

LITTLE-ENDIAN

Llamadas al Sistema

SPIM soporta algunos system calls básicos:

Unidades Simuladas

Modos de Direccionamiento

SPIM soporta los siguientes modos de direccionamiento:

jr $rald $a0, 4ld $a0, 4($a1)ld $a0, valorld $a0, valor + 4ld $a0, valor + 4($a1)

EJEMPLOS • En realidad aquí vemos 3 modos de direccionamiento: register indirect, immediate y displacement. El resto son una “ilusión del assembler”.• MIPS implementa solo immediate y displacement con campos de 16 bits. Register indirect se obtiene con displacement=0 y absolute address usando como registro a $zero.

Edición del Código

SPIM no provee facilidades para escritura de código assembly.

Debe utilizarse un editor de textos: Vi / Vim (http://www.vim.org/) Emacs / Xemacs (http://www.xemacs.org/) Editplus (http://www.editplus.com/) UltraEdit (http://www.ultraedit.com/) MIPSter (http://www.downcastsystems.com/mipster/)

La herramienta EditPlus

Puede obtenerse de http://www.editplus.com/. Debe descargarse un archivo de sintaxis para

assembly de MIPS32 (http://www.editplus.com/others.html).

La herramienta EditPlus (cont.)

Ejemplo 1: Hola Mundo MIPS!

Escribir un programa en assembly de MIPS32 que muestre en consola la leyenda "Hola Mundo!" y termine.

Ejemplo 2: Loops y Arreglos de Valores

Escribir un programa en assembly de MIPS32 que encuentre el máximo de la siguiente serie de números: {4, 15, 0, 48, 22, 7}

Deberá mostrar en consola el máximo hallado.

Ejemplo 3: Funciones y Punto Flotante

Escribir un programa en assembly de MIPS32 que cargue 2 número reales ingresados por consola, los sume, y muestre el resultado (también por consola).La suma de los números debe realizarse llamando a una función.

El Simulador SPIM

66.20 Organización de Computadoras