martes, 17 de mayo de 2011

Práctica 1 Miguel Castillo Lloret, Francisco López Castillo y Vicente Adolfo Bolea

Practica 1: Programacion en procesadores MIPS

En vuestra primera practica tendréis que sacar a relucir lo aprendido en el tema 2 de teoría, las instrucciones y la forma de programar en procesadores MIPS. Realizareis la practica en un programa, llamado MARS.




A la derecha teneis los valores de los Registros,abajo 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 el botón de ensamblar si esta resaltado. Dadle. El programa cambiara de pantalla y os mostrara esto:


Ahora el programa os muestra las instrucciones codificadas y esta preparado para ejecutarse. Dadle al botón Play para ejecutarlo. Tendreis esta ventana:






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

Preguntas Práctica 1:
1) ¿Porque en algunas instrucciones MIPS, tales como SLL, requieren la codificación del registro RS, cuando no tiene ese parámetro?
En ese caso, cuando no se carece de un parámetro , se rellena de 0 ese bloque, quedando de esta manera:
Ejemplo: SLL rd,rs,desp: SLL $t0,$t1,0x01
0 Rs Rt Rd Desp 0
000000 00000 01000 01010 00001 000000

0 0 0 8 5 0 4 0
0x00085040
2)¿Como instalar el simulador MARS en sistemas GNU/Linux?
El paquete para Linux esta distribuido en formato .jar, donde contiene las fuentes escritas en java, lo que por otra parte necesita tener instalado alguna version reciente de java para ejecutarse. Para lo cual tendras que verificar o instalar segun el caso la maquina virtual java, para el caso de Debian y Ubuntu, solo tendras que escribir el siguiente comando:
sudo apt-get install openjdk-6-jre

Para otras distribución en lugar de poner apt-get install lo sustituyes por el correspondiente sistema de gestión de paquetes.
El siguente paso seria descargar MARS de la siguiente web:
http://courses.missouristate.edu/KenVollmar/Mars/download.htm
Para abrirlo simplemente en las propiedades, pulsando el botón derecho y posteriormente propiedades, en la pestaña de permisos tienes que darle a de ejecución,y en la pestaña de abrir con, asegurarte que esta en sun java.
3) ¿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.
Para utilizar este recurso, previamente a la llamada al sistema, en el registro $v0 tienes que cargar el numero de la instrucción:
Ejemplo, escribir un entero
li $v0,0x00000001
syscall
Ejemplo, leer entero:
li $v0,0x00000005
syscall
Ejemplo, llamada a Exit
li $v0,0x0000000A
syscall
Posteriormente en el registro $a0 se realiza la operacion de entrada y salida.

4)¿ Cómo se representa los números en el simulador MARS?

Los números en el simulador MARS se representan en Hexadecimal y siempre se pone delante un ``0x´´ al principio del número para señalar que está escrito en hexadecimal , teniendo 8 bits para colocar el número o incluso podemos señalarlo , poniéndo una ``h´´ al final del número.

Por ejemplo: 17775198 ( Decimal ) -> 0x010f3a5e ó 10f3a5e h

5) ¿ Qué son los códigos nemónicos?

Un nemónico es un dato simbólico que identifica a un comando generalmente numérico (binario, octal, hexadecimal) de una forma más sencilla que su numeración original, lo cuál facilita radicalmente la memorización de este comando para el programador.
Por ejemplo:

add -> Suma

lw -> Carga un dato de memoria

Estos códigos nemónicos se emplean para representar instrucciones para el lenguaje ensamblador .

lunes, 16 de mayo de 2011

Practica 2 Adrián Armida y Tatiana Person

Adjunto la practica 2 como enlaces de PDF por problemas de aceptacion del blog con respecto al trabajo.
http://www.megaupload.com/?d=YUTGB3VO
http://www.megaupload.com/?d=82JFD5XW

Práctica 3 Jose Alvaro Gutiérrez, Alvaro Perea y Alvaro García

Resumen Tabla de Instrucciones:
Simbólico: Resumen:
ADD rd, rs, rt
Suma rs + rt y lo guarda en rd.

ADDI rt, rs, inmediato
Suma rs+ inmediato y lo guarda en rt.

SUB rd, rs, rt
Resta rs-rt y lo guarda en rd.

