Ejercicio 5

Ejercicio 5

de Daniel Padron Simon -
Número de respuestas: 5

Buenas,

No me queda muy claro como es el proceso de lectura y escritura con las instrucciones que se nos son provistas. 

Sobre todo, para que es cada parámetro de la función IN y OUT, y que seria LEER_MEM1 y 2 o ESCRBIR_MEM1 y 2.

Una dudas mas, en un ejercicio dado, se asume la memoria almacena palabras de a un Byte? porque en el ejercicio 1 no me quedo claro como se determino eso, pero a su vez no se aclara en el ejercicio 3 ni 4, pero por el numero de palabras a leer y los rangos de direcciones , entiendo que en esos casos el tamaño de palabra en memoria es de unos 16bit. ¿es asi?


Saludos

Daniel

En respuesta a Daniel Padron Simon

Re: Ejercicio 5

de Federico Rivero -
Buen día!

Este ejercicio es un poco extraño porque no existen instrucciones que accedan a memoria (las típicas LOAD y STORE) de otros sets de instrucciones. En lugar de eso, el acceso a memoria se realiza a través de la entrada/salida, utilizando las instrucciones IN y OUT de una manera especial. Las instrucciones IN y OUT son similares en concepto a las LOAD y STORE. IN recibe como parámetro una dirección en la cual leer (a la que llamamos 'puerto de E/S'), mientras que OUT recibe una dirección donde escribir y un valor a escribir. La diferencia está en que si bien LOAD y STORE leen y escriben desde memoria, IN y OUT lo realizan sobre el espacio de entrada/salida, es decir, interactúan con otros dispositivos de E/S que se conectan a la CPU, cada uno de los cuales tiene una dirección diferente.

En este ejercicio se asume que hay algún dispositivo que oficia de interfaz con la memoria, y que tiene un protocolo especial de comunicación. Para leer de memoria, hay que pasarle al dispositivo la dirección que se desea leer y el dispositivo va a devolver el valor leído en otro puerto. Básicamente se divide el acceso a memoria en dos partes: indicarle la dirección al dispositivo y obtener el resultado. La dirección que se desea leer se indica en el puerto LEER_MEM_1, la cual es una constante, podríamos haber puesto un número en específico (0x4444, por decir algo), pero elegimos la constante para que el código sea más legible. Una vez realizado el OUT, lo que nos podemos imaginar es que el dispositivo recibe la dirección en cuestión, interactúa con la memoria, lee en la dirección que le indicamos y guarda el contenido de memoria en el registro de E/S accesible en la dirección LEER_MEM_2 (que también es una constante). De esta forma, ahora sí, cuando la CPU ejecute la instrucción IN en la dirección LEER_MEM_2, va a leer el valor de memoria que se solicitó.

El proceso de escritura es similar, si entendiste la parte anterior te propongo que trates de entenderlo del mismo dudo, si persisten las dudas por favor volvé a preguntar!

------------------------------------------------------------------------

Con respecto a la memoria, lo más normal es que la memoria sea direccionable de a bytes, eso quiere decir que cada byte de la memoria se puede acceder a través de una dirección diferente. El modelo mental que al menos yo me hago para este caso, es imaginar la memoria como un arreglo, donde cada posición del arreglo es de solo un byte (similar a como dijiste tú de que la memoria almacena palabras de a un byte). La memoria no funciona exactamente así, pero es un modelo que ayuda a imaginarnos lo que pasa.

La alternativa a la memoria direccionable de a bytes sería que la memoria sea direccionable de a palabras. Cada dirección de memoria se asocia a una palabra de memoria diferente (de un cierto tamaño, pero que coincide con el ancho de los registros y bus de datos). En este caso, si la palabra fuera de 16 bits, y accedemos a la dirección 0x0000, la memoria nos va a devolver 16 bits, mientras que si accedemos a la dirección 0x0001, nos va a devolver 16 bits diferentes. Mentalmente me lo imagino como un arreglo donde cada posición del arreglo tiene 16 bits.

En el ejercicio 1 no se indica, pero se asume que hay direccionamiento de a bytes (es lo más normal), en el ejercicio 3 podés deducir que el direccionamiento es de a palabra, como decís vos, porque te dice que hay 100 palabras entre las direcciones 101h y 165h, lo cual da 100 lugares en decimal. De ahí se deduce que cada dirección se mapea con 16 bits diferentes. En el ejercicio 4 se puede realizar el mismo razonamiento, pero en este caso la palabra de memoria es de 32 bits, porque al inicio se indica que la arquitectura es de 32 bits.

Avisame si se entiende o si conviene que aclare algo!

Saludos,
Federico
En respuesta a Federico Rivero

Re: Ejercicio 5

de Daniel Padron Simon -
Buenas,
Gracias por la rápida y completa respuesta, aunque me quedo una duda que me gustaría clarificar.

Nosotros tenemos en la operación IN reg1 reg2, donde reg1 y reg2 son registros. Y OUT reg3 reg4, donde nuevamente reg3 y reg4 son registros.

Entiendo que para leer primero tenemos que hacer un OUT y luego un IN. y Para escribir un OUT y luego otro OUT.

Por lo tanto para leer precisamos la información almacenada en 4 registros. Las dudas son:
1) ¿son 2 por operacion, ya que la dirección de memoria en E/S es de 32 bit y tenemos que un registro en la parte baja y otra la parte alta de la dirección?
Supongo que no es así, pero en caso que mi suposición sea correcta,
2) ¿Cuál de los 2 registros de IN y de OUT son las constantes LEER_MEM2 y cual LEER_MEM1 para el caso de la lectura?.
¿Sería algo como OUT REG1 REG2, donde REG1 tiene dentro LEER_MEM1 y REG2 tiene la dirección donde queremos leer, e IN REG3 REG4, con REG3 el valor LEER_MEM2, REG4 el registro donde guardar la información?

