Holas!
Como siempre se empieza a hablar de código máquina ,pero siempre se queda a medias por pereza... he transcrito parte del curso de código máquina de la Commodore World.
Explica como funcionan las rutinas y sus modos de uso. He completado un poco con algún ejemplo.
Así que... a leer un poco!!!
DIRECCIONAMIENTO INMEDIATOEl operando de la instrucción está situado justo detrás de la propia instrucción, por lo que no requiere acceder a mas posiciones de memoria.
Ejemplo:
LDA #2 que quiere decir carga en el acumulador el valor de 2.
ADC #5Bh suma al acumulador el número 5Bh
DIRECCIONAMIENTO ABSOLUTOSe ponen detrás de la instrucción dos bytes que apuntan a la posición de memoria donde se encuentra el dato.
Ejemplo:
LDA $1000
Carga en el acumulador lo que contenga en la posición $1000
DIRECCCIONAMIENTO EN ACUMULADOREsta forma de direccionamiento utiliza instrucciones de un solo byte, no necesita especificar la dirección donde se encuentra el operando ya que se trata del propio acumulador.
Solo un tipo de instrucciones lo utilizan: Las de rotación y desplazamiento.
Las instrucciones de desplazamiento equivalen a multiplicar o dividir por dos el contenido del registro A, dependiendo de que el desplazamiento sea a la izq. o a la der.
Ejemplo:
ROL A
Rota el contenido del acumulador a la izquierda. Que sería como multiplicar por 2. Y 2 en binario es 10. Ósea, como si multiplicáramos por 10 un número binario.
El contenido del acarreo también rota con el acumulador. Entra su valor en el bit de menos peso y su valor es sustituido por el bit de mayor peso del Acumulador.
DIRECCIONAMIENTO IMPLICITOLas instrucciones que lo utilizan también son de un solo byte. Pues como su nombre indica, el operando va implícito en la instrucción.
Por ejemplo:
INX significa Incrementar el registro índice X.
TAX pasa el dato que hay en el acumulador A, al registro X
DIRECCIONAMIENTO INDIRECTO ABSOLUTOSolo existe una instrucción que lo utiliza, es la de salto indirecto, los dos bytes que siguen a la instrucción apuntan a una posición de memoria donde se encuentra un vector (otros dos bytes) que es el que realmente indica la dirección a donde debe saltar un programa.
Ejemplo:
JMP 1000h
Salto incondicional a la dirección que forma el contenido de las direcciones 1000h (Byte bajo) 1001h (byte alto)
Si en 1000h hay 10h y en 1001h hay 20h, entonces saltaremos a la posición de memoria 2010h.
DIRECCIONAMIENTO EN PÁGINA CEROEste modo de direccionamiento aumenta la velocidad de los programas en código maquina y ahorra memoria al acortar la longitud del programa.
Se trata de una versión recortada del modo de direccionamiento absoluto. En este último utilizábamos 3 bytes para cada instrucción (1 de instrucción y 2 de dirección de operando), que te teníamos que indicar a cualquiera de las 65536 posiciones de memoria, pero cuando lo hacemos a las primeras primera 256 el byte de mayor peso de la dirección es siempre cero y nuestra CPU está dotadas de otro potente medio de direccionamiento que permite omitir el byte alto, con esto se ahora uno de cada tres bytes y se incrementa la velocidad de ejecución al no tener que leer toda la dirección.
Antes:
STA $0033 era $8D $33 $00
y con este modo:
STA $33 es $85 $33... un byte menos!
DIRECCIONAMIENTO RELATIVOEste modo de direccionamiento salta hacia delante o detrás desde el punto donde se ejecuta el programa.
Se salta cuando se cumple una condición determinada.
Ejemplo:
BEQ $02 (Branch of EQual) Salta si es igual a cero y salta $02, ósea, dos bytes hacia la siguiente instrucción.
Aquí tengo que decir que los saltos no hace falta calcularlos. (Si es igual.. sumo un byte, quito tres, me llevo una...) Para eso, cuando escribimos en mnemónicos, empleamos las etiquetas. Y cuando compilamos este programa a código máquina, ya se encarga el compilador en calcular esos saltos en función de las etiquetas que hemos puesto.
DIRECCIONAMIENTO PÁGINA CERO INDEXADOEsta forma de direccionamiento es utilizada aprovechado los registros - índices X e Y, denominándose "Página cero, X" o "Página cero, Y", según el índice utilizado. Dado que se trata de un modo de direccionamiento en página cero, el contenido del segundo byte de la instrucción se suma al del registro-índice despreciando el acarreo y el resultado es la dirección en la página cero donde se encuentra el operando de la instrucción.
Ejemplo:
LDA 1Bh,X
Carga en el Acumulador el contenido de la dirección de memoria en página cero (los 256 primeros bytes) que resulta de sumar 1Bh más el registro X. Si X es Cero... pues cargaría en el Acumulador lo que está en la posición 001Bh.
DIRECCIONAMIENTO ABSOLUTO INDEXADOAl igual que el anterior puede ser "Absoluto, X" o "Absoluto, Y", según el índice utilizado. La dirección de del operando se calcula sumando el contenido del índice a la dirección contenida en el segundo y tercer byte de la instrucción. Este modo de direccionamiento de muy utilizado por nuestros equipos para acceder a tablas de mensajes de deben salir a pantalla, valores que deben transferirse, etc.
Es muy util cuando debemos manejar en una rutina datos que ocupan posiciones de memoria consecutivas.
Ejemplo:
ADC 1000h,X
Suma al acumulador el contenido que hay en la posición de memoria resultado de sumar 1000h con el contenido del registro X (o también puede ser Y).
Si en X tengo 33h, pues entonces cargará en el Acumulador el contenido que hay en la posición de memoria (1000h + 33h) ósea, la posición de memoria 1033h.
Y si en 1033h hay FFh, pues cargará FF en el Acumulador.
DIRECCIONAMIENTO INDEXADO DIRECTO o PREINDEXADOTambién se denomina Preindexado, ya que el segundo byte de la instrucción se suma al contenido del registro índice X despreciando el arrastre, la dirección en página cero a la que señala la suma contiene la parte baja y la siguiente la parte alta de las dirección real del operando.
Otra denominación utilizada es la de "Indirecto X"
Ejemplo:
LDA 10h,X
Carga en el acumulador el dato contenido en la dirección de memoria que sale de sumar 10h con el contenido del registro X. Pero en página cero y sin acarreo.
Si X es cero... pues carga en el Acumulador lo que está en la posición de memoria 0010h.
Si X es FFh... pues carga en el Acumulador lo que está en la posición 10h+FFh=10Fh, pero sin la 1. Osea, cargo lo contenido en 000fh
Siempre en página cero y solo con el registro X.
DIRECCIONAMIENTO INDIRECTO INDEXADO o POSTINDEXADODenominado también "Post-Indexado" o "(Indirecto), Y" el segundo byte de la instrucción señala a una posición en la página cero que contiene la parte baja de la dirección, la siguiente posición contiene la parte alta y a este vector se le suma el contenido del registro índice.
Y el resultado es la dirección real del operando.
Ejemplo:
LDA 20h, Y
Carga en el acumulador el dato contenido en la dirección obtenida de sumar el contenido del registro Y con el número que se guarda (de 16bits) en las direcciones 20h(bajo) y 21h (alto)
Si en Y tengo 08h
En 20h tengo 10h
En 21h tengo 15h...
Entonces suma lo que hay en la dirección 1510h con lo que hay en Y, y lo carga en el Acumulador.
Si en 1510h tengo 01h y se lo sumamos a Y, tendremos 08h + 01h = 09h y este valor aparecerá en el Acumulador.
Bueno... y estos son las maneras que se pueden emplear las instrucciones.
Luego, en las cartas de referencia rápida, se puede observar que pueden o no pueden hacer cada una de las instrucciones.
Esto es lo normal. Primero aprender a escribir... para luego ya ir haciendo redacciones y comentarios de texto.
Los Libros y Best Sellers se los dejamos para los gurus (sabéis quienes sois!

)
Salud!