MULT rs,rt
Multiplica rs*rt y guarda la parte mas significativa en HI y la menos en LO.

AND rd, rs, rt
Realiza la operación AND entre rs y rt y lo guarda en rd.

ANDI rt, rs, inmediato
Realiza la operación AND entre rs y un dato inmediato y lo guarda en rt.

NOR rd, rs, rt
Realiza la operación NOR entre rs y rt y lo guarda en rd.

OR rd, rs, rt
Realiza la operación OR entre rs y rt y lo guarda en rd.

ORI rt, rs, inmediato
Realiza la operación OR entre rs y un dato inmediato y lo guarda en rt.

XOR rd, rs, rt
Realiza la operación XOR entre rs y rt y lo guarda en rd.

XORI rt, rs, inmediato
Realiza la operación XOR entre rs y un dato inmediato y lo guarda en rd.

SLL rd, rt, desp
Realiza un desplazamiento a la izquierda de rt como indique desp, y lo guarda en rd.

SRL rd, rt, desp
Realiza un desplazamiento a la derecha de rt como indique desp, y lo guarda en rd.

SRA rd, rt, desp
Realiza un desplazamiento aritmético a la derecha de rt como indique desp, y lo guarda en rd.

LUI rt, inmediato[16]
Carga los 16 bits de la parte baja del valor inmediato en la parte alta de rt. Los bits de la parte baja se pone a 0.

LW rt, dir
Carga una palabra en rt de la dirección dir.

SW rt, dir
Almacena en dir la palabra almacenada en rt.

SLT rd, rs, rt
Pone rd a 1 si rs < rt en otro caso lo pone a 0. SLTI rt, rs, inmediato Pone rd a 1 si rs < inmediato en otro caso lo pone a 0. BEQ rs, rt, etiqueta Si rt y rs son iguales el programa salta a la dirección indicada en la etiqueta. BNE rs, rt, etiqueta Si rt y rs no son iguales el programa salta a la dirección indicada en la etiqueta. BGEZ rs, etiqueta Si rs es mayor o igual a 0 el programa salta a la dirección indicada en la etiqueta. J dir El programa salta a la dirección indicada en dir. JAL dir El programa salta a la dirección indicada en dir, guardando la dirección actual en ra. JR rs El programa salta a la dirección indicada por el registro rs Tabla de instrucciones:

Esquema del Computador MIPS:


Esquema de la ALU en Logisim:



Instrucción de Ejemplo:
Ejemplo de la transferencia de una instrucción AND $t2,$t1,$t1:
C1: MAR <- PC SC: (T4,C1)



C2: PC <- PC+4 | MBR <- MP SC: (C4,TD,L,C2)







C3: RI <- MBR  SC: (T3,C7)





C4: Decodificación (No lo veremos en este tema).




C5: $t2 = $t1 AND $t1
SC: (RA = ($t1) ;RB = ($t1);
MA = 0; MB = 0; Cod OP: AND;T5;
RC = ($t2); SC).



FAQ:

• ¿Hace falta ser un usuario a nivel profesional del programa Logisim para realizar las prácticas de FEC?
Bueno, a nivel teórico, habrá mucha palabrería, mucho tiempo para ver la teoría y saber que es cada cosa. Yo siendo alumno, digámoslo todo, no muy puesto en informática, no he necesitado las instrucciones de las prácticas en sí, sino las imágenes que se correspondía con respecto a las puertas lógicas y demás circuitos. Así a la vez que aprendía que era cada cosa, o las recordaba, creaba circuitos más complejos. Así que no os preocupes y tomaros el tiempo en hacer las cosas, tanto en esta práctica como en las demás.

• ¿Cómo utilizar un circuito propio para crear otro mas complejo con el anterior?
Una vez dentro del logisim, tenemos la opción de añadir circuito. Con esta opción, tenemos la oportunidad de obtener una nueva ventana en la cual operaremos con el nuevo circuito que quermos hacer. En la ventana izquierda hay varios circuitos predeterminados, como puertas lógicas, memorias, inputs… y entre ellas, en la carpeta CIRC, están varios circuitos: main y el nuevo con el que poner el anterior, mas aquellos que creas al utilizar el programa.  Solo seleccionarlo y ponerlo donde veáis oportuno.

