3.3. MODOS DE DIRECCIONAMIENTO.
Existen 6 modos de direccionamiento distintos. Los modos de direccionamientos son distintas formas que
tiene la CPU de acceder a los datos que estn en memoria.
3.3.1. Direccionamiento inmediato
El dato al que se hace referencia se encuentra "dentro" de la instruccin, no es necesario acceder a
memoria. El dato puede ser de 1 2 bytes. Este modo de direccionamiento se indica mediante el signo #.
Ejemplo: LDAA #08 Esta instruccin carga el valor decimal 8 en el acumulador A. El valor 08 se
encuentra a continuacin del cdigo de instruccin de LDAA. La instruccin LDAA tiene el cdigo $86, por tanto,
en memoria esta instruccin queda representada mediante los valores: (Se supone que esta instruccin comienza en la
direccin $0000).
Dir. memoria
Contenido
Nemnico
0000
0001
$86
$08
LDAA
#8
3.3.2. Direccionamiento extendido
El dato se encuentra en la direccin de memoria especificada. El dato puede estar en cualquier posicin de
la memoria dentro del lmite de las 64Kb, por lo que la direccin ocupa 2 bytes.
Ejemplo: LDAA $FC00 Esta instruccin carga en el acumulador el contenido de la direccin $FC00. La
direccin del dato se almacena despus del cdigo de la instruccin y ocupa 2 bytes. Las instrucciones con este modo
de direccionamiento ocupan 3 bytes (1 byte para el cdigo de la instruccin y 2 bytes para la direccin).
3.3.3. Direccionamiento directo
Este modo de direccionamiento es exactamente igual que el anterior con la salvedad de que slo acta con
direcciones comprendidas entre $00$FF (256 primeros bytes de la memoria). La utilidad de este modo es que slo
necesita 1 byte para especificar la direccin del dato, con lo que se ahorra espacio y tiempo.
Ejemplo:
(1) LDAB $FC00
(2) LDAB $05
Ambas instrucciones cargan en el acumulador B el contenido de la direccin especificada. En el caso de la
instruccin 1, se utiliza direccionamiento extendido y la instruccin ocupa 3 bytes. En el caso de la instruccin 2,
como la direccin es menor que $FF se utiliza direccionamiento directo y la instruccin ocupa 2 bytes.
Se saca una conclusin muy importante al comparar ambos modos de direccionamiento: siempre que sea
posible conviene usar el direccionamiento directo, es decir, "SITUAR LAS VARIABLES EN LAS DIRECCIONES BAJAS DE LA
MEMORIA, EN EL ESPACIO $00$FF". De esta manera, todas las instrucciones que hagan referencia a variables, utilizarn
direccionamiento directo y se ahorrarn muchos bytes de memoria.
Quin decide el modo de direccionamiento?. Es el propio ensamblador. Al encontrarse el ensamblador con
la instruccin 1 (LDAB $FC00) sabe que la direccin es superior a $FF y que debe utilizar direccionamiento extendido. Al
encontrarse con la instruccin 2, la direccin es menor que $FF y por tanto utiliza direccionamiento
directo ahorrando un byte.
3.3.4. Indexado
Este modo de direccionamiento se utiliza para acceder a TABLAS (Arrays, cadenas....) en la memoria. El
dato se busca de la siguiente forma: Se toma la direccin del registro ndice (X Y), se le suma un desplazamiento
(offset) de 8 bits y el contenido de esa direccin es el dato buscado.
Este modo de direccionamiento se especifica colocando como argumentos en la instruccin un offset, una
coma y el registro ndice.
Ejemplo: LDAB 5,X Esta instruccin carga en el acumulador B el contenido de la direccin especificada por X
ms un offset de 5. Se simboliza de la siguiente manera:
dir = (X) + 5 , siendo dir la direccin que contiene el dato.
Para el caso particular de tener un offset de 0, es decir, que se quiera acceder a la direccin contenido en X,
se puede especificar de las siguientes maneras:
LDAB 0,X
LDAB ,X
LDAB X
Las 3 instrucciones son equivalentes.
Este modo de direccionamiento es muy interesante porque permite acceder a cualquier direccin de
memoria ($0000$FFFF) como en el direccionamiento extendido pero las instrucciones slo ocupan 2 bytes, como
en el direccionamiento directo. Adems, el registro X se puede variar (incrementar, decrementar...) con lo que se
obtiene una gran flexibilidad a la hora de acceder a tablas de datos.
Para acceder a los registros de configuracin del microcontrolador, que se encuentran en las direcciones
$1000$103F, es conveniente utilizar este modo de direccionamiento porque as las instrucciones ocupan menos
bytes. En el registro ndice se introduce la direccin $1000 correspondiente al comienzo de los registros de
configuracin del microcontrolador, y slo es necesario especificar el desplazamiento:
Instrucciones Comentarios
Tamao instruccin
LDX $1000
; X = $1000
(3 Bytes)
STAA 1,X
; Meter A en dir. $1001
(2 Bytes)
STAB $2C,X
; Meter B en dir. $102C
(2 Bytes)
STAA $10,X
; Meter A en dir. $1010
(2 Bytes)
Para realizar esto mismo con direccionamiento extendido sera:
STAA $1001
; Meter A en dir. $1001
(3 Bytes)
STAB $102C
; Meter B en dir. $102C
(3 Bytes)
STAA $1010
; Meter A en dir. $1010
(3 Bytes)
Para acceder a 3 registros de control distintos, ambos trozos de cdigo ocupan 9 bytes de memoria. Pero si
se pretende acceder a ms de 3 registros de control, que suele ser lo ms habitual, se ahorra memoria utilizando
direccionamiento indexado. El offset aplicado es de 8 bits y sin signo por lo que el offset mximo es de 256 bytes.
3.3.5. Direccionamiento relativo
Este modo de direccionamiento slo se utiliza con las instrucciones de bifurcacin. Estas indican a la CPU
que realice un salto de tantos bytes hacia adelante o hacia atrs. El desplazamiento tiene signo y es de un byte por lo
que las bifurcaciones slo se pueden hacer de 128 bytes hacia atrs 127 bytes hacia adelante:
Ejemplo:
Bucle ....
....
BNE bucle
El programador no necesita calcular el salto a efectuar ,lo realiza automticamente el ensamblador. Sin
embargo, es importante saber que los saltos con instrucciones BR slo se pueden realizar hacia posiciones de
memoria que estn a menos de 128 bytes por debajo y a menos de 127 bytes por arriba. Si se sobrepasa el lmite el
ensamblador dar un mensaje de error.
Ejemplo:
Bucle Inst1
; Direccin 0
......
......
BNE bucle
; Direccin 200
Este programa dara error puesto que el salto que la bifurcacin realiza es de ms de 128 bytes hacia arriba.
La ventaja es que todas las instrucciones BR (BRANCH) ocupan 2 bytes. La desventaja es que slo se pueden hacer
bifurcaciones relativamente cortas. Para realizar bifurcaciones a cualquier posicin de la memoria se utilizan las
instrucciones JUMP ( JMP y JSR) , que ocupan 3 bytes.
3.3.6. Direccionamiento inherente
Los operandos se encuentran en registros de la CPU. Por el cdigo de la instruccin la CPU sabe de qu registros se trata.
Ejemplo:
CDIGO
MNEMNICO
$1B
ABA
; A:=A+B
$5C
INCB
; B:=B+1
$08
INX
; X:=X+1
La primera instruccin, de cdigo $1B, suma el contenido del acumulador A y B y el resultado lo introduce
en el acumulador A. La segunda incrementa el acumulador B y la tercera el registro de ndice X. Estas instrucciones
slo ocupan un byte y por ello conviene abusar de ellas.
3.4. JUEGO DE INSTRUCCIONES
Las instrucciones se dividen en distintos grupos. Todas las instrucciones tienen dos campos: uno es el
mnemnico y el otro es el dato o la direccin a la que hace referencia la instruccin. Este campo es opcional.
3.4.1. Instrucciones de carga, almacenamiento y transferencia
CARGA: Estas instrucciones permiten introducir un nuevo valor en los registros, leer una posicin de memoria,
un puerto etc...
LDAA : Introducir un dato de 8 bits en el acumulador A
Ej.
LDAA #30
; A:=30 (Direccionamiento inmediato)
LDAA $1000
; Introducir en A el contenido de la direccin $1000.
LDAB : Introducir un dato de 8bits en el acumulador B
LDD : Introducir un dato de 8 16 bits en el doble acumulador D (Formado por A y B yuxtapuestos)
Ej.
LDD #$FFCC
; D:=$FFFF > A:=$FF; B:=$CC
LDD #$10;
; D:=$0010 > A:=$00; B:=$10
LDX : Introducir un dato de 16 bits en el registro ndice X
Ej. LDX #$1000 ; X:=$1000
LDX 3,Y
; Meter en X el contenido de la direccin Y+3
LDX 5,X ; Meter en X el contenido de la direccin X+3.
LDY :Introducir un dato de 16 bits en el registro de ndice Y
LDS :Introducir un dato de 16 bits en el SP (puntero de pila). Esta instruccin hay que utilizarla al menos una vez
en nuestros programas para inicializar la pila.
Ej. LDS #$FC00 ;Inicializar la pila a partir de la direccin $FC00 hacia abajo
CLRA :Borrar el contenido del acumulador A. Esta instruccin hace lo mismo que LDAA #0, con la diferencia de
que el direccionamiento es inherente y slo ocupa 1 byte, mientras que LDAA #0 ocupa 2 bytes.
CLRB :Borrar el contenido del acumulador B.
ALMACENAMIENTO: Estas instrucciones permiten alterar una posicin de memoria, un puerto, registros internos, etc.
STAA :Almacenar el acumulador A en una direccin de memoria.
Ej. STAA $1000 ; Mandar el acumulador por el puerto A
STAB :Almacenar el acumulador B.
STD :Almacenar el doble acumulador D. (16 bits)
STX :Almacenar el registro de ndice X(16 bits)
STY :Almacenar el registro de ndice Y (16 bits)
STS :Almacenar el puntero de pila SP.
CLR :Poner a cero el contenido de una direccin de memoria.
Ej. CLR $1000 ; Mandar un 0 por el puerto A
TRANSFERENCIAS: Permiten transferir datos entre registros y registros y memoria. El direccionamiento es inherente por
lo que no es necesario especificar direccin. Con el mnemnico basta.
PSHA :Introducir el acumulador A en la pila. Se introduce A en la direccin especificada por SP. SP se decrementa en 1
PSHB :Introducir el acumulador B en la pila
PSHX :Introducir el registro de ndice X en la pila. Se introduce X en la pila. SP se decrementa en 2
unidades puesto que X es de 16 bits.
PSHY :Introducir el registro de ndice Y en la pila.
PULA :Sacar A de la pila. Se decrementa SP en una unidad y se introduce en A el dato contenido en
la posicin apuntada por SP.
PULB :Sacar B de la pila.
PULX :Sacar X de la pila. SP se incrementa en 2 unidades ya que X es de 16 bits.
PULY :Sacar Y de la pila.
TAB :Introducir el valor de A en B
TBA :Introducir el valor de B en A
TSX :Introducir el valor de SP en X
TSY :Introducir el valor de SP en Y
TXS :Introducir el valor de X en SP
TYS :Introducir el valor de Y en SP
XGDX :Intercambiar el registro D con el X
XGDY :Intercambiar el registro D con el Y
3.4.2. Instrucciones aritmticas
SUMAR
ADDA :Aadir un dato al acumulador A
Ej. ADDA #5 ; Sumar 5 al acumulador.
ADDA $C000 ;Sumar el contenido de la dir. $C000 al acumulador
ADDB :Aadir un dato al acumulador B
ADDD :Aadir un dato al doble acumulador D
ADCA :Aadir al acumulador A un dato y el contenido del acarreo.
ADCB :Aadir al acumulador B un dato y el contenido del acarreo.
ABA :Sumar el acumulador A y B y poner el resultado en A
ABX :Sumar B y X y poner resultado en X
ABY :Sumar B y Y y poner resultado en Y
INCA :Incrementar el acumulador A
INCB :Incrementar el acumulador B
INC :Incrementar el contenido de una dir. de memoria.
Ej. INC 2,Y ; Sumar una unidad al byte que se encuentra en la dir. Y+2.
INX :Incrementar registro X
INY :Incrementar registro Y
INCS :Incrementar puntero de pila SP.
RESTAR
SUBA :Restar un dato al acumulador A.
Ej. SUBA #$2C ; Restar $2C al acumulador.
SUBB :Restar un dato al acumulador B.
SUBD :Restar un dato al doble acumulador D.
SBCA :Restar al acumulador A un dato y el contenido del acarreo.
SBCB :Restar al acumulador B un dato y el contenido del acarreo.
DECA :Decrementar acumulador A
DECB :Decrementar acumulador B
DEC :Decrementar byte de una dir. de memoria.
DEX :Decrementar registro X.
DEY :Decrementar registro Y.
DES :Decrementar puntero de pila SP.
COMPARACIONES
CMPA :Comparar acumulador A con un dato. Se activan los bits correspondientes del registro de
status. Los bits que se activan son el Z(Cero) y el N (negativo).
Ej. CMPA #10 ; Comparar Acumulador A con 10.
CMPB :Comparar Acumulador B con un dato.
CPD :Comparar doble acumulador D con un dato.
CPX :Comparar registro X con un dato.
CPY :Comparar registro Y con un dato.
CBA :Comparar A con B.
COMPLEMENTO A DOS
Estas instrucciones permiten obtener nmeros negativos en formato de complemento a dos.
NEG :Complementar a dos un byte de la memoria.
NEGA :Complementar a dos el acumulador A
NEGB :Complementar a dos el acumulador B
MULTIPLICACIONES Y DIVISIONES
MUL :Se multiplican A y B y el resultado se introduce en el doble acumulador D
IDIV :Se divide D entre X y el resultado se guarda en X. El resto se guarda en D.
3.4.3. Operaciones lgicas y de manipulacin de bits
ANDA :Se realiza una operacin AND lgica entre el registro A y la memoria. El resultado se almacena en el acumulador A.
ANDB :Idem pero con el acumulador B.
ORAA :Se realiza una operacin OR lgica entre el acumulador A y la memoria. El resultado se almacna en acumulador A.
ORAB :Idem pero con el acumulador B.
EORA :Realizar un orexclusivo (XOR) entre el registro A y memoria y almacenar resultado en acumulador A.
EORB :Idem pero con el acumulador B.
COMA :Se realiza el complemente a uno de A.
COMB :Se realiza el complemento a uno de B.
BITA :Esta instruccin sirve para comprobar si determinados bits de una posicin de memoria estn activados o no. Se
realiza un AND lgico entre el acumulador y la posicin de memoria pero no se altera ninguna de las dos. El resultado
queda reflejado en el bit Z del registro CCR.
Ejemplo: Queremos comprobar si los bits 0 y 1 del puerto A estn ambos activados:
LDAA #$03
; Meter el valor $03 (00000011 en binario) en A
BITA PORTA ; Comprobar bits 0 y 1.
BEQ subrutina ; Saltar si ambos bits son cero.
BITB :Idem que BITA pero con el acumulador B.
BCLR :Poner a cero los bits especificados de una posicin de memoria. La sintaxis es: BCLR operando mscara. El
operando es una posicin de memoria a la que se puede acceder mediante cualquiera de los modos de direccionamiento.
Mscara es un byte, cuyos bits a uno se corresponden con los bits del operando que se quieren poner a cero. Por
ejemplo, sequiere poner a cero los bits 0 y 1 del puerto A: BCLR PORTA,X $03. Slo est permitido el direccionamiento
indexado!
BSET :Lo mismo que BCLR pero los bits en vez de ponerse a cero se ponen a 1.
BRCLR: Esta instruccin es muy til y un poco diferente del resto porque tiene 3 parmetros. Se bifurca a la direccin
especificada si unos bits determinados estn a cero. La sintaxis es:
BRCLR operando mscara direccin. Se realiza un AND lgico entre el operando y la mscara y se bifurca si la operacin
da como resultado cero, es decir, si todos los bits indicados estaban a cero.
Un ejemplo muy tpico es un bucle de espera hasta que se active un bit de una posicin de memoria:
LDX #$1000
wait BRCLR 0,X $80 wait
El bucle se repite mientras el bit 7 del puerto A sea distinto de cero. En cuanto se ponga a cero se sale del bucle. Esta
instruccin slo permite direccionamiento indexado!!
BRSET :Igual que BRCLR pero se salta cuando los bits indicados se ponen a 1.
3.3.4. Desplazamientos y rotaciones
Desplazamientos aritmticos:
ASL :Desplazamiento aritmtico a la izquierda de un operando en memoria.
ASLA :Desplazamiento aritmtico a la izquierda del acumulador A.
ASLB :Idem pero con el acumulador B.
ASLD :Idem pero con el doble acumulador D.
ASR :Desplazamiento aritmtico a la derecha de un operando en memoria
ASRA :Desplazamiento aritmtico a la derecha del acumulador A.
ASRB :Idem con el acumulador B
Desplazamientos lgicos:
LSR :Desplazamiento lgico a la derecha de un operando en memoria
LSRA :Desplazamiento lgico a la derecha del acumulador A
LSRB :Idem con el acumulador B.
LSRD :Idem con el acumulador D.
Rotaciones:
ROL :Rotacin a la izquierda de un operando en memoria
ROLA :Rotacin a la izquierda del acumulador A
ROLB :Rotacin a la izquierda del acumulador B
ROR :Rotacin a la derecha de un operando en memoria
RORA :Rotacin a la derecha del acumulador A
RORB :Rotacin a la izquierda del acumulador B
3.4.5. Bifurcaciones y saltos
Bifurcaciones :Las bifurcaciones (instrucciones BRANCH) se diferencian de los saltos en que se realizan mediante
direccionamiento relativo por lo que slo se pueden utilizar para saltar 128 bytes hacia atrs o 127 bytes adelante. Las
bifurcaciones condicionales bifurcan a la direccin especificada cuando se da una determinada condicin en el registro de
estado CCR.
BCC :Bifurcacin si acarreo est a cero
BCS :Bifurcacin si acarreo est a uno
BEQ :Bifurcar si el resultado a sido cero (Z=1)
BGE :Bifurcar si mayor o igual (Signo)
BGT :Bifurcar si mayor que (Signo)
BHI :Bifurcar si mayor que (Sin signo)
BHS :Bifurcar si mayor o igual (Sin signo)
BLE :Bifurcar si menor o igual (Signo)
BLO :Bifurcar si menor (Sin Signo)
BLS :Bifurcar si menor o igual (Sin signo)
BLT :Bifurcar si menor (Signo)
BMI :Bifurcar si negativo (N=1)
BNE :Bifurcar si no igual (Z=0)
BPL :Bifurcar si positivo (N=0)
BVC :Bifurcar si overflow est a cero (V=0)
BVS :Bifurcar si overflow est a uno (V=1)
BRA :Bifurcar (Salto incondicional)
BSR :Llamar a una subrutina (incondicional)
Saltos Los saltos se pueden realizar a cualquier direccin de memoria.
JMP :Salto incondicional
JSR :Salto incondicional a una subrutina
3.4.6. Instrucciones de modificacin del CCR Estas instrucciones alteran los bits del registro de estado CCR.
CLC :Poner a cero el bit de acarreo
SEC :Poner el bit de acarreo a uno
CLI :Poner el bit de interrupciones a cero. Las interrupciones se permiten.
SEI :Poner el bit de interrupciones a uno. Las interrupciones se inhiben.
CLV :Poner el bit de overflow a cero
SEV :Poner el bit de overflow a uno
TAP :Mover el Acumulador A al registro CCR
TPA :Mover el CCR al acumulador A
3.4.7. Otras instrucciones
RTS :Retornar de una subrutina
RTI :Retornar de una interrupcin
SWI :Interrupcin Software
WAI :Esperar hasta que ocurra una interrupcin
NOP :No operacin. No hace nada salvo consumir un ciclo de reloj.
STOP :Parar el reloj