Hay bastantes variaciones sobre este mismo tema. La primera de ellas es que se puede indicar un desplazamiento sobre la dirección base apuntada por el registro índice. Este desplazamiento puede incluso ser negativo:
El desplazamiento puede estar indicado por A, B o D, como en el siguiente ejemplo (recordad que 0xFF es -1 en complemento a 2):
Podemos hacer que el registro índice se autoincremente después de haber hecho la carga en una (+) o dos unidades (++):
Podemos, incluso, hacer que el registro índice se autodecremente antes de haber hecho la carga en una (-) o dos unidades (--):
Aunque en todos los ejemplos hemos usado la orden LDA, podemos apoyarnos en un registro índice con cualquiera de las otras que hemos visto que acceden a la memoria. Por lo tanto son instrucciones válidas: STD ,Y++; ROL 3,X; CMPU D,X; etc.
Con esto que ya sabemos, la parte sustancial del misterioso "Hola, mundo" ha quedado desvelada:
[...] cadena: .ascii "Hola, mundo." .byte 10 ; 10 es CTRL-J: salto de lInea .byte 0 ; 0 es CTRL-@: fin de cadena .globl programa programa: ldx #cadena bucle: lda ,x+ beq acabar sta 0xFF00 ; salida por pantalla bra bucle acabar: clra [...]
Para imprimir la cadena, nos apoyamos en el registro índice X
que va señalando, uno tras otro, todos los caracteres para que
se carguen en A y se impriman o, en el caso de ser el carácter
'\0
, acabe el programa.
El perro
de San Roque no tiene rabo
, la salida debe ser
ERSabdeilnopqrtu
Pista: usad un algoritmo sencillo, aunque no sea muy eficiente. Por ejemplo, recorred el array en busca del elemento menor. Una vez encontrado, volved a recorrerlo y marcad todas los caracteres donde aparezca el menor para no contarlos en el futuro. Los podéis marcar activando el bit más significativo, por ejemplo. Cuando estén todos marcados, habréis acabado.
El siguiente ejemplo muestra cómo, a falta de registros, se puede usar una variable temporal en la pila U para hacer un bucle de 23 iteraciones:
ldu #0xF000 ; cargamos U con un valor seguro al principio... [...] pshu a ; PILA [A] pshu a ; PILA [A A] lda #23 sta 1,u ; PILA [A 23] pulu a ; PILA [23] y recuperamos el valor de A bucle: [...] ; aquI las instrucciones del bucle dec ,u bne bucle ; PILA [0] tst ,u+ ; truco para sacar la variable de la pila sin alterar los ; registros. Veremos cOmo hacerlo mejor en el futuro ; PILA []
Preocupados X e Y por el intrusismo laboral de U y S deciden contraatacar. Y es que X e Y pueden usarse también para construir de un modo muy fácil una pila. No existen las instrucciones PSHX y PULX, pero no importa porque se pueden simular fácilmente. Por ejemplo:
Con U | Con X |
---|---|
PSHU A | STA ,-X |
PSHU D | STD ,--X |
PULU D | LDD ,X++ |
PULU A | LDA ,X+ |
PSHU A,B,Y | STY ,--X; STD ,--X |
PULU A,B,Y | LDD ,X++; LDY ,X++ |
Bien es verdad que no es tan fácil meter o sacar CC o DP de una pila construida con X, pero tampoco se usa tanto.
Los ingenieros de Motorola que diseñaron el 6809 hicieron que la operación de decremento fuera previa y la de incremento posterior cuando se usan índices precisamente para que pudieran ser usados como pilas.
Aquí tenéis una solución para cuando se parte de cuatro discos (esperad a que la animación pase por el momento en que está la torre al completo a la izquierda):
Cada una de las tres torres vendrá representada por una pila construida con los registros X, Y y U. Al principio, meteremos en la pila X, la configuración inicial. Por ejemplo, para cinco discos:
[12345]X []Y []U
Si, por ejemplo, hay que mover un disco de la primera a la tercera torre, haremos una instrucción PULL de la pila X y una instrucción PUSH en la pila U.
[2345]X []Y [1]U
La pila S la usaremos para resolver el algoritmo, del modo siguiente:
[12345]X []Y []U [2345]X []Y [1]U [345]X [2]Y [1]U [345]X [12]Y []U [45]X [12]Y [3]U [145]X [2]Y [3]U [145]X []Y [23]U [45]X []Y [123]U [5]X [4]Y [123]U [5]X [14]Y [23]U [25]X [14]Y [3]U [125]X [4]Y [3]U [125]X [34]Y []U [25]X [34]Y [1]U [5]X [234]Y [1]U [5]X [1234]Y []U []X [1234]Y [5]U [1]X [234]Y [5]U [1]X [34]Y [25]U []X [34]Y [125]U [3]X [4]Y [125]U [3]X [14]Y [25]U [23]X [14]Y [5]U [123]X [4]Y [5]U [123]X []Y [45]U [23]X []Y [145]U [3]X [2]Y [145]U [3]X [12]Y [45]U []X [12]Y [345]U [1]X [2]Y [345]U [1]X []Y [2345]U []X []Y [12345]UNota: no se trata en este ejercicio de que entendáis el algoritmo usado, solamente que lo realicéis en ensamblador según se ha explicado y así manejéis pilas, índices, operaciones de bits, etc.
ls
cd
rm
man
cat
echo $?