• ¿Por qué salen en mis circuitos que está mal las conexiones?
Lo más probable es que el número de entradas no sea el mismo para cada circuito vinculante. Así que podéis revisar eso antes de hacer otra cosa. Si el error no se soluciona, tranquilos, siempre podéis suprimir conexiones entre circuitos para alojar el error y saber dónde está. A partir de ahí, no hay mas ciencia que comprobarlo, o en su defecto trastear todo lo posible.

•¿Porque las instrucciones deben de ponerse en hexadecimal?
El lenguaje hexadecimal es el que más símbolos distintos tiene para representar números o letras. A mas símbolos, menos tamaño en la representación de símbolos, que es lo que se pretende para manejar las instrucciones.

•¿Que diferencia hay entre una instrucción normal e inmediato?
Buscando, la única diferencia es que la instrucción inmediata se realiza pero con valores constantes, mientras que la instrucción normal  se realiza con valores mas generales.

Practica 4 Jose Joaquin Garci, Patricia Rodriguez y Pablo Mariscal

PRÁCTICA 4
En esta práctica aprenderemos a usar los componentes RAM y ROM de
logisim. Comenzamos viendo como funciona el componente RAM,




En esta parte lo más importante será saber qué significa cada parte del
componente:
Los valores se muestran en el componente. Las direcciones pueden verse en
gris a la izquierda del área de visualización. Dentro, los valores se muestran en
hexadecimal. El valor de la dirección seleccionada se mostrará en texto inverso
(blanco sobre negro).
A -> permite especificar a qué valor de la memoria se accede. Importante: el
número de bits coincide con el atributo número de bits de direccionamiento.
D -> Si out vale 1 o indefinido, la RAM proporciona a la salida el valor de la
posición de memoria seleccionada, sin embargo si out vale 0, se comporta
como una entrada y su valor se guardará en la posición de memoria
seleccionada cuando el reloj pase a 1. Importante: el número de bits coincide
con el atributo número de bits de datos.
Sel -> Cuando se tiene más de un módulo RAM se utiliza para conectar o
desconectar cada módulo.
Triángulo inferior -> señal de reloj, los cambios se efectuarán cuando la señal
pase de 0 a 1.
Out -> Especifica si la RAM debería proporcionar a la salida el valor de la
dirección seleccionada (A). La opción de salida está seleccionada si out vale 1
o indefinido; si out vale 0, entonces D se comporta como una entrada de forma
que se almacena su valor en los flancos de subida del reloj.
Clr -> Si vale 1, todos los valores de la memoria pasarán a ser 0.




A continuación continuamos con el componente ROM:
Un circuito puede acceder a los valores de la ROM, pero no los puede
modificar. El usuario puede cambiar los valores individualmente a través de la
Herramienta De Cambio, o puede editarlos todos con la Herramienta De Menú.
Seguimos viendo para qué sirve cada parte del componente:
A -> permite especificar a qué valor de la memoria se accede. Importante: el
número de bits coincide con el atributo número de bits de direccionamiento.
D -> Proporciona en el pin D el valor de la dirección seleccionada.
Sel -> Para más de un módulo ROM en paralelo, se puede utilizar esta entrada
para conectar y desconectar un módulo ROM en función se si su valor es 1 o 0.
Una vez entendido el funcionamiento de los componentes RAM y ROM
veremos como funciona la Herramienta De Cambio:
Su utilidad es cambiar los valores contenidos dentro de la memoria, para su
uso debemos de tener en cuenta tres puntos importantes:
* Al pulsar Enter se posicionará el rectángulo de edición justo debajo de la
posición en la que se encuentre.
* Al pulsar Backspace (tecla de retroceso) el rectángulo de edición pasará a la
posición anterior a la que se encuentre.
* Al pulsar la barra espaciadora el rectángulo de edición pasará a la posición
siguiente a la que se encuentre.
También se nos presentará la opción de importar los valores de una imagen ya
creada, para esto se debe de seguir el siguiente formato, explicado mediante
un ejemplo:
si se tiene una memoria de 256 bytes cuyos cinco primeros bytes fueran 2, 3, 0,
20 y -1, y todos los demás valores fuesen cero, entonces la imagen sería el
siguiente fichero de texto.
v2.0 raw
02
03
00
14
FF
La primera línea identifica el tipo de formato utilizado (por el momento sólo hay
un formato reconocido). Los valores se muestran en hexadecimal, empezando
por la dirección cero; puedes poner varios valores en la misma línea. Logisim
pondrá el valor cero en todas aquellas posiciones de memoria que no vengan
especificadas en el archivo.
La imagen puede utilizar abreviaturas en la codificación, por ejemplo, en lugar
de escribir en una fila dieciséis veces seguidas el valor 00 se podrá escribir
16*00. Hay que fijarse en que el número de repeticiones de un valor viene dado
en base 10. Las imágenes creadas por Logisim utilizarán estas abreviaturas en
cuanto los valores se repitan cuatro veces o más.
Finalmente antes de empezar a realizar la práctica aprenderemos a usar el
Editor Hexadecimal:




