Modos de direccionamiento Modos de direccionamiento El CPU HCS08 incluye 16 modos de direccionamiento: • Apuntador de pila, offset de 8 • Inherente bits • Inmediato • Apuntador de pila, offset de 16 • Directo bits • Extendido • Memoria a memoria: • Indexado, sin offset o Inmediato a directo • Indexado, offset de 8 bits o Directo a directo • Indexado, offset de 16 bits o Indexado a directo con • Relativo post incremento • Indexado con post incremento o Directo a indexado con • Indexado, offset de 8 bits con post incremento post incremento 1 Direccionamiento inherente Las instrucciones que utilizan este direccionamientos no tienen que buscar un operando sobre el cual actuar Algunas de estas instrucciones actuan sobre los datos que se encuentran en los registros DIV CLI MUL CLRA LSLA NEGA PSHX NOP TAX Direccionamiento inmediato El operando en instrucciones con direccionamiento inmediato se encuentra en los bytes que siguen al código de operación Estos bytes son el valor del operando que utilizará la instrucción Para indicar que se utilizará direccionamiento inmediato, se utiliza el símbolo # El operando está limitado a uno o dos bytes, dependiendo del registro involucrado 2 Direccionamiento inmediato Algunos ejemplos de uso de este direccionamiento son: CPHX #$FFFF LDA #100 LDHX #etiqueta SUB #$A0 Otras instrucciones que lo utilizan: ADC, ADD, AND, CPX, EOR, ORA, SBC Direccionamiento directo La mayoría de las instrucciones que lo utilizan pueden acceder a los primeros 256 bytes de la memoria con solo 2 bytes: 1 byte para el código de operación 1 byte para la parte baja de la dirección efectiva El byte más significativo de la dirección efectiva se toma siempre como $00 3 Direccionamiento directo El uso de este modo de direccionamiento está limitado a operandos en la página directa o página 0 (direcciones $0000 a $00FF) En la página 0 se encuentra parte de la memoria RAM del microcontrolador ($0040 a $023F), así como la mayoría de los registros de E/S ($0000 a $003F) Direccionamiento directo Algunos ejemplos de uso de este modo de direccionamiento son: $03 ;A Æ Puerto D LDX $00 ;Puerto A Æ X CPX $E0 ;Compara X con el contenido de $00E0 STA 4 Direccionamiento extendido Utilizando este modo de direccionamiento, las instrucciones pueden acceder a cualquier dirección en un mapa de memoria de 64Kbytes Todas las instrucciones extendidas utilizan 3 bytes: 1 byte para el código de operación Los otros dos son el MSB y LSB de la dirección del operando Direccionamiento extendido Se utiliza cuando es necesario utilizar memoria por encima de la página 0 Algunos ejemplos de uso de este modo de direccionamiento son: ADC $5006 AND $0100 LDX $FE04 5 Direccionamiento indexado, sin offset Este modo se utiliza para tener acceso a datos con direcciones variables. X contiene la parte baja de la dirección, mientras que H contiene la parte alta Estas instrucciones pueden mover un apuntador a través de una tabla o almacenar la dirección de una localidad de RAM o E/S que se utilice frecuentemente Direccionamiento indexado, sin offset Algunos ejemplos de uso de este modo de direccionamiento son: JMP ,X STA ,X ADC ,X NEG ,X 6 Direccionamiento indexado, con offset de 8 bits En estas instrucciones, el CPU suma los bytes sin signo en H:X al byte sin signo que sigue al código de operación. La suma es la dirección efectiva del operando Estas instrucciones son útiles para seleccionar el k-ésimo elemento en una tabla de n elementos Direccionamiento indexado, con offset de 8 bits Algunos ejemplos de uso de este modo de direccionamiento son: JMP $FF,X STA 18,X LDA 7,X NEG $10,X 7 Direccionamiento indexado, con offset de 16 bits En estas instrucciones, el CPU suma los bytes sin signo en H:X a la palabra sin signo formada por los dos bytes que siguen al código de operación. La suma es la dirección efectiva del operando Estas instrucciones son útiles para seleccionar el k-ésimo elemento en una tabla de n elementos Direccionamiento indexado, con offset de 16 bits Algunos ejemplos de uso de este modo de direccionamiento son: JMP $20FF,X STA $A018,X LDA $FF00,X JSR $1000,X 8 Direccionamiento con el apuntador de la pila, con offset de 8 y 16 bits Estos modos de direccionamiento son similares a los indexados con offset, sólo que utilizan el apuntador de la pila en lugar del registro índice Estas instrucciones son útiles para acceder de una manera sencilla a los datos en la pila Direccionamiento con el apuntador de la pila, con offset de 8 y 16 bits Algunos ejemplos de uso de estos modos de direccionamiento son: STA $10,SP TST $25,SP LDA $FF00,SP STX $0500,SP 9 Direccionamientos de memoria a memoria El CPU08 incorpora la capacidad de realizar transferencia de datos directa entre localidades de memoria Se utiliza la instrucción MOV Se cuenta con cuatro modos de direccionamiento de memoria a memoria Memoria a memoria: Inmediato a Directo Generalmente se utiliza para inicializar variables y registros en la página directa El operando en el byte que sigue al código de operación se almacena en la localidad de la página directa indicada por el segundo byte La instrucción MOV asociada a este modo no altera el contenido del acumulador 10 Memoria a memoria: Inmediato a Directo PSHA LDA #$27 STA $A0 PULA ; Respalda el valor de A ; A=$27 ; Se almacena #$27 en $00A0 ; Se restaura el valor de A El código anterior se puede cambiar por el siguiente: MOV #$27,$A0 Memoria a memoria: Directo a Directo Generalmente se utiliza para intercambiar datos entre registros en la página directa El operando en la localidad de la página directa indicada por el byte que sigue al código de operación se almacena en la localidad de la página directa indicada por el segundo byte La instrucción MOV asociada a este modo no altera el contenido del acumulador 11 Memoria a memoria: Directo a Directo PSHA LDA $04 STA $05 PULA ; Respalda el valor de A ; A=Contenido de la dir. $0004 ; $0005=$0004 ; Se restaura el valor de A El código anterior se puede cambiar por el siguiente: MOV $04,$05 Memoria a memoria: Indexado a Directo con Post Incremento Generalmente se utiliza para transferir tablas direccionadas por el registro índice a un registro en la página directa El operando direccionado por H:X se almacena en la localidad de la página directa indicada por el byte que le sigue al código de operación. H:X se incrementa al terminar La instrucción MOV asociada a este modo no altera el contenido del acumulador 12 Memoria a memoria: Indexado a Directo con Post Incremento Si quisiéramos escribir el contenido de la dirección a la que apunta H:X en el puerto B, se haría lo siguiente: MOV X+,$01 Una vez que se ha movido el dato, H:X incrementa su valor en 1, apuntando así a la siguiente dirección Memoria a memoria: Directo a Indexado con Post Incremento Generalmente se utiliza para llenar tablas desde registros en la página directa El operando en la localidad de la página directa indicada por el byte que le sigue al código de operación, se almacena en la localidad direccionada por H:X. H:X se incrementa al terminar La instrucción MOV asociada a este modo no altera el contenido del acumulador 13 Memoria a memoria: Directo a Indexado con Post Incremento Si quisiéramos escribir el contenido del puerto D en la dirección a la que apunta H:X, se haría lo siguiente: MOV $03,X+ Una vez que se ha movido el dato, H:X incrementa su valor en 1, apuntando así a la siguiente dirección Direccionamiento relativo Todas las instrucciones de salto condicional utilizan el direccionamiento relativo para calcular la dirección efectiva resultante Si la condición es verdadera, la dirección efectiva se carga en el PC. Si es falsa, avanza a la siguiente instrucción 14 Direccionamiento relativo El desplazamiento es un byte en complemento a 2 que permite un rango de salto de -128 a 127 bytes desde la dirección que sigue a la del salto Direccionamiento relativo Inicio: Fin: LDA #1 CMP #-2 BLT Inicio BRA Fin ; Salta si A es < -2 15 Direccionamiento indexado con post incremento, sin offset y con offset de 8 bits Este modo de direccionamiento es útil para búsquedas en tablas. Una vez direccionado el operando, H:X se incrementa Sólo se utiliza con la instrucción CBEQ (Compare and Branch if Equal) Direccionamientos indexados con post incremento LDA STA MOV CLRX Ciclo: CBEQ BRA Iguales: CLRX Ciclo2: CBEQ BRA Iguales2: BRA #$FF $10 $10,$60 X+,Iguales Ciclo ; Sin offset $50,X,Iguales Ciclo2 Iguales2 ; Offset de 8 bits 16