Otros modos de direccionamiento no derivados de los básicos

Hay algunos modos de direccionamiento más complejos y que no guardan relación directa con los modos de direccionamiento básicos ya presentados:

  • Direccionamiento relativo. Las instrucciones de salto condicional (“beq”, “bne”, “bcc”, “bcs”, “bmi”, “bpl”, “bvc” y “bvs”) saltan a una posición de memoria cuando se da una condición. Pero esa posición de memoria no se expresa de forma absoluta (ej. $c100), sino como offset o diferencia respecto de la posición siguiente a la instrucción. Por eso se habla de direccionamiento “relativo”, porque lo que indica la instrucción es el salto que debe dar el contador de programa hacia delante o hacia atrás. El offset sólo ocupa un byte, y por tanto sólo permite saltos de 127 posiciones hacia delante o 128 posiciones hacia atrás.
  • Direccionamiento indirecto. La instrucción de salto incondicional “jmp” permite que el contador de programa salte a una dirección de memoria (direccionamiento absoluto). Pero además permite saltar a una dirección de memoria M2 almacenada en otra posición de memoria M1. En cierto modo, M1 es como un “puntero” o “vector” que apunta a M2. De ahí el nombre de “indirecto”, porque hay un nivel más de indirección. En realidad, dado que todas las direcciones (y en particular M2) ocupan dos bytes, no es posible almacenar M2 en M1. En M1 se almacenará el byte LSB de M2, y en M1+1 (la posición siguiente) se almacenará el byte MSB de M2.

El Kernal del C64 utiliza este modo de direccionamiento para ofrecer sus rutinas a través de una tabla de saltos (o “jump table”), de modo que si en el futuro (ya pasado) cambiara la ubicación en memoria de esas rutinas, el programador no tendría que cambiar sus programas; sólo se cambiarían las direcciones de la tabla de saltos.
Modos dir3


Programa de ejemplo: Prog09

4 comentarios en «Otros modos de direccionamiento no derivados de los básicos»

  1. Buenos días.
    En primer lugar agradecerte tu gran trabajo.
    En segundo lugar, tengo una duda respecto al programa de ejemplo 09.
    En la línea 24, donde defines lo siguiente:
    m1
    byte m2
    entiendo que m1 tiene que ver con $c0?? pero no entiendo como interpretar la sintaxis del comando byte.

    Muchas gracias por tu trabajo.
    Saludos!

    Me gusta

    1. Hola, Lencio.

      Los programas en ensamblador sobre todo tienen instrucciones (instrucciones del microprocesador 6510), pero también tienen otras cosas:

      – Etiquetas.
      – Directivas del ensamblador.
      – Operadores.
      – …

      Una etiqueta es un «nombre» que se le pone a una posición de memoria. Usar un nombre es más significativo para el programador, más fácil de recordar, etc. Y también es más cómodo porque, si reorganizamos o cambiamos el programa, probablemente las direcciones o posiciones concretas tengan que cambiar pero, si usamos nombres en vez de direcciones absolutas (en plan $c000), el programa podrá seguir funcionando sin cambios.

      Durante el proceso de ensamblado, el ensamblador (en nuestro caso CBM prg Studio) traduce etiquetas en direcciones. Es decir, en el programa ya ensamblado, en el código máquina, no hay etiquetas que valgan. Ahí lo que hay son direcciones.

      En el ejemplo 9, m1 y m2 son etiquetas. Si ensamblas el programa puedes saber a qué direcciones equivalen.

      Por otro lado, están las directivas del ensamblador. Las directivas no son instrucciones para el 6510. Son instrucciones para que el ensamblador (el CMB prg Studio en nuestro caso) haga algunas cosas durante el proceso de ensamblado. Por ejemplo, cuando pones:

      m1
      byte $00,$01

      le estás diciendo al ensamblador que en la posición m1 (m1 es una etiqueta) reserve dos bytes, y que los inicialice con los valores $00 y $01. Es decir, que reserve dos posiciones de memoria que vas a usar como variables para almacenar y manipular información.

      Otros operadores son < y > . Las direcciones de memoria en el C64 tienen 16 bits o 2 bytes. Por tanto, hay un byte más significativo (MSB – most significative byte, también llamado «hi» o «high») y un byte menos significativo (LSB – least significtive byte, también llamado «lo» o «low»). Si tienes una posición de memoria como m2 (nuevamente una etiqueta) puedes obtener su parte «lo» con < m2 y su parte «hi» con > m2 .

      En definitiva, el CBM prg Studio, en función de la dirección de comienzo marcada con * = XXXX y, en función de las instrucciones del 6510 del programa (que ocupan memoria), va calculando los valores de las sucesivas etiquetas como m1 y m2. Y con operadores como < y > se pueden obtener la partes «lo» y «hi».

      Espero haberme explicado.

      Muchas gracias por tu interés.

      Un saludo, HVSW.

      Me gusta

Responder a hvsw Cancelar la respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s