En esta nueva entrada sobre direccionamiento indirecto es con la que terminamos el curso. En ella vamos a ver la segunda parte de cómo automatizar y recorrer zonas de memoria para trabajar con ellas de forma indirecta y recursiva. Lo primero que has de hacer es leer el direccionamiento indirecto en Step 7 (I) si no lo has hecho ya.
Registro de direcciones
Como sabes, cuando se carga un valor, hay dos registros, el ACU1 y el ACU2. Pues también existen dos registros de direcciones, el AR1 y el AR2 para usarlos en el direccionamiento indirecto.
La forma de cargar y transferir los valores a los registros son de la siguientes 3 maneras:
- Cargar directamente el puntero en el AR1
- Cargar el puntero y transferirselo al AR1
- Cargar el valor numérico de bits y transferirselo al AR1
Cargar directamente el puntero
Es el más rápido si se sabe qué hay que cargar:
LAR1 P#1.0
Lo que cargará en el AR1 el puntero 1.0
Cargar el puntero y transferirlo al AR1
L P#1.0
LAR1
Al igual que el anterior, cargamos el puntero P#1.0 en el AR1
Cargar el valor numérico de bits y transferirlo al AR1
o, como dijimos en direccionamiento indirecto (I), podemos crear al puntero diciendo cuántos bits tiene la dirección
L 8
LAR1
Hará exactamente lo mismo que los casos anteriores. Hay que puntualizar que si queremos acceder a una dirección que tenga más de 32768 bits (16 bits) la carga debería ser del estilo:
L L#80000
TAR1
De tal forma que cargaremos la dirección 10000.0
Un poco altita la dirección aunque esa sería la forma. A decir verdad, lo suyo es jugar siempre con números en doble palabra como ya veremos más adelante aunque hacerlo como enteros también es válido aunque limitado a la capacidad de una palabra frente a la doble.
Direccionamiento Indirecto por Registro e Intraárea/Interárea
La diferencia fundamental entre el registro e Intraárea y registro e Interárea es:
- Intraárea: No se especifica el área de memoria
- Interárea: Vamos a especificar el área de memoria (el tipo, por así decirlo)
¿Y esto qué significa en cristiano?
Pues a la hora de la verdad, y para nosotros, no mucha cosa. En resumen, y que permitan los puristas, lo que vamos a hacer es o bien:
LAR1 P#50.0 // Cargar el puntero
L MW [AR1, P#10.0] // Decir el operando (en este caso de carga), el tipo de área (marcas) y la dirección.
O también podemos hacer:
LAR1 P#M50.0 // Cargar el puntero CON la zona de memoria
L W [AR1, P#10.0] // Decir el operando y la dirección.
¿Resultado?
Pues básicamente el mismo. La diferencia es que en el direccionamiento de tipo intraárea, el contenido del AR1 va a tener la misma pinta que el direccionamiento por memoria que veíamos en el capítulo I. No tiene el área de memoria asignado (marcas en nuestro caso).
¿Qué se usa más?
Personalmente intraárea, pero supongo que es cuestión de gustos. Además imaginemos que mezclamos las cosas y hacemos lo siguiente:
LAR1 P#E50.0
L MW[AR1,P#10.0]
Como veis hemos indicado el área en la carga del registro AR1 y luego hacemos una carga de MW... ¿vamos a mandar la CPU a Stop o crearemos un agujero espacio-tiempo?
Pues no. No sé si lamentablemente, pero no.
Simplemente del AR1 tomaremos la dirección, pero no la zona de memoria y ejecutaremos el operando de carga MW.
Por tanto, y a mi juicio, es mejor siempre usar el intraárea. Me parece más metódico ya que siempre vas a construir los punteros de la misma forma, independientemente del uso que le vayas a dar posteriormente.
Muy bien, me parece estupendo... pero me he perdido en el L MW [AR1, P#10.0]... ¿qué significa?
Muy sencillo. Lo que hay entre corchetes es la dirección inicial más un desplazamiento. De tal forma que en nuestro ejemplo, realmente estamos leyendo la MW60 (50 del AR1 +10 del offset por así decirlo).
¿Es obligatorio poner ese offset siempre?
Si. Siempre. Sin excepción. Pones un P#0.0 si no lo quieres y listo.
¿Qué pasa si cargo un P#50.0 en el AR1, cargo un offset P#0.1 y hago una lectura MB, MW o MD?
Pues que estarías provocando un bonito error de runtime. Ya que para hacer una lectura de byte, word o doble word, necesitas que el bit del puntero sea 0 (ojo, el bit, no el byte). No puedes crear un MW50.1 como puedes imaginar. Así que cuidadín con eso.
¿Qué más puedo hacer con los registros?
Como no sólamente del AR1 vive el hombre, existe también un segundo registro, el AR2 . Con esta pareja, podemos jugar indistintamente para cargar nuestros punteros e incluso combinarlos en las operaciones.
Así, para seguir con el ejemplo anterior, podríamos hacer:
LAR1 P#50.0
LAR2 P#10.0
L MW[AR1,AR2] : No se puede usar ambos AR para hacer este tipo de direccionamiento
L MW[AR1,p#0.0]
T MW[AR2,P#10.0]
¿Qué operaciones puedo hacer con los registros?
LARn : Cargar el contenido del ACU1 en el registro ARn, siendo n=1 o 2.
Offtopic: Y no, no es un 102, es un 1 O 2. A la RAE le ha parecido buena idea no tener que acentuar desde hace un tiempo la O entre números. Qué país.
TARn: Transferir desde el registro n, su contenido al ACU1.
+ARn: Sumar al contenido del ARn, el contenido del ACU1.
Pero como hemos visto, podemos hacer cargas y transferencias directas:
LARn <Dirección>: Cargamos la dirección al ARn. Por ejemolo LAR1 P#50.0
TARn <Dirección>: Cargamos el contenido del ARn en la dirección. Por ejemplo TAR1 MD50
+ARn <Puntero>: Añadimos al ARn el puntero que queramos. Por ejemplo, +AR1 P#10.0
Para rizar el rizo, podemos copiar la información entre los AR haciendo:
LAR1 AR2, con lo que cargaremos en el AR1 el contenido del AR2
TAR1 AR2, con lo que recuperamos el contenido del AR1 y se lo cargamos en el AR2.
Como ves las combinaciones son unas cuantas si bien se pueden resumir en asignación y suma.
¿Y todo esto, ya sirve para algo?
Pues aunque pueda parecer lo contrario, el direccionamiento indirecto sirve para muchas cosas, pero sobre todo para recorrer información y tratarla.
En el siguiente video os voy a mostrar cómo se usa el direccionamiento indirecto, especialmente con bucles LOOP (for-next), como ya vimos.
Recordarte finalmente que si estás interesado en formarte en Step 7, puede que te interese adquirir el libro "Cómo programar en Step 7 y no morir en el intento" donde puedes encontrar no sólamente el curso completo gratuito, sino muchas más entradas del blog que como sabes se irán actualizando para los que lo adquieran de forma gratuita. Si estás interesado, puedes echarle un vistazo a este enlace donde se explica qué es lo que contiene el libro, el precio y los métodos de pago.
Referencias:



