[Prt 6-Ej 1] Partes (b),(c)

[Prt 6-Ej 1] Partes (b),(c)

de Usuario eliminado -
Número de respuestas: 8
Quisiera compartir mis soluciones a este ejercicio,para saber si es lo que se pedía hacer (y si esta bien echo claro!):

/********************************************************************************************/
Parte b:

int sum=0;
for(int i=0xABCD;i<=0xEF00;i++)
sum+=Memoria[i];
sum*=3;
Memoria[0x00FF]=sum;

/********************************************************************************************/
Parte c:

0x0000:
1. MOV 0x00AB, R2;
2. MOV 0x00CD, R3;
3. MOV 0x0008, R4;
4. SHL R2, R4, R2;
5. ADD R2, R3, R1;
// R1=0XABCD--> inicio del for
6. MOV 0x00EF, R2;
7. SHL R2, R4, R2;
// R2=0xEF00-->fin del for
8. MOV 0x0001, R3;
// R3=0x0001--> etiqueta de salto ( para volver a ejecutar la lógica del for)
9. MOVR R3, R4;
// R4=0x0001 --> iterador "i" del for
10. MOV 0x0000, R5;
// R5=0x0000 -->aquí se guardara sum=sum+ Memoria[i];
0x0001:
11. LOAD R1, R6;
12. ADD R5, R6, R5; // sum+= Memoria[i];
13. ADD R1, R4, R1; // i++;
14. AND R1, R2, R16; // R16= (R1 and 0xEF00);
15. NOT R1, R15; // R15= not( R1);
16. NOT R2, R14; // R14= not( R2 );
17. AND R15, R14, R13; // R13= R15 and R14
18. AND R16, R13, R12; // R12= R16 and R13
19. MOV 0x0011, R11;
20. MOV 0X0011, R10;
21. SHL R11, R4, R11
22. ADD R11,R10,R11; //R11= 0x1111
23. ADD R3, R3, R9; //R9= 0x0002
24. SUB R11, R12, R12; // R12= 0X1111 - R12 ( o sea,si R1== 0xEF00)
25. JZ R9; //JMP 0x0002
26. JMP R3; //JMP 0x0001
0x0002:
27. ADD R5, R5, R6;
28. ADD R5, R6, R6;
29. MOV 0x00FF, R7;
30. SAVE R6,R7;

/********************************************************************************************/

Espero que se entienda el programa,muchas gracias.
En respuesta a Usuario eliminado

Re: [Prt 6-Ej 1] Partes (b),(c)

de Juan Saavedra -
El alto nivel está bien.

Para la parte C contesto entre líneas.
Lo primero a aclarar, es NO utilizar etiquetas hexadecimales ni numéricas en general.
Si utilizás un número como etiqueta se interpreta que querés saltar a esa dirección específica. En esta arquitectura de 16 bits, cada instrucción son dos bytes. Por lo tanto (si ubicamos el programa a partir del 0x0) la primera instrucción estará en 0x00, la segunda en 0x02, tercera 0x04, 0x06, 0x08, 0x0A, ...
Entonces realizar un salto a 0x0001 implicaría saltar a la dirección de memoria 0x0001 que no es una dirección válida para una instrucción.

Dos aclaraciones sobre el programa:
Cuando querés cargar un número de dos bytes en un registro, conviene hacerlo con un OR. Ejemplo:
MOV 0XAB, R1
MOV 0XCD, R2
MOV 0X08, R3

SHL R1, R3, R1
OR R1, R2, R1

La otra, porque no verificás si llegaste a la dirección final realizando una resta y verificando que el resultado sea cero con JZ?

Saludos.

En respuesta a Juan Saavedra

Re: [Prt 6-Ej 1] Partes (b),(c)

de Lorena Cecilia Ernst Gonzalez -
Consulta: Por qué no puedo hacer MOV 0xABCD, REG1 directo?
Gracias =)
En respuesta a Lorena Cecilia Ernst Gonzalez

