Resumen
En la primera practica tendréis que aplicar lo aprendido en el
tema 2 de teoría, las instrucciones y la forma de programar en procesadores
MIPS, en un programa, llamado MARS.
A la derecha teneis los valores de los Registros, debajo si estais
en la pestaña “Mars Messages” veréis mensajes relativos al ensamblamiento del
programa y errores en el mismo, si en cambio estais en la pestaña Run I/O
entonces veréis lo que hace exactamente vuestro programa, es decir,su ejecución
en tiempo real. En el centro esta la pantalla donde tendréis que escribir
código. Para la practica tendréis un archivo PDF con los ejercicios
propuestos de la practica y código ejemplo. Esto es muy importante, ya que
muchos ejercicios piden solo modificar el código ejemplo para que haga
determinadas cosas. Ire explicando mientras que ejecuto el primer código ejemplo de la
practica:
.data
array_byte: .byte 60,61,62,63
array_media: .half 10,20,30,40
array_palabra: .word -1,-2,-3,-4
.text
main:
la $t1,array_byte #Apunta a la dirección del 1º elemento de
array_byte
lb $s0,0($t1) # Carga el 1º elemento del vector en s0
lb $s1,1($t1) # Carga el 2º elemento del vector en s1
lb $s2,2($t1) # Carga el 3º elemento del vector en s2
lb $s3,3($t1) # Carga el 4º elemento del vector en s3
El código lo que hace es cargar los elementos de un vector en los
registros,ya que no se puede almacenar directamente un vector en los registros.
Veamos como ensamblarlo en MARS. Le damos al botón de “Archivo Nuevo” que viene representado, como
en todos los programas, por un folio en blanco, y escribimos el código.
Quedaria algo asi:
Como podeis ver, en el código los comentarios aparecen en verde, las instrucciones en azul, las directivas en rosa y los registros en rojo.
Ahora tendríamos que darle al botón de ensamblar, representado por una llave inglesa y un destornillador cruzados, pero el botón no esta resaltado. ¿Por qué? Pues porque el archivo de código que hemos creado no esta guardado. Tened cuidado con esto, podeis llevaros bastante tiempo sin saber porque no os deja ensamblar y es por esta tontería. Dadle al botón guardar y guardad el archivo donde queráis.

Ahora tendríamos que darle al botón de ensamblar, representado por una llave inglesa y un destornillador cruzados, pero el botón no esta resaltado. ¿Por qué? Pues porque el archivo de código que hemos creado no esta guardado. Tened cuidado con esto, podeis llevaros bastante tiempo sin saber porque no os deja ensamblar y es por esta tontería. Dadle al botón guardar y guardad el archivo donde queráis.
Ahora el botón de ensamblar si esta resaltado. Dadle. El programa cambiara de pantalla y os mostrara esto:
Debajo en donde se muestran los mensajes MARS dice que ha terminado de ejecutar el programa. Si os ha funcionado bien, a la izquierda podréis ver que los registros que menciona el programa han cambiado de estar a 0 a los valores que llevaban las posiciones del vector correspondientes. Asi se termina una practica, recordad que casi todas consisten en cambiar algo de un código ejemplo
MARS funciona asi sea cual sea el código que metas, asi que
siguiendo estos pasos no deberíais tener problemas para manejar el programa con
soltura y completar bien las practicas.
Trabajo realizado por Oscar Jimenez Rubio
FAQ
1ª) ¿Todos los registros son preservados en
llamada?
NO, los registros preservados durante una llamada
son aquellos que (por convenio) no serán modificados por una llamada de sistema
o a un procedimiento o función, por esta razón algunos si están preservados y
otros no.
Como vemos en la siguiente tabla algunos
registros son preservados y otros no; para mayor ampliación de información en
dicha tabla también aparecen el nombre, número, y uso de los registros que
citan.
Registros
Nombre
|
Número
|
Uso
|
Preservado en llamada
|
$zero
|
$0
|
constante
entera 0
|
sí
|
$at
|
$1
|
temporal
del ensamblador
|
no
|
$v0–$v1
|
$2–$3
|
Valores
de retorno de funciones y evaluación de expresiones
|
no
|
$a0–$a3
|
$4–$7
|
Argumentos
de funciones
|
no
|
$t0–$t7
|
$8–$15
|
Temporales
|
no
|
$s0–$s7
|
$16–$23
|
Temporales
salvados
|
sí
|
$t8–$t9
|
$24–$25
|
Temporales
|
no
|
$k0–$k1
|
$26–$27
|
Reservados
para el núcleo del SO
|
no
|
$gp
|
$28
|
puntero
global
|
sí
|
$sp
|
$29
|
puntero
de pila
|
sí
|
$fp
|
$30
|
puntero
de "frame"
|
sí
|
$ra
|
$31
|
$31
|
no
|
2ª) ¿Que son, para que sirven y como utilizo las llamadas al sistemas a la hora de programar en MIPS?
Las
llamadas al sistema en la programacion MIPS es un recurso del que
dispone el programador para indicarle al sistema que tiene que realizar
una operación de entrada o salida, o bien tiene que realizar alguna
tarea como cerrar el programa.
3ª) Explica brevemente que es lo que hace el siguiente codigo:
glob main
li $a 0,número 1
li $a 1,número 2
ADD $a 2, $a 1, $a 0
Sw $a 2, Resultado
En primer lugar guarda en registro el primer
número que es 100, después guarda el segundo número que es -10
A continucación suma los dos registros $a 1 y
$a 0, en el nuevo registro $a 2.
Finalmente almacena el resultado final que es
90.
4ª) El mapa de memoria de
MIPS está dividido en varias zonas o segmentos. De los 4 GB disponibles de
memoria, sólo 2 GB están disponible para los programas del usuario. El resto
sirve al sistema operativo y para la memoria virtual. ¿La zona del usuario se
subdivide en más segmentos?
SI, la zona del usuario
se subdivide a su vez en:
– Segmento de texto,
donde se almacena el programa.
– Segmento para datos
estáticos, que almacenan datos necesarios definidos en tiempo de compilación del
programa.
– Segmento para datos
dinámicos, es decir, que se definen sobre la marcha durante la ejecución del
programa.
5º)HOLA MUNDO
.data
texto: .ascii "Hola mundo"
.text
.globl main
main:
la $a0,texto
li $v0,4
syscall
Trabajo realizado por Alejandro Jesús Martínez Atienza
No hay comentarios:
Publicar un comentario