Clase 04 - Assembly y el Simulador SPIM
Download
Report
Transcript Clase 04 - Assembly y el Simulador SPIM
Assembly
y el Simulador SPIM
66.20 Organización de Computadoras
Generación de un Ejecutable
SOURCE
FILE
SOURCE
FILE
SOURCE
FILE
COMPILER
COMPILER
COMPILER
ASSEMBLY
SOURCE
FILE
ASSEMBLY
SOURCE
FILE
ASSEMBLY
SOURCE
FILE
ASSEMBLER
OBJECT
FILE
ASSEMBLER
OBJECT
FILE
ASSEMBLER
OBJECT
FILE
LINKER
EXTERNAL
LIBRARIES
Código de
alto nivel
Código en
lenguaje
ensamblador
Código
binario
EXECUTABLE
FILE
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.
OPCODE
OPERANDOS
addi $t1, $t2, 0xfffe
001000
01010
01001
1111 1111 1111 1110
Assembler (ensamblador)
Programa encargado de traducir código Assembly en su
equivalente binario.
Como salida genera un archivo objeto.
addi
$t1,
$t2,
0xfffe
PROCESO DE
ENSAMBLADO
001000
01010
01001
1111 1111 1111 1110
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.
OBJECT FILE
main:
...
call printf
...
Referencia
no resuelta
LINKER
OBJECT FILE
main:
...
call printf
...
printf:
printf:
...
EXECUTABLE FILE
...
Símbolo
externo o
global
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.
PCspim
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.
Mensajes del simulador.
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:
• En realidad aquí vemos 3 modos de
EJEMPLOS
jr
ld
ld
ld
ld
ld
$ra
$a0,
$a0,
$a0,
$a0,
$a0,
4
4($a1)
valor
valor + 4
valor + 4($a1)
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