Por lo que veo tienes que aprender cada una de las instrucciones de esta máquina y crear programas en ensamblador de la máquina, primero antes que nada debes conocer cada una de las instrucciones, que cuentan con la ventaja de que solo emplea direccionamiento directo (aunque tiene dos instrucciones de direccionamiento indirecto), luego la propia instrucción da direcciones de entrada y salida, veo que no usa registros y que lee y escribe directamente en memoria.
Si no me equivoco (mirando las imágenes) usa arquitectura Harvard igual que los micro-controladores, la cual significa que tienes dos memorias una exclusiva para datos y otra exclusiva para instrucciones.
Lo que te recomiendo es que cojas lápiz y papel e ir apuntando en lenguaje natural lo que hace cada instrucción.
Lo primero es solo inicializar los datos:
I000 d0 <- 0
Se mueve la constante 0 a la posición 0 del área de memoria de datos.
I001 d2 <- 2
Se mueve la constante 2 a la posición d2 del área de memoria de datos
I002 d3 <- tam
Se mueve la constante tam a la posición d3 del área de memoria de datos, tienes que mirar cuanto vale tam, porque es simplemente un nº.
I003 d1 <- vector
Se mueve la constante tam a la posición d1 del área de memoria de datos, tienes que mirar cuanto vale tam, porque es simplemente un nº.
3.1. Instrucciones de transferencia de constantes.
Son instrucciones con dos operandos: una posición de memoria destino y una constante fuente. Sirven para cargar constantes en posiciones de memoria. Se justifican porque no existe un registro fijo a cero como en la mayor parte de procesadores RISC, por lo que sin ellas cualquier carga de constantes requeriría de dos intrucciones para verificarse.
Solo existe una instrucción en este grupo:
* movec mem, cte (ej. movec d7, 32 d7 = 32)
Ahí viene muy clarito.
Ahora se van haciendo operaciones.
I004 d2 = d3 / d2
Simplemente guarda el resultado de la división de d3 /d2 y lo guarda en d2.
I005 d3 = d1 + (tam-1)
Se guarda en d3, la suma de d1 y (tam-1), usa el valor de d1 que es el valor de vector y le sumas la constante tam-1.
I006 d4 <- (d1)
Se guarda el contenido de d1 en d4, que coincide con el valor de vector.
Tiene una etiqueta de salto.
Atención esta y otra instrucción tiene direccionamiento indirecto, esto es que el el valor de lo que contiene el paréntesis es la dirección de lo que guardara el operando de la derecha es decir
Imagina que tienes en memoria de datos:
d0: .....
d1: 0x05
d2: .....
....
d4: 0xF5
d5: 0xFF
Lo que haces es coger lo que tiene d1 que es 0x05, esto se convierte en una dirección, esto quiere decir que en esta instrucción es como si tuviera 0xFF, es decir d1 apunta a d5 y coge su valor en esa instrucción y luego se pasa el valor 0xFF a d4.
La memoria quedaría así:
d0: .....
d1:
0x05d2: .....
....
d4:
0xFFd5: 0xFF
I007 d5 <- (d3)
Se guarda el contenido de d3 en d5, similar al anterior
I008 (d3) <- d4
Esta es la otra instrucción que usa direccionamiento indirecto. Lo que hace es coger el lo que vale d4 y ponerlo en la dirección que pone d3.
Por ejemplo:
d0: .....
d1: 0x05
d2: .....
d3: 0x01
d4: 0x5A
d5: 0xFF
Seria lo inverso a lo hecho anteriormente:
d0: ...
d1:
0x5Ad2: .....
d3:
0x01d4: 0x5A
d5: 0xFF
I009 (d1) <- d5
Lo mismo que antes
.
I010 o I0x0A d1 = d1 + 1
Se incrementa d1 en 1.
I011 o I0x0B d4 = d4 - 1
Se decrementa d4 en 1.
I012 o I0x0C d2 = d2 - 1
Se decrementa d2 en 1.
I013 o I0x0D salta a I006 si d2 > d0
I014 o I0x0E se detiene la ejecución.
Con lo que te he puesto hazte una tabla con los valores de las variables y como van cambiando con cada instrucción que se ejecuta.
Al principio es dificil de entender, pero luego ya le vas pillando el truquillo
.
Lo siento si la explicación es confusa.
Un Saludo.