Ayuda procesador basico

Iniciado por Gargoris, 6 Octubre 2009, 19:08 PM

0 Miembros y 1 Visitante están viendo este tema.

Gargoris

Buenas , estoy un poco perdido , a ver si me podeis decir por donde van los tiros.

estoy utilizando esta herramienta:
http://mermaja.act.uji.es/index2.html que es una especie de emulador de procesador.

Bien el caso es que tengo la siguente instruccion:

CitarAnálisis del programa.

Las dos primeras instruciones cargan en d0 y d5 constantes necesiaras para la ejecución del programa. Las instrucciones 2 y 3 hacen referencia a los datos de entrada: la dirección del vector se carga en d1 y su tamaño en d3. Las dos instrucciones siguientes preparan otros tantos valores necesarios para la ejecución del algoritmo. En d2 se carga el número de iteraciones a realizar, que equivale a la mitad del tamaño del vector. Esta mitad se toma por defecto pues, en caso de tamaño impar, el elemento del centro del vector no debe ser movido. d3 constituye el puntero al final del vector, calculado sumando al puntero a su inicio, d1, el tamaño del vector menos 1.
El bucle de intercambio es muy sencillo. A partir de la instrucción 6 se cargan los valores a los que apuntan d1 y d3 en d4 y d5 respectivamente, y se escriben intercambiados a continuación. Aquí queda patente el funcionamiento del acceso indirecto de las instrucciones indlee e indesc. Por último el puntero al principio se incrementa mientras que el puntero al final y el contador de iteraciones (d2) se decrementan. La instrucción de salto final permite continuar en el bucle mientras el contador no llegue a cero.


I000      movec d0, 0
I001         movec d2, 2
I002         movec d3, tam
I003         movec d1, vector
I004         divide d2, d3, d2
I005         sumac d3, d1, tam-1
I006    bucle:    indlee d4, (d1)
I007         indlee d5, (d3)
I008         indesc (d3), d4
I009         indesc (d1), d5
I010         sumac d1, d1, 1
I011         restac d4, d4, 1
I012         restac d2, d2, 1
I013         salta> d2, d0, bucle
I014         fin



Por mucho que repaso y miro , no logro entender realmente el asunto, conozco las instrucciones y se lo que hace cada una pero no logro entender el programa en si.
Sabeis de algun tutorial o de algo parecido que pueda hacerme ver las cosas mejor? , estoy estudiando ASI y el profesor de SIMM la verdad es que se ha puesto a dar esto y voy bastante perdido.

Tengo que construir un programa similar que ordene un vector , pero la verdad que no se ni por donde empezar , solo se me ocurre ir picando codigo del ejemplo pero voy muy perdido porque hago cosas y no se el porque las hago.

Un saludo y gracias.

Shrick

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º.

Citar3.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: 0x05
d2: .....
....
d4: 0xFF
d5: 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: 0x5A
d2: .....
d3: 0x01
d4: 0x5A
d5: 0xFF

I009 (d1) <- d5

Lo mismo que antes :P .

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.
Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .

Gargoris

Uhm.. muchas gracias por la explicacion , me has aclarado algunas dudas , hare lo que dices con papel y boli .

Yo pensaba que era lenguaje ensamblador , pero resulta que es algo inventado no? osea que no sirve realmente para nada, salvo para aprender, no es asi?.

Eternal Idol

Es ensamblador pero de ese procesador, no de una PC  ;)
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Shrick

Bueno puedes programar esa máquina en VHDL y simularlo en una CPLD o una FPGA. Así si puedes dar uso real :xD .

Nosotros en clase de prácticas tenemos que programar en VHDL un máquina sencilla de 4 instrucciones (turing completo o que es capaz de hacer cualquier cosa), y como proyecto final tenemos que simular la máquina+ que es un poco más compleja que esa máquina.
Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .