[Practico 6][Ejercicio 1]

Re: [Practico 6][Ejercicio 1]

de Federico Rivero -
Número de respuestas: 0
 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