Re: [Prt 6-Ej 1] Partes (b),(c)

de Juan Saavedra -
Porque 0xABCD es un inmediato de 16 bits, y la instrucción solo toma en cuenta los bits menos significativos.
En la parte A deberías establecer el formato de instrucción para MOV y deberías dar un número de bits máximo para el inmediato (que nunca va a ser de 16, ya que sino no entra en una palabra). Ocho bits de inmediato es una excelente opción :)

Espero se haya entendido.

Saludos.
En respuesta a Juan Saavedra

Re: [Prt 6-Ej 1] Partes (b),(c)

de Lorena Cecilia Ernst Gonzalez -
No entendi porque decis formato de instruccion para MOV, hay un formato distinto para cada instruccion?, no se si entendí bien las cosas, esta bien pensar así?:
Como el microprocesador es de 16 bits y es RISC, entonces las instrucciones van a estar codificadas en 16 bits...definir un formato de instrucción es decir que bits representan que cosas dentro de esos 16 bits por decirlo de alguna manera.
Digamos que como hay un total de 16 directivas disponibles las puedo codificar con 4 bits, por lo tanto establezco que los 4 primeros bits son para la instrucción, luego como tengo 16 registros, y puedo codificarlos con 4 bits, digo que los siguientes 12 bits son 4 para el primer parámetro, 4 para el segundo, y 4 para el tercero si es que la instrucción lo requiere. Esta bien esto? o tengo que hacer una especie de tablita que me diga como es la cosa para cada una de las instrucciones?, que seria el largo de instrucción? 16 bits?
Gracias de nuevo =)

En respuesta a Lorena Cecilia Ernst Gonzalez

Re: [Prt 6-Ej 1] Partes (b),(c)

de Juan Saavedra -
Como el microprocesador es de 16 bits y es RISC, entonces las instrucciones van a estar codificadas en 16 bits...definir un formato de instrucción es decir que bits representan que cosas dentro de esos 16 bits por decirlo de alguna manera.
Si. De hecho, la restricción RISC es que la instrucción sea de largo fijo. Usualmente utilizan una palabra. Como la arquitectura es de 16 bits, se tienen 16 bits de palabra.

Digamos que como hay un total de 16 directivas disponibles las puedo codificar con 4 bits, por lo tanto establezco que los 4 primeros bits son para la instrucción, luego como tengo 16 registros, y puedo codificarlos con 4 bits, digo que los siguientes 12 bits son 4 para el primer parámetro, 4 para el segundo, y 4 para el tercero si es que la instrucción lo requiere. Esta bien esto? o tengo que hacer una especie de tablita que me diga como es la cosa para cada una de las instrucciones?
¡Bien! ¿Pero qué pasa con las instrucciones que no tienen un formato [código][regA][regB][regDestino] ? Existen instrucciones que pueden compartir el formato (ADD y SUB) y otras que no (ADD y SAVE). Tenés que dar el formato para cada una, sabiendo que hay algunas que lo comparten.

Saludos.
En respuesta a Usuario eliminado

Re: [Prt 6-Ej 1] Partes (b),(c)

de Juan Pablo Lorier Arismendi -
hola Maximiliano, cuando incrementas el puntero,xq lo haces en 8 lugares? cada dirección d memoria tiene 1 byte y me parece q habría q incrementar de a 1. Te pregunto xq no lo tengo claro. saludos
En respuesta a Juan Pablo Lorier Arismendi

Re: [Prt 6-Ej 1] Partes (b),(c)

de Usuario eliminado -
Hola Juan Pablo, disculpá la demora en contestar.
En efecto tienes razon, si miras el comentario en el código:

// R4=0x0001 --> iterador "i" del for

te daras cuenta de que me olvide de hacer MOV 0x01,R4 luego de usar el registro R4 para las instrucciones de SHL mas arriba. Gracias por el detalle!