[Practico 6][Ejercicio 1]

[Practico 6][Ejercicio 1]

de Maria Soledad Techera Gomez -
Número de respuestas: 3

Hola!

En la clase grabada, para la parte A del ejercicio se toma como paso 2, con la justificacion de que una instruccion y un registro ocupan 16 bits y el direccionamiento es de 8. 

Por que se elige lo que seria la parte mas significativa para sumar?

gracias

En respuesta a Maria Soledad Techera Gomez

Re: [Practico 6][Ejercicio 1]

de Federico Rivero -
Hola!

No sé si te entendí bien, creo que no, pero las instrucciones ocupan 2 bytes de memoria porque son de 16 bits. Luego, cuando se dice que el direccionamiento es de byte, nos referimos a que cada byte de memoria tiene una dirección diferente, y por lo tanto cada instrucción en memoria ocupa 2 direcciones de memoria (si la primera instrucción está en 0x0000, su primer byte está en 0x0000 y el segundo en 0x0001, por lo tanto la siguiente instrucción inicia en 0x0002).

No sé si era eso lo que preguntabas, si le erré avisame por favor.

Saludos,
Federico
En respuesta a Federico Rivero

Re: [Practico 6][Ejercicio 1]

de Alberto Gaetano Di Russo De Lima -
Buenas, yo creo que tengo la misma duda, y no me llega a quedar claro. Lo que no entiendo son dos cosas:

1) Por qué el paso es igual a 2? Sé que lo explicaste anteriormente, pero no lo estoy entendiendo del todo.
2) Por qué cada línea de instrucción al momento de implementar el programa se numera contando de a 2? Es decir, la primer instrucción está en la línea 0x00, la segunda en 0x02, la tercera en 0x04, etc. Tiendo a pensar un poco que puede ser por lo del paso = 2, pero no estoy seguro.
En respuesta a Alberto Gaetano Di Russo De Lima

Re: [Practico 6][Ejercicio 1]

de Federico Rivero -
 Buen día!

Sobre el punto 1, lo que hay que entender es cómo se accede a la memoria cuando decimos que el direccionamiento es de a byte. En ese caso, a cada byte de memoria le corresponde una dirección diferente. De esta forma, podemos imaginarnos la memoria como un arreglo donde cada posición tiene un byte, asi':

                                    RAM          (el contenido de la RAM lo estoy inventando, pero lo importante es ver que cada dirección apunta a 1 byte distinto)
                              _________________
   0x0000            |     0101 1111     |            
   0x0001            |     1111 1000     | 
   0x0002            |     1100 0111     |
   0x0003            |     1010 1101     |
   0x0004            |     0000 0100     |
   ...                      |           ...              |
   ...                      |           ...              |

   0xFFFF             |     0000 0100     |

Entonces, acá incluyo respuesta del punto 2, como cada instrucción ocupa 2 bytes, si ponemos una instrucción a partir de la dirección 0x0000, el byte menos significativo de la instrucción va a quedar en la dirección 0x0000 y el byte más significativo va a quedar en la dirección 0x0001. Entonces la SIGUIENTE instrucción, empezaría recién en la dirección 0x0002 (ocuparía los bytes 0x0002 y 0x0003).

El tema del ´paso´ es exactamente lo mismo. El ejercicio pide sumar los contenidos de la memoria en un cierto rango. Lo más intuitivo quizás sería ir byte por byte y sumar cada byte de memoria, uno a la vez, pero lo que se hace en el video es tomar los bytes de 2 en 2, formar palabras de 2 bytes, y sumar esas palabras (lo cual da un resultado diferente a sumar byte por byte). Usando como ejemplo las primeras 4 direcciones de memoria del dibujo de arriba, una opción sería sumar así:

      0101 1111
+    1111 1000
      1100 0111 
      1010 1101

Eso sería sumar byte por byte, y en ese caso, para acceder a cada byte deberíamos incrementar en 1 la dirección de memoria entre una lectura y otra (o sea, 'paso' sería 1 en este caso).  Lo que realiza el ejercicio, sin embargo, es lo siguiente:

+    1111 1000   0101 1111
      1010 1101   1100  0111

Entonces, para obtener cada sumando, hay que leer 2 bytes de memoria, y como a cada byte le corresponde una dirección de memoria diferente,  se debe aumentar en 2 la dirección antes de leer el siguiente operando. Por eso se usa 'paso = 2' para aumentar las direcciones de memoria. 

La razón por la cual se suma de a 2 bytes es que se trata de una arquitectura de 16 bits, y la instrucción LOAD lee de a 16 bits de memoria, por lo cual es razonable considerar la memoria como en palabras de a 16 bits. 

Una cosa más a aclarar es que si bien nos imaginamos la memoria 'como un arreglo', las instrucciones pueden leer varias posiciones del arreglo a la vez. La instrucción LOAD de este ejercicio lee 2 bytes de memoria, o sea que siempre lee el contenido de 2 direcciones diferentes. Eso puede ser un poquito antiintuitivo, porque con una sola instrucción se leen 2 posiciones del 'arreglo' a la vez.

Espero que eso haya aclarado un poco, cualquier cosa si no quedó claro volvé a preguntar por favor :)

Saludos,
Federico