Saludos
Daniel
En respuesta a Daniel Padron Simon

Re: Ejercicio 5

de Gustavo Brown -

Hola Daniel,

  Para leer o escribir no precisas utilizar 4 registros distintos. Podés reusar algun registro.

La lectura/escritura se hace de a palabra de 32 bits. El funcionamiento es como decís al final de todo.

Por ejemplo, supongamos que tenes un valor en el registro R7 que querés guardar en cierta dirección de memoria cargada en el registro R6.
También supongamos que todas las direcciones de los puertos fueron elegidas para poder cargarse utilizando una sola instrucción (LOAD #cte, reg). Es decir que las constantes LEER_MEM1, LEEM_MEM2, ESCRIBIR_MEM1 y ESCRIBIR_MEM2 son todas constantes menores a 2^28

Entonces para escribir el dato podrías hacer:

   LOAD ESCRIBIR_MEM1, R1
   OUT R1, R6
   LOAD ESCRIBIR_MEM2, R1
   OUT R1, R7

Ahora supongamos que más adelante queres leer la palabra que se encuentra en la dirección 0x123456. Podrías hacer lo siguiente:

  LOAD R1, LEER_MEM1
  LOAD R6, 0x123456
  OUT, R1, R6
  LOAD R1, LEER_MEM2
  IN R1, R1

y el dato se cargaría en el registro R1

Saludos,
  Gustavo

En respuesta a Federico Rivero

Re: Ejercicio 5

de Bruno Agustín Recalde Schettini -
En el caso de una memoria direccionada de a byte, pero si la arquitectura es de por ejemplo 32 bits, al hacer reg1 = memoria[0x00], ¿en el registro 1 (el cual es de 32 bits) queda guardado el contenido de las direcciones 0x00, 0x01, 0x02 y 0x03?, de ser así, en que orden se guarda (supongo que este es un aspecto que varía dependiendo de la arquitectura), si no es así, ¿Qué se guardaría en el registro, solo el contenido de memoria[0x00] y el resto 0 por ejemplo?

En el caso de memorias direccionada de a palabra, supongo que podrá haber excepciones, pero ¿lo normal sería que el tamaño de la palabra coincida con el tamaño del bus de datos y los registros, cierto?

Por último, cuando se habla de arquitectura de n bits, lo que determina el n es el tamaño de los registros y el bus de datos, ¿el tamaño del bus de direcciones puede ser distinto al n? (pregunto porque usualmente cuando se habla de arquitectura de n bits también se suele mencionar que dicha arquitectura es capaz de direccionar x cantidad de memoria (usualmente con x = 2^n bytes, para el caso de memoria direccionada de a byte), pero creo recordar que 8086 maneja direcciones de 20 bits a pesar de ser una arquitectura de 16 bits, aunque no he llegado hasta allí en mi repaso quería aprovechar para preguntar).
En respuesta a Bruno Agustín Recalde Schettini

Re: Ejercicio 5

de Federico Rivero -
Hola Bruno, contesto entrelíneas.

En el caso de una memoria direccionada de a byte, pero si la arquitectura es de por ejemplo 32 bits, al hacer reg1 = memoria[0x00], ¿en el registro 1 (el cual es de 32 bits) queda guardado el contenido de las direcciones 0x00, 0x01, 0x02 y 0x03?, de ser así, en que orden se guarda (supongo que este es un aspecto que varía dependiendo de la arquitectura), si no es así, ¿Qué se guardaría en el registro, solo el contenido de memoria[0x00] y el resto 0 por ejemplo?

En el caso de direccionamiento de a byte ocurre como decís, al realizar una lectura de 32 bits a la dirección 0 se leen los bytes 0x00, 0x01, 0x02, 0x03. La pregunta de cómo quedan guardados en el registro uno se determina según una propiedad de la arquitectura llamada endianness. Si la arquitectura es little endian (como x86), entonces el byte de la dirección más baja de memoria es el byte menos significativo, de este modo, el registro 1 quedaría como:  mem[0x03]  mem[0x02]  mem[0x01] mem[0x00] . Si la arquitectura es big endian, ocurre al revés.

En el caso de memorias direccionada de a palabra, supongo que podrá haber excepciones, pero ¿lo normal sería que el tamaño de la palabra coincida con el tamaño del bus de datos y los registros, cierto?

Correcto, eso es lo normal.

Por último, cuando se habla de arquitectura de n bits, lo que determina el n es el tamaño de los registros y el bus de datos, ¿el tamaño del bus de direcciones puede ser distinto al n? (pregunto porque usualmente cuando se habla de arquitectura de n bits también se suele mencionar que dicha arquitectura es capaz de direccionar x cantidad de memoria (usualmente con x = 2^n bytes, para el caso de memoria direccionada de a byte), pero creo recordar que 8086 maneja direcciones de 20 bits a pesar de ser una arquitectura de 16 bits, aunque no he llegado hasta allí en mi repaso quería aprovechar para preguntar).

Efectivamente el bus de direcciones puede ser diferente al N de la arquitectura y un ejempo es 8086 como decís vos. Otro ejemplo es cualquier procesador moderno que implemente la arquitectura x86-64. La arquitectura es de 64 bits, pero los buses de direcciones no llegan a eso y usualmente varían entre 32-48 bits.

Saludos,
        Federico