Los números a la izquierda muestran las direcciones de memoria en
hexadecimal. Los otros números se corresponden con los valores a partir de la
dirección de memoria especificada.
Tras estas explicaciones se debe proceder a realizar las prácticas propuestas,
para ello se deben de construir los circuitos que se piden en el enunciado.
Importante: para realizar los circuitos se debe tener en cuenta todas las
explicaciones recibidas anteriormente, también hay que prestar especial
atención en colocar a todos los elementos el ancho de bits correspondiente con
los bits que viajan por los buses, finalmente cuando tengamos más de dos
bloques de memoria, para poder elegir cual debe operar deberemos de usar un
decodificador.
PREGUNTAS Y RESPUESTAS
- ¿Qué función tiene la puerta NO en el circuito del ejercicio 3?
- Hace posible elegir entre guardar los datos en las dos memorias de arriba o
las dos memorias de abajo. Usando esta puerta, cuando sel valga 0 en las
memorias de arriba, en las memorias de abajo sel valdrá 1 y por lo tanto
estarán operativas, y viceversa.
- ¿Por qué las filas del Editor Hexadecimal se enumeran de diez en diez?
- Es una manera de abreviar. Verás que hay dieciséis pares de cifras en
hexadecimal. Si bien la fila está enumerada con 00, las parejas se
corresponden con esa posición de memoria y las 15 siguientes expresadas en
hexadecimal: 00, 01, 02... y así hasta 0F. Por esto, la siguiente fila comienza
con la posición de memoria 10.
- ¿Es necesario activar clr cada vez que se guarde un nuevo valor en una
posición de memoria ya usada?
- No. El nuevo valor introducido sustituirá al anterior sin necesidad de que este
pase a ser 00 previamente.
- ¿Qué significa 16*00 en la codificación de Logisim?
- Es una forma abreviada de decir que hay una fila de dieciséis veces seguidas
el valor 00.
- ¿Cómo funciona el decodificador del ejercicio 4?
- Depende del valor de las direcciones adicionales. Si el valor es 00 se activará
el primer par de memorias, si es 01 se activará el segundo par, si es 10 el
tercer par, y si es 11 el cuarto.

viernes, 6 de mayo de 2011

Mandando Ejercicios

Con revisores Jóse Alvaro Gutiérrez y Fran López Castillo, me dispongo a proponer a personas para realizar las practicas. Espero que si haya un problema comentarme a mi, Alvaro García, o a Pablo Mariscal
Yarlin veo que no aparece por clases, asi que voy a proponer que si la veis, por favor, comentar que hay trabajo, porque por ahora no cuento con ella. Sin mas preámbulos comento la gente:
Fran Lopez, Miguel Castillo y Vicente Bolea   los propongo como compañeros para el 1 º trabajo (los 2 viven en Cadiz)
Para la practica Segunda propongo a Adrián Armida y Tatiana Person   para la 2ª Practica(en el caso de que venga Yarlin se incluirá en este grupo)
Jose Alvaro, Alvaro Perea y Yo Haremos  la 3 ª Practica
Pablo Mariscal, Jose Joaquín y Patricia Rodríguez Haran la 4 ª Practica

lunes, 2 de mayo de 2011

Empecemos con...

Un saludo cordial. Buenas soy Alvaro, Y me dispongo a ser el Bloguero del grupo, a lo largo del resto de lo que queda intentare manejar este tipo de comunicacion para realizar el Trabajo de Fec de este grupo, El grupo b numero 1. Recibireis nuevas mias. Atentamente, Alvaro Garcia