Vous êtes sur la page 1sur 36

MICROCONTROLADORES AVR

ATMEL ha llevado la filosofía de diseño RISC (adaptada) a los microprocesadores de 8


BIT. Esta nueva arquitectura proporciona todos los beneficios habituales del RISC: tasa
de reloj más rápida, mejor desempeño, y una optimización más eficiente en el
compilador. AVR compite con varias familias de microprocesadores bien establecidas
en el mercado, tales como: 8051, 68HC05, 68HC11 y los PIC de Microchip que se han
extendido rápidamente en los últimos años.

AVR es el primer diseño de CPU de ATMEL, una compañía más conocida por sus
productos de memoria "flash" y EEPROM. La firma también produce y vende varios
subproductos de la popular familia 8051, con la diferencia que estos están basados en
"flash". La tabla que se presenta a continuación resume las características más
importantes de algunos modelos que pueden ser adquiridos en el mercado local:

Los dispositivos se fabrican usando la tecnología de memoria no volátil de alta densidad


de ATMEL. La Flash programable permite reprogramar la memoria de programa en el
sistema a través de un interfaz serie SPI o por un programador de memoria no volátil
convencional. Combinando una reforzada CPU RISC de 8-bit y la Flash programable en
un chip monolítico, los microcontroladores de ATMEL serie AT90SXX proporcionan
una gran flexibilidad y soluciones eficaces a muchas aplicaciones de control integradas.

Los AVR cuentan con un amplio conjunto de instrucciones y con 32 registros de trabajo
de propósito general. Los 32 registros se conectan directamente a la Unidad Aritmético-
Lógica (ALU), permitiendo acceder a dos registros independientes con una instrucción
ejecutada en un ciclo de reloj. La arquitectura resultante trabaja con un código más
eficaz, logrando capacidades de procesamiento diez veces más rápidas que los
microcontroladores CISC convencionales.

1
Diagrama a bloques del AT90S8535

Pueden usarse seis de los 32 registros


como tres punteros de registro de
dirección indirectos (de 16-bits) para
el direccionamiento del espacio de
datos (memoria de datos RAM),
proporcionando cálculos de
dirección eficaces. También se usa
uno de los tres punteros de dirección
para observar una tabla de
constantes. Estos registros de
funciones agregados son los
registros: X, Y y Z.

2
El espacio de memoria I/O contiene
64 direcciones para la configuración
de funciones periféricas de la CPU
como los registros de control,
Temporizadores / Contadores,
convertidores A/D y otras funciones.
Los registros de I/O deben ser
accedidos con su dirección del
espacio I/O –no considerando su
dirección absoluta-. A estos registros
de propósito específico ATMEL
también los llama Puertos (Ports).

El AVR utiliza el concepto de


arquitectura Harvard, con buses y
memorias de programa y datos por
separado. La memoria de programa
se ejecuta con un sistema de dos fases. Mientras una instrucción está ejecutándose, la
siguiente instrucción se pre-extrae de la memoria de programa.

Con las instrucciones de salto relativo (relative jump) y llamada a subrutina (call), se
accede directamente a cualquier dirección de la memoria de programa. La mayoría de
las instrucciones de los AVR tiene el formato de palabra (word) de 16-bit. Cada
dirección de memoria de programa contiene una instrucción de 16 o 32 bit.

Durante las interrupciones y las llamadas a subrutinas, la dirección de retorno del


contador de programa (PC) se guarda en la pila. La pila está de forma acertada situada
en la SRAM de datos de propósito general, y por consiguiente, el tamaño de la pila está
sólo limitado por el tamaño total de la SRAM. Todos los programas del usuario
deben inicializar el puntero de pila (SP) antes de la ejecución de subrutinas o
interrupciones, considerando que cada vez que se carga un valor en la pila la dirección
del SP decrece. El SP de 16 bit es accesible para lectura y escritura mediante el espacio
de memoria I/O.

Las localidades de la memoria de datos (SRAM) pueden ser accedidos fácilmente a


través de los diferentes modos de direccionamiento soportados en la arquitectura AVR.

El modo ocioso (idle) detiene la CPU, permitiendo que continúen funcionando la


SRAM, el puerto SPI, los Temporizadores / Contadores y el sistema de interrupciones.
El modo hibernación (power-down) guarda los contenidos de los registros pero congela
el oscilador, deshabilitando todas las otras funciones del chip hasta la próxima
interrupción externa o Reset del hardware.

3
CONJUNTO DE INSTRUCCIONES

En este apartado se comentan las instrucciones de ensamblador que poseen los µC AVR
de 8-BIT. Se explica la función de cada una de ellas, su sintaxis, operandos utilizados y
una descripción con ejemplos.

El conjunto de instrucciones para estos microcontroladores se puede dividir en el


siguiente orden de grupos:

Instrucciones Aritméticas y Lógicas


Instrucciones de Desvío (salto)
Instrucciones de Transferencia de Datos
Instrucciones de Bit y prueba de Bit

Una línea típica en lenguaje ensamblador está dada de la siguiente forma:

[Mnemónico] operando1, operando2

Los Mnemónicos son las instrucciones en lenguaje ensamblador que puede reconocer el
microprocesador. Dependiendo de la instrucción, puede haber uno o dos operandos,
incluso pueden no existir; su contenido consiste en un número, una variable o una
dirección; normalmente el resultado de una operación lógica, aritmética o de carga es
almacenado en operando1.

NOMENCLATURA DEL CONJUNTO DE INSTRUCCIONES

Registros y operandos
Rd Registro destino (y fuente) del bloque de registros de trabajo
Rr Registro fuente del bloque de registros de trabajo
R Resultado después de que una instrucción es ejecutada
K Dato inmediato (constante)
k Dirección de memoria
b Bit de un registro I/O (7-0)
s Bit en el registro de estado (SREG)
X,Y,Z Registros de direccionamiento indirecto o registros de palabra (X=R27:R26
Y=R29:R28 Z=R31:R30)
P Registros del bloque I/O
q Desplazamiento (6-bit) por direccionamiento directo

4
Banderas del registros de estado (SREG)
C: Bandera de acarreo S: N⊕V para pruebas de signo
Z: Bandera de resultado cero H: Bandera de medio acarreo
N: Bandera de resultado negativo T: Bit transferido por la instrucción BLD
o BST
V: Indicador de complemento a dos I: Bandera de interrupciones globales
desbordado

RESUMEN DEL CONJUNTO DE INSTRUCCIONES

Instrucciones Aritméticas y Lógicas


Mnemónico Operandos Descripción
ADD Rd,Rr Suma sin acarreo
ADC Rd,Rr Suma sin acarreo
ADIW Rd, K Suma un inmediato a un registro de palabra
SUB Rd,Rr Resta sin acarreo
SUBI Rd,K Resta un inmediato
SBC Rd,Rr Resta con acarreo
SBCI Rd,K Resta un inmediato con acarreo
AND Rd,Rr AND lógico
ANDI Rd,K AND lógico con inmediato
OR Rd,Rr OR lógico
ORI Rd,K OR lógico con inmediato
EOR Rd,Rr OR exclusivo
COM Rd Complemento a uno
NEG Rd Complemento a dos
SBR Rd,K Pon a uno los bits de un registro
CBR Rd,K Pon a cero los bits de un registro
INC Rd Incrementa al registro
DEC Rd Decrementa al registro
TST Rd Revisa si es cero o menor
CLR Rd Borra el registro
SER Rd Carga los bits de un registro
ADIW Rd+1:Rd,K Suma un inmediato a un registro de palabra
SBIW Rd+1:Rd,K Resta un inmediato a un registro de palabra
MUL Rd,Rr Multiplica sin signo
MULS Rd,Rr Multiplica con signo
MULSU Rd,Rr Multiplica signado con no signado

Instrucciones de desvío (salto)


Mnemónicos Operandos Descripción
RJMP k Salto relativo
IJMP Ninguno Salto indirecto
EIJMP Ninguno Salto indirecto extendido
JMP k Salto
RCALL k Llamada relativa a subrutina
ICALL Ninguno Llamada indirecta a subrutina

5
EICALL Ninguno Llamada indirecta a subrutina extendida
CALL k Llamada a subrutina
RET Ninguno Regreso de subrutina
RETI Ninguno Regreso de interrupción
CPSE Rd,Rr Compare y salta si es igual
CP Rd,Rr Compara
CPC Rd,Rr Compara con acarreo
CPI Rd,K Compara con inmediato
SBRC Rr,b Salta si el bit del registro es cero
SBRS Rr,b Salta si el bit del registro es uno
SBIC P,b Salta si el bit del registro I/O es cero
SBIS P,b Salta si el bit del registro I/O es uno
BRBC s,k Salta si el bit de SREG es cero
BRBS s,k Salta si el bit de SREG es uno
BREQ k Salta si es igual
BRNE k Salta si es diferente
BRCS k Salta si C está a uno
BRCC k Salta si C está a cero
BRSH k Salta si es mayor o igual
BRLO k Salta si es menor
BRMI k Salta si es negativo
BRPL k Salta si es mayor
BRGE k Salta si es mayor o igual (con signo)
BRLT k Salta si es menor (con signo)
BRHS k Salta si H está a uno
BRHC k Salta si H está a cero
BRTS k Salta si T está a uno
BRTC k Salta si T está a cero
BRVS k Salta si V esta a uno
BRVC k Salta si V está a cero
BRIE k Salta si I está a uno
BRID k Salta si I está a cero

Instrucciones de Transferencia de Datos


Mnemónicos Operandos Descripción
MOV Rd,Rr Copia de registros
MOVW Rd,Rr Copia registros de palabra
LDI Rd,K Carga de un inmediato
LDS Rd,k Carga directa
LD Rd,X Carga indirecta
LD Rd,X+ Carga indirecta con Post-Incremento
LD Rd,-X Carga indirecta con Pre-Decremento
LD Rd,Y Carga indirecta
LD Rd,Y+ Carga indirecta con Post-Incremento
LD Rd,-Y Carga indirecta con Pre-Decremento
LDD Rd,Y+q Carga indirecta con desplazamiento
LD Rd,Z Carga indirecta con
LD Rd,Z+ Carga indirecta con Post-Incremento
LD Rd,-Z Carga indirecta con Pre-Decremento
LDD Rd,Z+q Carga indirecta con desplazamiento
STS k,Rr Almacena directamente

6
ST X,Rr Almacena indirectamente
ST X+,Rr Almacena indirectamente con Post-Incremento
ST -X,Rr Almacena indirectamente con Pre-Decremento
ST Y,Rr Almacena indirectamente
ST Y+,Rr Almacena indirectamente con Post-Incremento
ST -Y,Rr Almacena indirectamente con Pre-Decremento
ST Y+q,Rr Almacena indirectamente con desplazamiento
ST Z,Rr Almacena indirectamente
ST Z+,Rr Almacena indirectamente con Post-Incremento
ST -Z,Rr Almacena indirectamente con Pre-Decremento
ST Z+q,Rr Almacena indirectamente con desplazamiento
LPM Ninguno Carga memoria de programa
SPM Ninguno Almacena memoria de programa
IN Rd,P Cargar un registro con un I/O
OUT P,Rr Cargar un I/O con un registro
PUSH Rr Cargar registro en la pila
POP Rd Sacar dato de la pila

Instrucciones de Bit y prueba de Bit


Mnemónicos Operandos Descripción
LSL Rd Desplazamiento a la izquierda
LSR Rd Desplazamiento a la derecha
ROL Rd Rotación a la izquierda con acarreo
ROR Rd Rotación a la derecha con acarreo
ASR Rd Desplazamiento aritmético
SWAP Rd Intercambio de nibbles
BSET s Poner a uno la bandera
BCLR s Poner a cero la bandera
SBI P,b Poner a uno el bit de un registro I/O
CBI P,b Poner a cero el bit de un registro I/O
BST Rr,b Guarda en T el bit de un registro
BLD Rd,b Carga T en el bit de un registro
SEC Ninguno Poner a uno la bandera C
CLC Ninguno Poner a cero la bandera C
SEN Ninguno Poner a uno la bandera N
CLN Ninguno Poner a cero la bandera N
SEZ Ninguno Poner a uno la bandera Z
CLZ Ninguno Poner a cero la bandera Z
SEI Ninguno Poner a uno la bandera I
CLI Ninguno Poner a cero la bandera I
SES Ninguno Poner a uno la bandera S
CLN Ninguno Poner a cero la bandera S
SEV Ninguno Poner a uno la bandera V
CLV Ninguno Poner a cero la bandera V
SET Ninguno Poner a uno la bandera T
CLT Ninguno Poner a cero la bandera T
SEH Ninguno Poner a uno la bandera H
CLH Ninguno Poner a cero la bandera H
NOP Ninguno No operación
SLEEP Ninguno Modo Sleep
WDR Ninguno Reiniciar el Watchdog

7
ADC Suma de dos registros con acarreo ADD Suma de dos registros sin acarreo
Sintaxis: ADC Rd, Rr Sintaxis: ADD Rd, Rr

Operación: Rd ← Rd + Rr + C Operación: Rd ← Rd + Rr

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Descripción: Suma dos registros y el contenido de la bandera C; Descripción: Suma dos registros sin considerar la bandera C y
deja el resultado en el registro destino Rd. deja el resultado en el registro destino Rd.

Banderas afectadas: Banderas afectadas:

H: Se activa si hay un acarreo del bit 3, de lo contrario se H: Se activa si hay un acarreo del bit 3, de lo contrario se
borrará. borrará.
V: Se activa si ocurre un desbordamiento del complemento a dos V: Se activa si ocurre un desbordamiento del complemento a dos
como resultado de la operación, de lo contrario se borrará. como resultado de la operación, de lo contrario se borrará.
N: Se activa si el bit MSB del resultado está a uno, de lo N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará. contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará. Z: Se activa si el resultado es $00, de lo contrario se borrará.
C: Se activa si hay acarreo del bit MSB del resultado, de lo C: Se activa si hay acarreo del bit MSB del resultado, de lo
contrario se borrará. contrario se borrará.

Ejemplo: Ejemplo:

ADC r1, r2 ; Suma r1, r2 y C ADD r1, r2 ; Suma r2 a r1 (r1=r1+r2)


; el resultado lo pone en r1 ADD r28, r28 ; Suma r28 a sí mismo (r28=r28+r28)

ADIW Suma un dato inmediato a un registro de AND Función lógica AND entre registros
palabra
Sintaxis: AND Rd, Rr
Sintaxis: ADIW Rd+1:Rd,K
Operación: Rd ← Rd (AND) Rr
Operación: Rd +1: Rd ← Rd+1: Rd + K
Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Operandos:
Operando1: Puede ser uno de los 3 registros de 16 bits. Podemos Descripción: Se realiza el AND lógico entre el contenido del
indicarlo de las siguientes maneras: XH:XL o sólo a XL; YH:YL registro Rd y del registro Rr; deja el resultado en el registro
o sólo a YL; ZH:ZL o sólo es a ZL. También podemos utilizar destino Rd.
R27:R26 o sólo a R26; R29:R28 o sólo a R28; R31:R30 o sólo a
R30. También podemos usar el registro de 16 bits compuesto por Banderas afectadas:
R25:R24 al que también podemos indicar como R24.
V: Se pone a cero.
Operando2: 0≤ K ≤ 63 N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Descripción: Agrega un valor K a un par de registros y deja el Z: Se activa si el resultado es $00, de lo contrario se borrará.
resultado en el par de registros
Ejemplo:
Banderas afectadas:
AND r2, r3 ; AND lógico entre r2 y r3, resultado en r2
S: Se activa sólo si una de las banderas V o N está a uno. LDI r16, 1 ; Poner 0000 0001 en r16
V: Se activa si hay desbordamiento en el complemento a dos de AND r2, r16 ; Aislar el bit 0 en r2
la operación.
N: Se activa si el bit MSB está a uno.
Z: Se activa si el resultado es 0x00.
C: Se activa si hay acarreo del bit MSB.

Ejemplo:

ADIW R25:R24, 1 ; Suma 1 a R24 y en caso de que haya


; acarreo se lo suma a R25

8
ANDI Función lógica AND entre un registro y ASR Desplazamiento aritmético a la derecha
un dato inmediato
Sintaxis: ASR Rd
Sintaxis: AND Rd, K
Operación:
Operación: Rd ← Rd (AND) K
Operandos: 0 ≤ d ≤ 31
Operandos: 0 ≤ d ≤ 31, 0 ≤ K ≤ 255
Descripción: Desplaza todos los bits de Rd una posición hacia la
Descripción: Se realiza el AND lógico entre el contenido del derecha. El bit 7 se mantiene constante. El bit 0 se carga dentro
registro Rd y el valor K; deja el resultado en el registro destino de la bandera C. Esta operación divide entre dos un valor con
Rd. signo sin cambiar su signo. La bandera C puede usarse para
redondear el resultado.
Banderas afectadas:
Banderas afectadas:
V: Se pone a cero.
N: Se activa si el bit MSB del resultado está a uno, de lo S: N ⊕ C, para prueba de signo
contrario se borrará. V: N ⊕ C (para N y C después del desplazamiento)
Z: Se activa si el resultado es $00, de lo contrario se borrará. N: Se pone a uno si el MSB de Rd esta a uno.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
Ejemplo: C: Se activa antes del desplazamiento el LSB de Rd estaba a
uno.
ANDI r17, $0F ; Borrar el nibble alto de r17
ANDI r18, $10 ; Aislar el bit 4 en r18 Ejemplo:
ANDI r19, $AA ; Borrar los bits impares de r19
LDI r16, $10 ; Cargar 16 decimal en r16
ASR r16 ; r16 = r16 / 2
LDI r17, $FC ; Cargar -4 en r17
ASR r17 ; r17 = r17 / 2

BCLR Poner a cero el bit de una bandera BLD Carga en un registro la bandera T
Sintaxis: BCLR s Sintaxis: BLD Rd, b

Operación: SREG(s) ← 0 Operación: Rd(b) ← T

Operandos: 0 ≤ s ≤ 7 Operandos: 0 ≤ d ≤ 31, 0 ≤ b ≤ 7

Descripción: Pone a cero un bit específico del registro de Descripción: Carga la bandera T del registro SREG en el bit b
banderas SREG. del registro Rd.

Banderas afectadas: Banderas afectadas: Ninguna

I: 0 si s = 7; de lo contrario sin cambio Ejemplo:


T: 0 si s = 6; de lo contrario sin cambio
H: 0 si s = 5; de lo contrario sin cambio BST r1, 2 ; Guardar el bit 2 de r1 en la bandera T
S: 0 si s = 4; de lo contrario sin cambio BLD r0, 4 ; Cargar T en el bit 4 de r0
V: 0 si s = 3; de lo contrario sin cambio
N: 0 si s = 2; de lo contrario sin cambio
Z: 0 si s = 1; de lo contrario sin cambio
C: 0 si s = 0; de lo contrario sin cambio

Ejemplo:

BCLR 0 ; Borrar la bandera C


BCLR 7 ; Deshabilitar interrupciones

9
BRBC Brinca si el bit de SREG es cero BRBS Brinca si el bit de SREG está a set (uno)
Sintaxis: BRBC s, k Sintaxis: BRBS s, k

Operación: Si SREG(s) = 0 entonces PC ← PC + k +1 Operación: Si SREG(s) = 1 entonces PC ← PC + k +1


Si SREG(s) = 1 entonces PC ← PC + 1 Si SREG(s) = 0 entonces PC ← PC + 1

Operandos: 0 ≤ s ≤ 7, -64 ≤ k ≤ 63 Operandos: 0 ≤ s ≤ 7, -64 ≤ k ≤ 63

Descripción: Examina un bit del registro SREG y realiza un Descripción: Examina un bit del registro SREG y realiza un
salto relativo en el PC (contador de programa) si el bit está a salto relativo en el PC (contador de programa) si el bit está a uno
cero. La instrucción desvía relativamente al PC en cualquier . La instrucción desvía relativamente al PC en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.

Banderas afectadas: Ninguna Banderas afectadas: Ninguna

Ejemplo: Ejemplo:

CPI r20, 5 ; Comparar r20 con el valor 5 BST r0, 3 ; Carga la bandera T con el bit 3 de r0
BRBC 1, dife ; Salta si la bandera Z es cero BRBS 6, salto ; Salta si el bit T está a uno
... ...
dife: NOP ; Destino de desvío (No hacer nada) salto: NOP ; Destino de desvío (No hacer nada)

BRCC Salta si la bandera C es cero BRCS Salta si la bandera C está a set (uno)
Sintaxis: BRCS k Sintaxis: BRCS k

Operación: Si C = 0 entonces PC ← PC + k + 1 Operación: Si C = 1 entonces PC ← PC + k + 1


Si C = 1 entonces PC ← PC + 1 Si C = 0 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63 Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera C y si es cero desvía Descripción: Examina la bandera C y si está a uno desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 0, k). (Equivalente a la instrucción BRBS 0, k).

Banderas afectadas: Ninguna Banderas afectadas: Ninguna

Ejemplo: Ejemplo:

ADD r22, r23 ; Suma r23 a r22 CPI r26, $56 ; Comparar r26 con $56
BRCC desvío ; Desvía si C está borrado BRCS desvío ; Desvía si C está a uno
... ...
desvío: NOP ; Destino de desvío desvío: NOP ; Destino de desvío

10
BREAK Pausa BREQ Salta si es igual
Sintaxis: BREAK Sintaxis: BREQ k

Operación: Pausa en la depuración Operación: Si Rd = Rr : Z = 1 entonces PC ← PC + k + 1


Si Rd ≠ Rr : Z = 0 entonces PC ← PC + 1
Operandos: Ninguno
Operandos: -64 ≤ k ≤ 63
Descripción: Se utiliza para la depuración y normalmente no se
utiliza en el programa de la aplicación. Cuando la instrucción es Descripción: Examina la bandera Z y ejecuta un salto relativo en
ejecutada el CPU del AVR se pone en modo de inactividad. Esto PC (contador de programa) si Z está a uno. Si la instrucción se
le da al depurador acceso a los recursos internos. ejecuta inmediatamente después de alguna de las instrucciones
CP, CPI, SUB o SUBI, el salto ocurre si el número binario con o
La instrucción no está disponible para todos los modelos de sin signo representado en Rd es igual al número binario con o sin
AVRs. signo representado en Rr. Esta instrucción desvía relativamente a
PC en cualquier dirección (PC - 63 ≤ destino ≤ PC + 64). El
Banderas afectadas: Ninguna parámetro k es el offset de PC y es representado en forma de
complemento a dos. (Equivalente a la instrucción BRBS 1, k).

Banderas afectadas: Ninguna

Ejemplo:

CP r1, r0 ; Comparar registros r1 y r0


BREQ igual ; Salta si Z=0 (los registros son iguales)
...
igual: NOP ; Destino de desvío (No hacer nada)

BRGE Salta si es mayor o igual (con signo) BRHC Salta si la bandera H está a cero
Sintaxis: BRGE k Sintaxis: BRHS k

Operación: Si Rd ≥ Rr : (N ⊕ V = 0) entonces PC ← PC + k + 1 Operación: Si H = 0 entonces PC ← PC + k + 1


Si H = 1 entonces PC ← PC + 1
Si Rd < Rr entonces PC ← PC + 1
Operandos: -64 ≤ k ≤ 63
Operandos: -64 ≤ k ≤ 63
Descripción: Examina la bandera H y si está a cero desvía
Descripción: Examina la bandera S y si está a cero desvía relativamente al PC (contador de programa) en cualquier
relativamente al PC (contador de programa) en cualquier dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el offset de PC y es representado en forma de complemento a dos.
offset de PC y es representado en forma de complemento a dos. (Equivalente a la instrucción BRBS 5, k).
(Equivalente a la instrucción BRBC 0, k). Si la instrucción se
ejecuta inmediatamente después de alguna de las instrucciones Banderas afectadas: Ninguna
CP, CPI, SUB o SUBI, el desvío puede ocurrir si y sólo si el
número binario con o sin signo representado en Rd es mayor o Ejemplo:
igual al número binario con o sin signo representado en Rr.
BRHC desvio ; Desvío si la bandera H está a cero
Banderas afectadas: Ninguna ...
desvio: NOP ; Destino de desvío
Ejemplo:

CP r11, r12 ; Comparar los registros r11 y r12


BRGE desvío ; Desvía si r11 ≥ r12 (con signo)
...
desvío: NOP ; Destino de desvío

11
BRHS Salta si la bandera H está a uno BRID Salta si la bandera I está a cero
Sintaxis: BRHS k Sintaxis: BRID k

Operación: Si H = 1 entonces PC ← PC + k + 1 Operación: Si T = 0 entonces PC ← PC + k + 1


Si H = 0 entonces PC ← PC + 1 Si T = 1 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63 Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera H y si está a uno desvía Descripción: Examina la bandera I; si está a cero desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 5, k). (Equivalente a la instrucción BRBS 7, k).

Banderas afectadas: Ninguna Banderas afectadas: Ninguna

Ejemplo: Ejemplo:

BRHS desvio ; Desvío si la bandera H está a uno BRIE desvio ; Desvía si la bandera I está a cero
... ...
desvio: NOP ; Destino de desvío desvio: NOP ; Destino de desvío

BRIE Salta si la bandera I está a uno BRLO Salta si es menor


Sintaxis: BRIE k Sintaxis: BREQ k

Operación: Si I = 1 entonces PC ← PC + k + 1 Operación: Si Rd < Rr : C = 1 entonces PC ← PC + k + 1


Si I = 0 entonces PC ← PC + 1 Si Rd ≥ Rr : C = 0 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63 Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera I; si está a uno desvía Descripción: Examina la bandera C y si está a uno desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 7, k). (Equivalente a la instrucción BRBC 0, k). Si la instrucción se
ejecuta inmediatamente después de alguna de las instrucciones
Banderas afectadas: Ninguna CP, CPI, SUB o SUBI, el desvío puede ocurrir si y sólo si el
número binario con o sin signo representado en Rd es mayor o
Ejemplo: igual al número binario con o sin signo representado en Rr.

BRIE desvio ; Desvía si la bandera I está a uno Banderas afectadas: Ninguna


...
desvio: NOP ; Destino de desvío Ejemplo:

CP r1, r0 ; Comparar registros r1 y r0


BREQ igual ; Salta si Z=0 (los registros son iguales)
...
igual: NOP ; Destino de desvío (No hacer nada)

12
BRLT Salta si es menor (con signo) BRMI Salta si es negativo
Sintaxis: BRLT k Sintaxis: BRMI k

Operación: Si Rd ≥ Rr : (N ⊕ V = 1) entonces PC ← PC + k + 1 Operación: Si N = 1 entonces PC ← PC + k + 1


Si N = 0 entonces PC ← PC + 1
Si Rd < Rr entonces PC ← PC + 1
Operandos: -64 ≤ k ≤ 63
Operandos: -64 ≤ k ≤ 63
Descripción: Examina la bandera N y si está a uno se desvía
Descripción: Examina la bandera S y si está a uno desvía relativamente al PC (contador de programa en cualquier
relativamente al PC (contador de programa) en cualquier dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el offset de PC y es representado en forma de complemento a dos.
offset de PC y es representado en forma de complemento a dos. (Equivalente a la instrucción BRBS 2, k).
(Equivalente a la instrucción BRBC 0, k). Si la instrucción se
ejecuta inmediatamente después de alguna de las instrucciones Banderas afectadas: Ninguna
CP, CPI, SUB o SUBI, el desvío puede ocurrir si y sólo si el
número binario con o sin signo representado en Rd es mayor o Ejemplo:
igual al número binario con o sin signo representado en Rr.
SUBI r18, 4 ; Restar 4 de r18
Banderas afectadas: Ninguna BRMI desvío ; Desvía si la bandera N=1
...
Ejemplo: desvío: NOP ; Destino de desvío

CP r16, r1 ; Comparar los registros r16 con r1


BRLT desvío ; Desvía si r16 < r1 (con signo)
...
desvío: NOP ; Destino de desvío (No hacer nada)

BRNE Salta si es diferente BRPL Salta si es positivo


Sintaxis: BRNE k Sintaxis: BRPL k

Operación: Si Rd = Rr : Z = 0 entonces PC ← PC + k + 1 Operación: Si N = 0 entonces PC ← PC + k + 1


Si Rd ≠ Rr : Z = 1 entonces PC ← PC + 1 Si N = 1 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63 Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera Z y ejecuta un salto relativo en Descripción: Examina la bandera N y si está a cero se desvía
PC (contador de programa) si Z está a cero. Si la instrucción se relativamente al PC (contador de programa en cualquier
ejecuta inmediatamente después de alguna de las instrucciones dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
CP, CPI, SUB o SUBI, el salto ocurre si el número binario con o offset de PC y es representado en forma de complemento a dos.
sin signo representado en Rd es diferente al número binario con (Equivalente a la instrucción BRBS 2, k).
o sin signo representado en Rr. Esta instrucción desvía
relativamente a PC en cualquier dirección (PC - 63 ≤ destino ≤ Banderas afectadas: Ninguna
PC + 64). El parámetro k es el offset de PC y es representado en
forma de complemento a dos. (Equivalente a la instrucción Ejemplo:
BRBS 1, k).
SUBI r26, $50 ; Restar $50 de r26
Banderas afectadas: Ninguna BRPL desvío ; Desvía si r26 es positivo
...
Ejemplo: desvío: NOP ; Destino de desvío

EOR r27, r27 ; Borrar r27


loop: INC r27 ; Incrementar r27
...
CPI r27,5 ; Comparar r27 con 5
BRNE loop ; Desvío si r27 ≠ 5
NOP ; Salida de Loop

13
BRSH Salta si es mayor o igual (sin signo) BRTC Salta si la bandera T está a cero
Sintaxis: BRSH k Sintaxis: BRTC k

Operación: Si Rd ≥ Rr : C = 0 entonces PC ← PC + k + 1 Operación: Si T = 0 entonces PC ← PC + k + 1


Si Rd < Rr : C = 1 entonces PC ← PC + 1 Si T = 1 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63 Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera C y si está a cero desvía Descripción: Examina la bandera T y si está a cero desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBC 0, k). Si la instrucción se (Equivalente a la instrucción BRBS 5, k).
ejecuta inmediatamente después de alguna de las instrucciones
CP, CPI, SUB o SUBI, el desvío puede ocurrir si y sólo si el Banderas afectadas: Ninguna
número binario con o sin signo representado en Rd es mayor o
igual al número binario con o sin signo representado en Rr. Ejemplo:

Banderas afectadas: Ninguna BST r3, 5 ; cargar el bit 5 de r3 en la bandera T


BRTS desvio ; Desvía si ese bit está a cero
Ejemplo: ...
desvio: NOP ; Destino de desvío
SUBI r19, 4 ; Restar 4 de r19
BRSH desvío ; Desvía si r19 ≥ 4 (sin signo)
...
desvío: NOP ; Destino de desvío

BRTS Salta si la bandera T está a uno BRVC Salta si la bandera V está a cero
Sintaxis: BRTS k Sintaxis: BRTC k

Operación: Si T = 1 entonces PC ← PC + k + 1 Operación: Si V = 1 entonces PC ← PC + k + 1


Si T = 0 entonces PC ← PC + 1 Si V = 0 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63 Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera T y si está a uno desvía Descripción: Examina la bandera V y si está a cero desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 6, k). (Equivalente a la instrucción BRBS 6, k).

Banderas afectadas: Ninguna Banderas afectadas: Ninguna

Ejemplo: Ejemplo:

BST r3, 5 ; cargar el bit 5 de r3 en la bandera T ADD r3, r4 ; Suma el registro r4 a r3


BRTS desvio ; Desvía si ese bit está a uno BRVS desvio ; Desvía si no hay desbordamiento
... ...
desvio: NOP ; Destino de desvío desvio: NOP ; Destino de desvío

14
BRVS Salta si la bandera V está a uno BSET Poner a uno el bit de una bandera
Sintaxis: BRVS k Sintaxis: BSET s

Operación: Si V = 1 entonces PC ← PC + k + 1 Operación: SREG(s) ← 1


Si V = 0 entonces PC ← PC + 1
Operandos: 0 ≤ s ≤ 7
Operandos: -64 ≤ k ≤ 63
Descripción: Pone a uno un bit específico del registro de
Descripción: Examina la bandera V y si está a uno desvía banderas SREG.
relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el Banderas afectadas:
offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 6, k). I: 1 si s = 7; de lo contrario sin cambio
T: 1 si s = 6; de lo contrario sin cambio
Banderas afectadas: Ninguna H: 1 si s = 5; de lo contrario sin cambio
S: 1 si s = 4; de lo contrario sin cambio
Ejemplo: V: 1 si s = 3; de lo contrario sin cambio
N: 1 si s = 2; de lo contrario sin cambio
ADD r3, r4 ; Suma el registro r4 a r3 Z: 1 si s = 1; de lo contrario sin cambio
BRVS desvio ; Desvía si hay desbordamiento C: 1 si s = 0; de lo contrario sin cambio
...
desvio: NOP ; Destino de desvío Ejemplo:

BSET 6 ; Poner a uno la bandera T


BSET 7 ; Interrupción habilitada

BST Guarda en T el bit de un registro CALL llamada larga a subrutina


Sintaxis: BST Rd, b Sintaxis: CALL k

Operación: T ← Rd(b) Operación: PC ← k Dispositivos con PC de 16 bits


PC ← k Dispositivos con PC de 22 bits
Operandos: 0 ≤ d ≤ 31, 0 ≤ b ≤ 7
Operandos: 0 ≤ k ≤ 64K
Descripción: Guarda el bit b del registro Rd en la bandera T del 0 ≤ k ≤ 4M
registro de SREG.
Pila: Stack ← PC + 2 : SP ← SP -2 (2 Bytes)
Banderas afectadas: Stack ← PC + 2 : SP ← SP -3 (3 Bytes)

T: Se pone a uno si el bit b del registro Rd está a uno, de lo Descripción: Llama a una subrutina en cualquier lugar de la
contrario se pone a cero. memoria de programa. La dirección de retorno se almacena en la
pila. El puntero de pila SP es post-decrementado durante la
Ejemplo: instrucción CALL.

BST r1, 2 ; Guardar el bit 2 de r1 en la bandera T Banderas afectadas: Ninguna


BLD r0, 4 ; Cargar T en el bit 4 de r0
Ejemplo:

MOV r16, r0 ; Copiar r0 en r16


CALL check ; Llamado a subrutina
...
check: CPI r16, $42 ; Compara r16 con un valor
; específico
...
BREQ error ; Salta si son iguales
RET ; Retorno de subrutina

error: RJMP error ; Ciclo infinito

15
CBI Poner a cero un bit del registro I/O CBR Pone a cero los bits del registro
Sintaxis: CBI P, b Sintaxis: CBR Rd, K

Operación: (P, b) ← 1 Operación: Rd ← Rd AND ($FF – K)

Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7 Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255

Descripción: Pone a cero un bit específico en un registro de I/O. Descripción: Pone a uno los bits del registro Rd indicados.
Esta operación funciona en los 32 registros de I/O más bajos, y Realiza la operación ORI lógica entre el contenido del registro
en los registros de trabajo de 0 a 31. Rd y una constante K, y deja el resultado en el registro destino
Rd.
Banderas afectadas: Ninguna
Banderas afectadas:
Ejemplo:
V: Se pone a cero.
CBI $12, 7 ; Poner a cero el bit 7 de Port D N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.

Ejemplo:

CBR r16, $F0 ; Borra el nibble alto de r16


CBR r18, 1 ; Borra el bit 0 de r18

CLC Poner a cero la bandera C CLH Poner a cero la bandera H


Sintaxis: CLC Sintaxis: CLH

Operación: C ← 0 Operación: H ← 0

Operandos: Ninguno Operandos: Ninguno

Descripción: Pone a cero la bandera de acarreo C del registro de Descripción: Pone a cero la bandera de medio acarreo H del
estado SREG. registro de estado SREG.

Banderas afectadas: Banderas afectadas:

C: Se pone a cero H: Se pone a cero

Ejemplo: Ejemplo:

ADD r0, r0 ; Sumar r0 a sí mismo CLH ; Borrar la bandera H


CLC ; Borrar la bandera de acarreo

16
CLI Deshabilitar las interrupciones globales CLN Poner a cero la bandera N
Sintaxis: CLI Sintaxis: CLN

Operación: N ← 0 Operación: N ← 0

Operandos: Ninguno Operandos: Ninguno

Descripción: Pone a cero la bandera de habilitación de Descripción: Pone a cero la bandera de resultado negativo N del
interrupciones globales I del registro de estado SREG. registro de estado SREG.

Banderas afectadas: Banderas afectadas:

I: Se pone a cero C: Se pone a cero

Ejemplo: Ejemplo:

CLI ; Interrupciones deshabilitadas ADD r2, r3 ; Sumar r3 a r2


IN r11, $16 ; Leer el Puerto B CLN ; Borrar la bandera N
SEI ; Interrupciones habilitadas

CLR Borra un registro CLS Poner a cero la bandera S


Sintaxis: CLR Rd Sintaxis: CLS

Operación: Rd ← Rd (XOR) Rd Operación: S ← 0

Operandos: 0 ≤ d ≤ 31 Operandos: Ninguno

Descripción: Borra un registro. Esta instrucción realiza una OR Descripción: Pone a cero la bandera de signo S del registro de
exclusiva entre un registro y en sí mismo. Borrará todos los bits estado SREG.
del registro.
Banderas afectadas:
Banderas afectadas:
S: Se pone a cero
V: Se pone a cero.
N: Se pone a cero Ejemplo:
Z: Se pone a uno.
ADD r2, r3 ; Sumar r3 a r2
Ejemplo: CLS ; Borrar la bandera S

CLR r18 ; Borrar r18


loop: INC r18 ; Incrementar r18
...
CPI r18, $50 ; Comparar r18 con $50
BRNE loop

17
CLT Poner a cero la bandera T CLV Poner a cero la bandera V
Sintaxis: CLT Sintaxis: CLV

Operación: T ← 0 Operación: V ← 0

Operandos: Ninguno Operandos: Ninguno

Descripción: Pone a cero la bandera T del registro de estado Descripción: Pone a cero la bandera de desbordamiento V del
SREG. registro de estado SREG.

Banderas afectadas: Banderas afectadas:

T: Se pone a cero V: Se pone a cero

Ejemplo: Ejemplo:

CLT ; Borrar la bandera T ADD r2, r3 ; Sumar r3 a r2


CLV ; Borrar la bandera V

CLZ Poner a cero la bandera Z COM Complemento a uno


Sintaxis: CLZ Sintaxis: COM Rd

Operación: Z ← 0 Operación: Rd ← $FF - Rd

Operandos: Ninguno Operandos: 0 ≤ d ≤ 31

Descripción: Pone a cero la bandera de resultado cero Z del Descripción: Realiza el complemento a uno del registro Rd.
registro de estado SREG.
Banderas afectadas:
Banderas afectadas:
V: Se pone a cero.
Z: Se pone a cero N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Ejemplo: Z: Se activa si el resultado es $00, de lo contrario se borrará.
C: se pone a uno.
ADD r2, r3 ; Suma r3 a r2
CLZ ; Borra la bandera Z Ejemplo:

COM r4 ; Realiza el complemento a uno de r4


BREQ prueba ; brinca si la bandera Z está en uno.
...
prueba: NOP ; Destino de desvío (No hacer nada)

18
CP Compara CPC Compara con acarreo
Sintaxis: CP Rd, Rr Sintaxis: CPC Rd, Rr

Operación: Rd -Rr Operación: Rd –Rr -C

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Descripción: Efectúa una comparación entre dos registros Rd y Descripción: Realiza una comparación entre dos registros Rd y
Rr. Ninguno de los registros es cambiado. Todos los desvíos Rr y también se toma en cuenta el estado de la bandera C previo.
condicionales pueden usarse después de esta instrucción. Ninguno de los registros es cambiado. Todos los desvíos
condicionales pueden usarse después de esta instrucción
Banderas afectadas:
Banderas afectadas:
H: Se activa si hay un acarreo negativo del bit 3, de lo contrario
se borrará. H: Se activa si hay un acarreo negativo del bit 3, de lo contrario
V: Se activa si ocurre un desbordamiento del complemento a dos se borrará.
como resultado de la operación, de lo contrario se borrará. V: Se activa si ocurre un desbordamiento del complemento a dos
N: Se activa si el bit MSB del resultado está a uno, de lo como resultado de la operación, de lo contrario se borrará.
contrario se borrará. N: Se activa si el bit MSB del resultado está a uno, de lo
Z: Se activa si el resultado es $00, de lo contrario se borrará. contrario se borrará.
C: Se activa si el valor absoluto del contenido de Rr es mayor Z: El valor previo permanece sin cambio cuando el resultado es
que el contenido de Rd, de lo contrario se borrará. cero, de lo contrario se borrará.
C Estará a uno si el valor absoluto del contenido de Rr + C, es
Ejemplo: mayor que el contenido de Rd, de lo contrario se borrará.

CP r4, r19 ; Comparar r4 con r19 Ejemplo:


BRNE noteq ; Desvía si la bandera Z está activa.
... ; Comparar r3:r2 con r1:r0
noteq: NOP ; Destino de desvío (No hacer nada) CP r2, r0 ; Compara el byte bajo
CPC r3, r1 ; Compara el byte alto
BRNE noteq ; Desvía si la bandera Z está activa
...
noteq: NOP ; Destino de desvío( no hacer nada)

CPI Compara un registro con dato inmediato CPSE Compara y saltar si es igual
Sintaxis: CPI Rd, K Sintaxis: CPSE Rd, Rr

Operación: Rd -K Operación: Si Rd = Rr entonces PC ← PC + 2 ( o 3)


Si Rd ≠ Rr entonces PC ← PC + 1
Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Descripción: Efectúa una comparación entre el registro Rd y un
dato inmediato. El registro no es cambiado. Todos los desvíos Descripción: Ejecuta una comparación entre dos registros Rd y
condicionales pueden usarse después de esta instrucción. Rr, y si Rd ≠ Rr entonces la siguiente instrucción se ejecuta de lo
contrario la siguiente instrucción es brincada.
Banderas afectadas:
Banderas afectadas: Ninguna
H: Se activa si hay un acarreo negativo del bit 3, de lo contrario
se borrará. Ejemplo:
V: Se activa si ocurre un desbordamiento del complemento a dos
como resultado de la operación, de lo contrario se borrará. INC r4 ; Incrementar r4
N: Se activa si el bit MSB del resultado está a uno, de lo CPSE r4, r0 ; Comparar r4 con r0
contrario se borrará. NEG r4 ; Sólo ejecutar si r4 ≠ r0
Z: Se activa si el resultado es $00, de lo contrario se borrará. NOP ; Continuar (No hacer nada)
C: Se activa si el valor absoluto del contenido de K es mayor que
el contenido de Rd, de lo contrario se borrará.

Ejemplo:

CPI r19,3 ; Comparar r19 con 3


BRNE error ; Desvía si la bandera Z está activa
...
error: NOP ; Destino de desvío (No hacer nada)

19
DEC Decrementar el registro EOR Función lógica OR-exclusiva (⊕) entre
registros
Sintaxis: DEC Rd
Sintaxis: EOR Rd, Rr
Operación: Rd ← Rd -1
Operación: Rd ← Rd ⊕ Rr
Operandos: 0 ≤ d ≤ 31
Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Descripción Se decrementa en uno al contenido del registro Rd y
deja el resultado en Rd. La bandera C de SREG no es afectada
Descripción: Se realiza el XOR lógico entre el contenido del
por la operación. Al funcionar con números sin signo, sólo se
registro Rd y del registro Rr; deja el resultado en el registro
puede esperar que funcionen de forma consistente las
destino Rd.
instrucciones BREQ y BRNE. Al operar con valores en
complemento a dos todas las instrucciones de desvío están
Banderas afectadas:
disponibles.
V: Se pone a cero.
Banderas afectadas:
N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
V: Se activa si ocurre un desbordamiento del complemento a dos
Z: Se activa si el resultado es $00, de lo contrario se borrará.
como resultado de la operación, de lo contrario se borrará. Un
desbordamiento del complemento a dos ocurrirá si y sólo si Rd
Ejemplo:
era $80 antes de la operación.
N: Se activa si el bit MSB del resultado está a uno, de lo
EOR r4, r4 ; Borrar r4
contrario se borrará.
EOR r0, r22 ; OR exclusiva entre r0 y r22
Z: Se activa si el resultado es $00, de lo contrario se borrará.

Ejemplo:

LDI r17, $10 ; Cargar constante en r17


Loop: ADD r1, r2 ; Sumar r2 a r1
DEC r17 ; Decrementar r17
BRNE loop ; Desvío si r17 ≠ 0
NOP ; Continuar (No hacer nada)

ICALL llamada indirecta a subrutina IJMP Salto indirecto


Sintaxis: ICALL Sintaxis: IJMP

Operación: PC (15:0) ← Z (15:0) Operación: PC ← Z(15:0)

Operandos: Ninguno Operandos: Ninguno

Pila: Stack ← PC + 1 : SP ← SP -2 (2 Bytes) Descripción: Efectúa un salto indirecto a una dirección apuntada
por el registro puntero Z. El registro puntero Z es de 16 bits y
Descripción: Realiza una llamada indirecta a una subrutina permite saltos hacia los 64K words (128K bytes) más bajos de la
apuntada por el registro puntero Z. El registro puntero Z es de 16 sección de memoria de programa. La instrucción no está
bit y permite la llamada a subrutina dentro de los 64K words disponible para todos los modelos de AVR’s.
(128K bytes) más bajos de la sección de espacio de memoria de
programa. El SP (puntero de pila) utiliza durante el ICALL un Banderas afectadas: Ninguna
esquema de post-decremento.
Ejemplo:
Banderas afectadas: Ninguna
MOV r30, r0 ; Poner offset a la tabla de salto
Ejemplo: IJMP ; Saltar a la rutina apuntada por r31:r30

MOV r30, r0 ; Poner offset a la tabla de llamada


ICALL ; Rutina de llamada que apunta a r31:r30

20
IN Cargar un registro de trabajo con I/O INC Incrementar el registro
Sintaxis: IN Rd, P Sintaxis: INC Rd

Operación: Rd ← P Operación: Rd ← Rd +1

Operandos: 0 ≤ d ≤ 31, 0 ≤ P ≤ 63 Operandos: 0 ≤ d ≤ 31

Descripción: Carga un dato proveniente del bloque de registros Descripción Se incrementa en uno al contenido del registro Rd y
I/O (Puertos, Timers, registros de configuración, etc.) en el deja el resultado en el registro Rd. La bandera C de SREG no es
registro de trabajo Rd. afectada por la operación. Al funcionar con números sin signo,
sólo se puede esperar que funcionen de forma consistente las
Banderas afectadas: Ninguna instrucciones BREQ y BRNE. Al operar con valores en
complemento a dos todas las instrucciones de desvío están
Ejemplo: disponibles.

IN r25, $16 ; Carga en r25 el ;dato Banderas afectadas:


;contenido en Puerto B
CPI r25,4 ; Comparar el valor de r25 con V: Se activa si ocurre un desbordamiento del complemento a dos
; un dato inmediato como resultado de la operación, de lo contrario se borrará. Un
BREQ exit ; Desvía si r25 = 4 desbordamiento del complemento a dos ocurrirá si y sólo si Rd
... era $7F antes de la operación.
exit: NOP ; Destino de desvío N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.

Ejemplo:

CLR r22 ; Borrar r22


loop: INC r22 ; Incrementar r22
...
CPI r22, $4F ; Comparar r22 con $4f
BRNE loop ; Desvío si no son iguales
NOP ; Continuar (No hacer nada)

JMP Salto LDI Carga de un dato inmediato


Sintaxis: JMP k Sintaxis: LDI Rd, K

Operación: PC ← k Operación: Rd ← K

Operandos: 0 ≤ k ≤ 4M Operandos: 16 ≤ Rd ≤ 31, 0 ≤ K ≤ 255

Descripción: Ejecuta un salto a cualquier posición de la Descripción: Carga un dato inmediato de 8-bits en cualquiera de
memoria de programa. La instrucción no es disponible para todos los registros de trabajo a partir de R16 hasta R31.
los modelos de AVRs.
Banderas afectadas: Ninguna
Banderas afectadas: Ninguna
Ejemplo:
Ejemplo:
CLR r31 ; Borra el byte alto de Z
MOV r1, r0 ; Copia r0 en r1 LDI r30, $F0 ; Pone el byte bajo de Z a $F0
JMP lejos ; Salto incondicional LPM ; Carga una constante de la memoria
… ; de programa apuntada por Z
lejos: nop ; Destino de salto

21
LD Carga indirecta usando X
El resultado de estas combinaciones es indefinido:
Sintaxis: LD Rd, X
LD Rd, X+ LD r26, X+
LD Rd, -X
LD r27, X+
Operación: Rd ← (X) X: Sin cambios
Rd ← (X), X ← X+1 X: Con post-incremento LD r26, -X
X ← X–1, Rd ← (X) X: Con pre-decremento
LD r27, -X
Operandos: 0 ≤ d ≤ 31
Algunas variantes de esta instrucción no son disponibles para
Descripción Se carga un byte de manera indirecta procedente del todos los modelos de AVR’s.
área de datos hacia un registro de trabajo. Para los dispositivos
con SRAM, el área de datos se compone de los registros de: Banderas afectadas: Ninguna
trabajo, I/O y SRAM interna (y SRAM externa si es aplicable).
Para los dispositivos sin SRAM, el espacio de datos se compone Ejemplo:
sólo por los registros de trabajo. La EEPROM tiene un espacio
de dirección separado. CLR r27 ; Borra el byte alto de X
LDI r26, $60 ; Pone el byte bajo de X a $60
La dirección de los datos es apuntado por el registro puntero X LD r0, X+ ; Carga en r0 el dato de la localidad $60
(16 bits). Se limita el acceso de memoria al segmento de datos de ;(X post-incrementado)
64K bytes. Para acceder a otro segmento de datos en dispositivos LD r1, X ; Carga en r1 el dato contenido en la
con más de 64K bytes de datos de espacio, el registro I/O ; localidad $61
RAMPX tiene que ser correctamente configurado. LDI r26, $63 ; Pone el byte bajo de X a $63
LD r2, X ; Carga en r2 el dato de la localidad $63
El registro puntero X puede permanecer sin cambios por la LD r3, -X ; Cargar en r3 el dato de la localidad $62
operación, puede post-incrementarse o pre-decrementarse. Estas ;(X pre-decremento)
características son apropiadas para acceder a matrices, tablas y
uso del puntero de pila con el registro puntero X. Sólo el byte
bajo del puntero X se ocupa para dispositivos sin más de 256
bytes de espacio de datos. Para tales dispositivos, el byte alto del
puntero no es usado por esta instrucción y puede usarse para
otros propósitos.

LD (LDD) Carga indirecta usando Y


El resultado de estas combinaciones es indefinido:
Sintaxis: LD Rd, Y
LD Rd, Y+ LD r28, Y+
LD Rd, -Y
LDD Rd, Y+q LD r29, Y+

Operación: Rd ← (Y) Y: Sin cambios LD r28, -Y


Rd ← (Y), Y ← Y+1 Y: Con post-incremento
Y ← Y–1, Rd ← (Y) Y: Con pre-decremento LD r29, -Y
Rd ← (Y+q) Y: Sin cambios,
q: Desplazamiento Algunas variantes de esta instrucción no son disponibles para
Operandos: 0 ≤ d ≤ 31, 0 ≤ q ≤ 63 todos los modelos de AVR’s.

Descripción Se carga un byte de manera indirecta procedente del Banderas afectadas: Ninguna
área de datos hacia un registro de trabajo. Para los dispositivos
con SRAM, el área de datos se compone de los registros de: Ejemplo:
trabajo, I/O y SRAM interna (y SRAM externa si es aplicable).
Para los dispositivos sin SRAM, el espacio de datos se compone CLR r29 ; Borra el byte alto de Y
sólo por los registros de trabajo. La EEPROM tiene un espacio LDI r28, $60 ; Pone el byte bajo de Y a $60
de dirección separado. LD r0, Y+ ; Carga en r0 el dato de la localidad $60
; (Y post-incrementado)
La dirección de los datos es apuntado por el registro puntero Y LD r1, Y ; Carga en r1 el dato de la localidad $61
(16 bits). Se limita el acceso de memoria al segmento de datos de LDI r28, $63 ; Pone el byte bajo de Y a $63
64K bytes. Para acceder a otro segmento de datos en dispositivos LD r2, Y ; Carga en r0 el dato de la localidad $63
con más de 64K bytes de datos de espacio, el registro I/O LD r3,-Y ; Carga en r0 el dato de la localidad $62
RAMPY tiene que ser correctamente configurado. ; (Y pre-decrementado)
LDD r4, Y+2 ; Carga en r4 el dato de la localidad $64
El registro puntero Y puede permanecer sin cambios por la
operación, puede post-incrementarse o pre-decrementarse. Estas
características son apropiadas para acceder a matrices, tablas y
uso del puntero de pila con el registro puntero Y. Sólo el byte
bajo del puntero Y se ocupa para dispositivos sin más de 256
bytes de espacio de datos. Para tales dispositivos, el byte alto del
puntero no es usado por esta instrucción y puede usarse para
otros propósitos.

22
LD (LDD) Carga indirecta usando Z
Sólo el byte bajo del puntero Z se ocupa para dispositivos sin
Sintaxis: LD Rd, Z más de 256 bytes de espacio de datos. Para tales dispositivos, el
LD Rd, Z+ byte alto del puntero no es usado por esta instrucción y puede
LD Rd, -Z usarse para otros propósitos.
LDD Rd, Z+q
El resultado de estas combinaciones es indefinido:
Operación: Rd ← (Z) Z: Sin cambios
Rd ← (Z), Z ← Z+1 Z: Con post-incremento LD r30, Z+
Z ← Z – 1, Rd ← (Z) Z: Con pre-decremento
Rd ← (Z+q) Z: Sin cambios, LD r31, Z+
q: Desplazamiento
Operandos: 0 ≤ d ≤ 31, 0 ≤ q ≤ 63 LD r30, -Z

Descripción Se carga un byte de manera indirecta procedente del LD r31, -Z


área de datos hacia un registro de trabajo. Para los dispositivos
con SRAM, el área de datos se compone de los registros de: Algunas variantes de esta instrucción no son disponibles para
trabajo, I/O y SRAM interna (y SRAM externa si es aplicable). todos los modelos de AVR’s.
Para los dispositivos sin SRAM, el espacio de datos se compone
sólo por los registros de trabajo. La EEPROM tiene un espacio Banderas afectadas: Ninguna
de dirección separado.
Ejemplo:
La dirección de los datos es apuntado por el registro puntero Z
(16 bits). Se limita el acceso de memoria al segmento de datos de CLR r31 ; Borra el byte alto de Z
64K bytes. Para acceder a otro segmento de datos en dispositivos LDI r30, $60 ; Pone el byte bajo de Z a $60
con más de 64K bytes de datos de espacio, el registro I/O LD r0, Z+ ; Carga en r0 el dato de la localidad $60
RAMPX tiene que ser correctamente configurado. ; (Z post-incrementado)
LD r1, Z ; Carga en r1 el dato de la localidad $61
El registro puntero Z puede permanecer sin cambios por la LDI r30, $63 ; Pone el byte bajo de Z a $63
operación, puede post-incrementarse o pre-decrementarse. Estas LD r2, Z ; Carga en r0 el dato de la localidad $63
características son apropiadas para acceder a matrices, tablas y LD r3,-Z ; Carga en r0 el dato de la localidad $62
uso del puntero de pila; Sin embargo, debido a que este puntero ; (Z pre-decrementado)
puede usarse para las llamadas indirectas a subrutinas y los saltos LDD r4, Z+2 ; Carga en r4 el dato de la localidad $64
indirectos, es mejor usar a los punteros X o Y para direccionar al
puntero de pila.
.

LDS Carga directa desde SRAM LPM Carga memoria de programa


Sintaxis: LDS Rd, k Sintaxis: LPM
LPM Rd, Z
Operación: Rd ← (k) LPM Rd, Z+

Operandos: 0 ≤ d ≤ 31, 0 ≤ k ≤ 65535 Operación: R0 ← (Z) Z: Sin cambio, R0 implícito


Rd ← (Z) Z: Sin cambio
Descripción: Carga un byte del espacio de memoria de datos a Rd ← (Z), Z ← Z + 1 Z: Post-incrementado
un registro de trabajo. Para los dispositivos con SRAM, el
espacio de datos está compuesto por los registros de trabajo, Operandos: 0 ≤ d ≤ 31
memoria de I/O y SRAM interna (y SRAM externa si es
aplicable). Para los dispositivos sin SRAM, el espacio de datos Descripción: Se carga un byte apuntado por el registro Z en el
está compuesto sólo por los registros de trabajo. La EEPROM registro R0. La memoria de programa está organizada en palabra
tiene un espacio de direcciones separado. Debe proporcionarse (word) de 16-bits; el bit menos significativo del puntero Z
una dirección de 16-bit. Se limita el acceso de memoria al selecciona el byte bajo (0) o el byte alto (1). Esta instrucción
segmento de datos de 64K bytes. Para acceder a otro segmento puede dirigirse a los primeros 64K bytes (32K words) de
de datos en dispositivos con más de 64K bytes de datos de memoria de programa. El registro puntero Z queda inalterado por
espacio, el registro I/O RAMPD tiene que ser correctamente el funcionamiento.
configurado.
Banderas afectadas: Ninguna
Banderas afectadas: Ninguna
Esta instrucción no es disponible para todos los modelos de
Esta instrucción no es disponible para todos los modelos de AVR’s.
AVR’s.
Ejemplo:
Ejemplo:
CLR r31 ; Borrar el byte alto de Z
LDS r2, $FF00 ; Carga r2 con el contenido de la localidad LDI r30, $F0 ; Poner a cero el byte bajo de Z
; $FF00 de la memoria de datos LPM ; Cargar la constante de la
ADD r2, r1 ; Sumar r1 a r2 ;memoria de programa
STS $FF00, r2 ; Escribir en SRAM el contenido de r2 ;apuntada por Z (r31:r30)

23
LSL Desplazamiento a la izquierda LSR Desplazamiento a la derecha
Sintaxis: LSL Rd Sintaxis: LSR Rd

Operación: Operación:

Operandos: 0 ≤ d ≤ 31 Operandos: 0 ≤ d ≤ 31

Descripción: Desplaza todos los bits de Rd una posición hacia la Descripción: Desplaza todos los bits de Rd una posición hacia la
izquierda. El bit 7 se carga en la bandera C de SREG. derecha. En el bit 7 se carga un cero, en la bandera C se carga el
Prácticamente esta operación multiplica por dos al contenido de LSB de Rd. Prácticamente esta operación divide entre dos al
Rd. contenido de Rd.

Banderas afectadas: Banderas afectadas:

H: Se activa si hay un acarreo del bit 3, de lo contrario se S: N ⊕ C, para prueba de signo


borrará. V: N ⊕ C (para N y C después del desplazamiento)
S: N ⊕ C, para prueba de signo N: Se pone a cero
V: N ⊕ C (para N y C después del desplazamiento) Z: Se activa si el resultado es $00, de lo contrario se borrará.
N: Se activa si el bit MSB del resultado está a uno, de lo C: Se activa si el LSB de Rd antes del desplazamiento estaba a
contrario se borrará. uno.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
C: Se activa si antes del desplazamiento el MSB del Rd está a Ejemplo:
uno, de lo contrario se borrará.
ADD r0, r4 ; Sumar r4 a r0
Ejemplo: LSR r0 ; Dividir a r0 entre 2

ADD r0, r4 ; Sumar r4 a r0


LSL r0 ; Multiplicar r0 por 2

MOV Copia de registros MOVW Copia de registros de palabra


Sintaxis: MOV Rd, Rr Sintaxis: MOVW Rd + 1: Rd, Rr + 1: Rr

Operación: Rd ← Rr Operación: Rd + 1: Rd ← Rr + 1: Rr

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 Operandos: d Є {0,2,…,30} r Є {0,2,…,30}

Descripción: Efectúa una copia de un registro en otro registro. Descripción: Efectúa una copia de un par de registros en otro par
El registro fuente Rr permanece sin cambiar, mientras el registro de registros. Los registros fuente Rr permanecen sin cambiar,
destino Rd es cargado con una copia de Rr. mientras los registros destino Rd son cargados con una copia de
Rr.
Banderas afectadas: Ninguna
Banderas afectadas: Ninguna
Ejemplo:
Esta instrucción no es disponible para todos los modelos de
MOV r16,r0 ; Copiar r0 en r16 AVR’s.
CALL check ; Llamada a subrutina
... Ejemplo:
check: CPI r16,$11 ; Comparar r16 con $11
... MOVW r17:r16,r1:r0 ; Copiar r1:r0 en r17:r16
RET ; Retorno de subrutina CALL check ; Llamada a subrutina
...
check: CPI r16, $11 ; Comparar r16 con $11
...
RET ; Retorno de subrutina

24
MUL Multiplicación sin signo MULS Multiplicación con signo
Sintaxis: MUL Rd, Rr Sintaxis: MULS Rd, Rr

Operación: R1:R0 ← Rd x Rr Operación: R1:R0 ← Rd x Rr

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 Operandos: 16 ≤ d ≤ 31, 0 ≤ r ≤ 16

Descripción: El multiplicando Rd y el multiplicador Rr son Descripción: El multiplicando Rd y el multiplicador Rr son


registros con números sin signo. El resultado sin signo es de 16- registros con números signados. El resultado con signo es de 16-
bit y se coloca la parte más significativa del resultado en registro bit y se coloca la parte más significativa del resultado en registro
R1 y la menos significativa en R0. Si el multiplicando y el R1 y la menos significativa en R0.
multiplicador son R1 y R0 el resultado se sobrescribirá en ellos.

Banderas afectadas:
Banderas afectadas:
C: Se pone a uno si el bit 15 del resultado está a uno.
C: Se pone a uno si el bit 15 del resultado está a uno. Z: Se pone a uno si el resultado es cero.
Z: Se pone a uno si el resultado es cero.
Esta instrucción no es disponible para todos los modelos de
Esta instrucción no es disponible para todos los modelos de AVR’s.
AVR’s.
Ejemplo:
Ejemplo:
MUL r21 r20 ; Multiplica R21 con R20
MUL r5, r4 ; Multiplica R5 con R4 MOVW r20, r0 ; Copia el resultado en R21: R20
MOVW r4, r0 ; Copia el resultado en R5: R4

NEG Complemento a dos NOP No operación


Sintaxis: NEG Rd Sintaxis: NOP

Operación: Rd ← $00 - Rd Operación: Ninguna

Operandos: 0 ≤ d ≤ 31 Operandos: Ninguno

Descripción: Cambia el contenido del registro Rd con su Descripción: Consume un ciclo sin realizar operaciones.
complemento a dos; el valor $80 se deja sin cambiar.
Banderas afectadas: Ninguna
Banderas afectadas:
Ejemplo:
H: Se activa si había un acarreo negativo (Borrow) del bit 3, de
lo contrario se borrará (cero). CLR r16 ; Borrar r16
V: Se activa si ocurre un desbordamiento del complemento a dos SER r17 ; Poner a uno r17
de la resta implícita de cero, de lo contrario se borrará. Un OUT $18, r16 ; Escribir ceros en el Puerto B
desbordamiento del complemento a dos ocurrirá si y sólo si el NOP ; Esperar (No hacer nada)
contenido del registro después de la operación es $80. OUT $18, r17 ; Escribir unos en el Puerto B
N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
C: Se activa si hay un acarreo negativo (borrow) en la resta
implícita de cero, de lo contrario se borrará. La bandera C se
activa en todos los casos excepto cuando el contenido del
registro después de la operación es $00.

Ejemplo:

SUB r11, r0 ; Restar r0 de r11


BRPL prueba ; Desvío si la bandera N está a cero.
NEG r11 ; Realizar el complemento a dos de r11
prueba: NOP ; Destino de desvío (No hacer nada)

25
OR Función lógica OR entre registros ORI Función lógica OR entre un registro y un
dato inmediato
Sintaxis: OR Rd, Rr
Sintaxis: ORI Rd, K
Operación: Rd ← Rd (OR) Rr
Operación: Rd ← Rd (OR) K
Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Operandos: 0 ≤ d ≤ 31, 0 ≤ K ≤ 255
Descripción: Se realiza el OR lógico entre el contenido del
registro Rd y del registro Rr; deja el resultado en el registro Descripción: Se realiza el OR lógico entre el contenido del
destino Rd. registro Rd y el valor K; deja el resultado en el registro destino
Rd.
Banderas afectadas:
Banderas afectadas:
V: Se pone a cero.
N: Se activa si el bit MSB del resultado está a uno, de lo V: Se pone a cero.
contrario se borrará. N: Se activa si el bit MSB del resultado está a uno, de lo
Z: Se activa si el resultado es $00, de lo contrario se borrará. contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
Ejemplo:
Ejemplo:
OR r15, r16 ; Hacer OR lógico entre registros
BST r15, 6 ; Almacena el bit 6 de r15 en el flag T ORI r16, $F0 ; Poner a uno el nibble alto de r16
BRTS ok ; Desvío si el flag T está a uno ORI r17, 1 ; Poner a uno el bit 0 de r17
...
ok: NOP ; Destino de desvío (No hacer nada)

OUT Cargar en I/O un registro de trabajo POP Sacar registro de la pila


Sintaxis: OUT P, Rr Sintaxis: POP Rr

Operación: P ← Rr Operación: Rr ← STACK

Operandos: 0 ≤ r ≤ 31, 0 ≤ P ≤ 63 Operandos: 0 ≤ r ≤ 31

Descripción: Carga en un registro del bloque I/O el contenido de Descripción: Carga el registro Rd con un byte de la pila. El
un registro trabajo. puntero de pila es incrementado en uno antes del POP

Banderas afectadas: Ninguna Banderas afectadas: Ninguna

Ejemplo: Esta instrucción no es disponible para todos los modelos de


AVR’s.
CLR r16 ; Borrar r16
SER r17 ; Poner a unos r17 Ejemplo:
OUT $18, r16 ; Escribir ceros en el Puerto B
NOP ; Esperar (No hacer nada) CALL routine ; Llamar a subrutina
OUT $18, r17 ; Escribir unos en el Puerto B ...
routine: PUSH r14 ; Guardar r14 en la pila
PUSH r13 ; Guardar r13 en la pila
...
POP r13 ; Restaurar r13
POP r14 ; Restaurar r14
RET ; Retorno de subrutina

26
PUSH Guardar registro en la pila RCALL llamada relativa a subrutina
Sintaxis: PUSH Rr Sintaxis: RCALL k

Operación: STACK ← Rr Operación: PC ← PC + k + 1

Operandos: 0 ≤ r ≤ 31 Operandos: -2K ≤ k ≤ 2K

Descripción: Guarda el contenido del registro Rr en la pila. El Pila: Stack ← PC + 1 : SP ← SP -2 (2 Bytes)


puntero de pila es post-decrementado en uno después del PUSH
Descripción: Realiza una llamada relativa a una dirección que se
Banderas afectadas: Ninguna encuentra dentro de PC - 2K + 1 y PC +2K (words, palabra). En
ensamblador, se usan etiquetas en lugar de operadores relativos.
Esta instrucción no es disponible para todos los modelos de Para los microcontroladores AVR con memoria de programa que
AVR’s. no excede 4K words (8K bytes) esta instrucción puede
direccionar a toda la memoria desde cualquier posición. El SP
Ejemplo: (puntero de pila) utiliza durante el RCALL un esquema de post-
decremento.
CALL routine ; Llamar a subrutina
... Banderas afectadas: Ninguna
routine: PUSH r14 ; Guardar r14 en la pila
PUSH r13 ; Guardar r13 en la pila Ejemplo:
...
POP r13 ; Restaurar r13 RCALL routine ; Llamada a subrutina
POP r14 ; Restaurar r14 ...
RET ; Retorno de subrutina routine: PUSH r14 ; Guardar r14 en la pila
...
POP r14 ; Restaurar r14
RET ; Retorno de subrutina

RET Retorno de subrutina RETI Retorno de interrupción


Sintaxis: RET Sintaxis: RETI

Operación: PC ← Stack Operación: PC ← Stack

Operandos: Ninguno Operandos: Ninguno

Pila: SP ← SP + 2 (bytes) Pila: SP ← SP + 2 (bytes)

Descripción: Efectúa un retorno de subrutina. La dirección de Descripción: Realiza un retorno de una interrupción. La
retorno es cargada de la pila. El SP (puntero de pila) utiliza dirección de retorno es cargada desde la pila; la bandera I de
durante el RET un esquema de post-incremento. SREG (interrupción global) se pone a uno. El registro de estado
no se guarda automáticamente al entrar en una rutina de
Banderas afectadas: Ninguna interrupción, y no se restaura al volver de la rutina interrupción.
De ser necesario el programa debe incluir una rutina para
Ejemplo: manejar adecuadamente esta situación. El puntero de pila usa un
esquema de pre-incremento durante el RETI.
CALL routine ; Llamada a subrutina
... Banderas afectadas:
routine: PUSH r14 ; Guardar r14 en la pila
... I: Se pone a uno.
POP r14 ; Restaurar r14
RET ; Retorno de subrutina Ejemplo:
...

extint: PUSH r0 ; Guardar r0 en la pila


...
POP r0 ; Restaurar r0
RETI ; Retorno y habilitación de interrupciones

27
RJMP Salto relativo ROL Desplazamiento a la izquierdo con acarreo
Sintaxis: RJMP k Sintaxis: ROL Rd

Operación: PC ← PC + k + 1 Operación:

Operandos: -2K ≤ k ≤ 2K Operandos: 0 ≤ d ≤ 31

Descripción: Ejecuta un salto relativo a una dirección que se Descripción: Desplaza todos los bits de Rd una posición hacia la
encuentra dentro de PC - 2K + 1 y PC +2K. En ensamblador, se izquierda. La bandera C se desplaza al bit 0 de Rd. El bit 7 se
usan etiquetas en lugar de operadores relativos. Para los desplaza hacia la bandera C. Esta operación combinada con LSL,
microcontroladores AVR con memoria de programa que no multiplica por dos a valores multi-byte con o sin signo.
excede 4K words (8K bytes) esta instrucción puede dirigirse a
toda la memoria desde cualquier posición de dirección. Banderas afectadas:

Banderas afectadas: Ninguna H: Se activa si hay un acarreo del bit 3, de lo contrario se


borrará.
Ejemplo: S: N ⊕ C, para prueba de signo
V: N ⊕ C (para N y C después del desplazamiento)
CPI r16, $42 ; Compara r16 con $42 N: Se activa si el bit MSB del resultado está a uno, de lo
BRNE error ; Desvío si r16 ≠ $42 contrario se borrará.
RJMP ok ; Salto incondicional Z: Se activa si el resultado es $00, de lo contrario se borrará.
error: ADD r16, r17 ; Suma r17 a r16 C: Se activa si antes del desplazamiento el MSB del Rd está a
INC r16 ; Incrementa r16 uno, de lo contrario se borrará.
ok: NOP ; Destino de RJMP
Ejemplo:

LSL r18 ; Multiplica r19:r18 por dos


ROL r19 ; r19:r18 es un entero de dos
;bytes -con o sin signo-
BRCS oneenc ; Desvía si C está a uno
...
oneenc: NOP ; Destino de desvío

ROR Desplazamiento a la derecha con acarreo SBC Resta de dos registros con acarreo
Sintaxis: ROR Rd Sintaxis: SBC Rd, Rr
Operación: Operación: Rd ← Rd – Rr - C
Operandos: 0 ≤ d ≤ 31 Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Descripción: Desplaza todos los bits de Rd una posición hacia la Descripción: Resta dos registros y resta la bandera C; deja el
derecha. La bandera C se desplaza al bit 7 de Rd. El bit 0 se resultado en el registro Rd.
desplaza hacia la bandera C. Esta operación combinada con LSR
divide entre dos a valores multi-byte con o sin signo. Banderas afectadas:
Banderas afectadas: H: Se activa si había un acarreo negativo (Borrow) del bit 3, de
lo contrario se borrará (cero).
S: N ⊕ C, para prueba de signo V: Se activa si ocurre un desbordamiento del complemento a dos
V: N ⊕ C (para N y C después del desplazamiento) como resultado de la operación, de lo contrario se borrará.
N: Se pone a uno si el MSB de Rd esta a uno. N: Se activa si el bit MSB del resultado está a uno, de lo
Z: Se activa si el resultado es $00, de lo contrario se borrará. contrario se borrará.
C: Se activa antes del desplazamiento el LSB de Rd estaba a Z: El estado anterior permanece sin cambio cuando el resultado
uno. es cero, de lo contrario se borrará.
C: Se activa si el valor absoluto del contenido de Rr + el acarreo
Ejemplo: previo es mayor que el valor absoluto de Rd, de lo contrario se
borrará.
ADD r0, r4 ; Sumar r4 a r0
LSL r0 ; Multiplicar r0 por 2 Ejemplo:

; Restar r1:r0 de r3:r2


SUB r2, r0 ; Restar el byte bajo
SBC r3, r1 ; Restar con acarreo el byte alto

28
SBCI Resta a un registro una constante y el SBI Poner a uno un bit del registro I/O
acarreo
Sintaxis: SBI P, b
Sintaxis: ADD Rd, Rr
Operación: (P, b) ← 1
Operación: Rd ← Rd –K - C
Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7
Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Descripción: Pone a uno un bit específico de un registro del
Descripción: Resta una constante con un registro y con la bloque I/O. Esta operación funciona en los 32 registros de I/O
bandera C; deja el resultado en el registro destino Rd. más bajos. Direcciones de $00 a $1F.
.
Banderas afectadas: Banderas afectadas: Ninguna

H: Se activa si había un acarreo negativo (Borrow) del bit 3, de Ejemplo:


lo contrario se borrará (cero).
V: Se activa si ocurre un desbordamiento del complemento a dos OUT $1E, r0 ; Escribir la dirección de EEPROM
como resultado de la operación, de lo contrario se borrará. SBI $1C, 0 ; Poner a uno el bit 0 de EECR
N: Se activa si el bit MSB del resultado está a uno, de lo IN r1, $1D ; Leer datos de EEPROM
contrario se borrará.
Z: El estado anterior permanece sin cambio cuando el resultado
es cero, de lo contrario se borrará.
C: Se activa si el valor absoluto del contenido de Rr + el acarreo
previo es mayor que el valor absoluto de Rd, de lo contrario se
borrará.

Ejemplo:
; Resta $4F23 de r17:r16
SUBI r16, $23 ; Restar el byte bajo
SBCI r17, $4F ; Restar con acarreo el byte alto

SBIC Salta si el bit del registro I/O es cero SBIS Salta si el bit del registro I/O es uno
Sintaxis: SBCI P, b Sintaxis: SBIS P, b

Operación: Si I/O(P,b) = 0 entonces PC ← PC + 2 ( o 3) Operación: Si I/O(P,b) = 1 entonces PC ← PC + 2 ( o 3)


Si I/O(P,b) ≠ 0 entonces PC ← PC + 1 Si I/O(P,b) ≠ 1 entonces PC ← PC + 1

Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7 Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7

Descripción: Examina un bit del registro de I/O seleccionado y Descripción: Examina un bit del registro de I/O seleccionado y
salta la siguiente instrucción si el bit está en cero. Está operación salta la siguiente instrucción si el bit está en uno. Está operación
funciona en los 32 registros de I/O más bajos, direcciones 0-31). funciona en los 32 registros de I/O más bajos, direcciones 0-31).

Banderas afectadas: Ninguna Banderas afectadas: Ninguna

Ejemplo: Ejemplo:

espera: SBIC $1C, 1 ; Saltar próxima instrucción si espera: SBIS $10, 0 ; Saltar la siguiente instrucción
; EEWE* está borrado ; si el bit 0 en el Puerto D está a uno
RJMP espera ; Escritura de EEPROM no RJMP espera ; Bit 0 borrado
; terminada NOP ; Continuar (No hacer nada)
NOP ; Continuar (No hacer nada)

* EEWE es el bit 1 del registro EECR (Registro de Control de la


memoria EEprom) mapaeado en la localidad $1C de la memoria
RAM.

29
SBIW Resta un dato inmediato a un registro de SBR Pone a uno los bits del registro
palabra
Sintaxis: SBR Rd, K
Sintaxis: SBIW Rd+1:Rd,K
Operación: Rd ← Rd v K
Operación: Rd +1: Rd ← Rd+1 : Rd - K
Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Operandos:
Operando1: Puede ser uno de los 3 registros de 16 bits. Podemos Descripción: Pone a uno los bits del registro Rd indicados.
indicarlo de las siguientes maneras: XH:XL o sólo a XL; YH:YL Realiza la operación ORI lógica entre el contenido del registro
o sólo a YL; ZH:ZL o sólo es a ZL. También podemos utilizar Rd y una constante K, y deja el resultado en el registro destino
R27:R26 o sólo a R26; R29:R28 o sólo a R28; R31:R30 o sólo a Rd.
R30. También podemos usar el registro de 16 bits compuesto por
R25:R24 al que también podemos indicar como R24. Banderas afectadas:

Operando2: 0≤ K ≤ 63 V: Se pone a cero.


N: Se activa si el bit MSB del resultado está a uno, de lo
Descripción: SBIW resta un valor K a un par de registros y deja contrario se borrará.
el resultado en el par de registros Z: Se activa si el resultado es $00, de lo contrario se borrará.

Banderas afectadas: Ejemplo:

S: Se activa sólo si una de las banderas V o N está a uno. SBR r16, 3 ; Poner a uno los bits 0 y 1 de r16
V: Se activa si ocurre un desbordamiento del complemento a dos SBR r17, $F0 ; Poner a uno los 4 MSB en r17
como resultado de la operación, de lo contrario se borrará.
N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Z: Se activa si el resultado es $0000, de lo contrario se borrará.
C: Se activa si el valor absoluto de K es mayor que el valor
absoluto de Rd, de lo contrario se borrará.

Ejemplo:

SBIW r24, 1 ; Restar 1 de r25:r24


SBIW r28, 63 ; Restar 63 del puntero Y (r29:r28)

SBRC Salta si el bit del registro es cero SBRS Salta si el bit del registro es uno
Sintaxis: SBRC Rr, b Sintaxis: SBRC Rr, b

Operación: Si Rr(b) = 0 entonces PC ← PC + 2 ( o 3) Operación: Si Rr(b) = 1 entonces PC ← PC + 2 ( o 3)


Si Rr(b) ≠ 0 entonces PC ← PC + 1 Si Rr(b) ≠ 1 entonces PC ← PC + 1

Operandos: 0 ≤ r ≤ 31, 0 ≤ b ≤ 7 Operandos: 0 ≤ r ≤ 31, 0 ≤ b ≤ 7

Descripción: Examina un bit del registro seleccionado y salta la Descripción: Examina un bit del registro seleccionado y salta la
siguiente instrucción si el bit está borrado (cero). siguiente instrucción si el bit está a uno.

Banderas afectadas: Ninguna Banderas afectadas: Ninguna

Ejemplo: Ejemplo:

SUB r0, r1 ; Restar r1 de r0 SUB r0, r1 ; Restar r1 de r0


SBRC r0, 7 ; Saltar si el bit 7 en r0 está borrado SBRS r0, 7 ; Saltar si el bit 7 en r0 está a uno
SUB r0, r1 ; Sólo se ejecuta si el bit 7 en r0 es uno SUB r0, r1 ; Sólo se ejecuta si el bit 7 en r0 es cero
NOP ; Continuar (No hacer nada) NOP ; Continuar (No hacer nada)

30
SEC Poner a uno la bandera C SEH Pone a uno la bandera H
Sintaxis: SEC Sintaxis: SEH

Operación: C ← 1 Operación: H ← 1

Operandos: Ninguno Operandos: Ninguno

Descripción: Pone a uno la bandera de acarreo C del registro de Descripción: Pone a uno la bandera de medio acarreo H del
estado SREG. registro de estado SREG.

Banderas afectadas: Banderas afectadas:

C: Se pone a uno H: Se pone a uno

Ejemplo: Ejemplo:

SEC ; Poner a uno la bandera de acarreo SEH ; Poner a uno la bandera H


ADC r0, 1 ; r0 = r0 + r1 + 1

SEI Habilitar las interrupciones globales SEN Poner a uno la bandera N


Sintaxis: SEI Sintaxis: SEN

Operación: I ← 1 Operación: N ← 1

Operandos: Ninguno Operandos: Ninguno

Descripción: Pone a uno la bandera de habilitación de Descripción: Pone a uno la bandera de resultado negativo N del
interrupciones globales I del registro de estado SREG. registro de estado SREG.

Banderas afectadas: Banderas afectadas:

I: Se pone a uno N: Se pone a uno

Ejemplo: Ejemplo:

SEI ; Interrupciones habilitadas ADD r2, r19 ; Sumar r19 a r2


SLEEP ; Activación de modo SLEEP, esperando SEN ; Poner a uno la bandera N
; alguna interrupción

31
SER Carga todos los bits de un registro SES Pone a uno la bandera S
Sintaxis: SER Rd Sintaxis: SES

Operación: Rd ← $FF Operación: S ← 1

Operandos: 16 ≤ d ≤ 31 Operandos: Ninguno

Descripción: SER Carga directamente $FF al registro Descripción: Pone a uno la bandera de signo S del registro de
seleccionado. estado SREG.

Banderas afectadas: Ninguna Banderas afectadas:

Ejemplo: S: Se pone a uno

CLR r16 ; Borrar r16 Ejemplo:


SER r17 ; Poner a uno r17
OUT $18, r16 ; Escribir ceros al Puerto B ADD r2, r19 ; Sumar r19 a r2
NOP ; Retardo (No hacer nada) SES ; Poner a uno la bandera S
OUT PORTB, r17 ; Escribir unos en el Puerto B

SET Pone a uno la bandera T SEV Pone a uno la bandera V


Sintaxis: SET Sintaxis: SEV

Operación: T ← 1 Operación: V ← 1

Operandos: Ninguno Operandos: Ninguno

Descripción: Pone a uno la bandera T del registro de estado Descripción: Pone a uno la bandera de desbordamiento V del
SREG. registro de estado SREG.

Banderas afectadas: Banderas afectadas:

T: Se pone a uno V: Se pone a uno

Ejemplo: Ejemplo:

SET ; Poner a uno la bandera T ADD r2, r19 ; Sumar r19 a r2


SEV ; Poner a uno la bandera V

32
SEZ Poner a uno la bandera Z SLEEP Activar modo sleep
Sintaxis: SEZ Sintaxis: SLEEP

Operación: Z ← 1 Operación: Consulta el manual del dispositivo para obtener una


información detalla acerca de este modo de operación.
Operandos: Ninguno
Operandos: Ninguno
Descripción: Pone a uno la bandera de resultado cero Z del
registro de estado SREG. Descripción: Pone en modo Sleep al microcontrolador

Banderas afectadas: Banderas afectadas: Ninguna

Z: Se pone a uno Ejemplo:

Ejemplo: MOV r0, r11 ; Copiar r11 en r0


LDI r16, (1<<SE) ; Modo sleep habilitado
ADD r2, r19 ; Suma r19 a r2 OUT MCUCR, r16
SEZ ; Poner a uno la bandera Z SLEEP ; Poner el MCU en modo descanso

ST Almacenar indirectamente usando X El resultado de estas combinaciones es indefinido:

Sintaxis: LD X, Rr LD X+, r26


LD X+, Rr
LD -X , Rr LD X+, r27

Operación: (X) ← Rr X: Sin cambios LD –X, r26


(X) ← Rr, X ← X+1 X: Con post-incremento
X ← X–1, (X) ←Rd X: Con pre-decremento LD -X, r27

Operandos: 0 ≤ r ≤ 31 Algunas variantes de esta instrucción no son disponibles para


todos los modelos de AVR’s.
Descripción Se almacena un byte de manera indirecta
procedente de un registro de trabajo hacia el área de datos. Para Banderas afectadas: Ninguna
los dispositivos con SRAM, el área de datos se compone de los
registros de: trabajo, I/O y SRAM interna (y SRAM externa si Ejemplo:
es aplicable). Para los dispositivos sin SRAM, el espacio de
datos se compone sólo por los registros de trabajo. La EEPROM CLR r27 ; Borra el byte alto de X
tiene un espacio de dirección separado. LDI r26, $60 ; Pone el byte bajo de X a $60
ST X+, r0 ; Almacena r0 en la localidad $60 (X post-
La dirección de los datos es apuntado por el registro puntero X ; incrementado)
(16 bits). Se limita el acceso de memoria al segmento de datos de ST X, r1 ; Almacenar r1 en la localidad $61
64K bytes. Para acceder a otro segmento de datos en dispositivos LDI r26, $63 ; Pone el byte bajo de X a $63
con más de 64K bytes de datos de espacio, el registro I/O ST X, r2 ; Almacena r2 en la localidad $63
RAMPX tiene que ser correctamente configurado. ST –X, r3 ; Almacena r3 en la localidad $62 (X pre-
; decrementado)
El registro puntero X puede permanecer sin cambios por la
operación, puede post-incrementarse o pre-decrementarse. Estas
características son apropiadas para acceder a matrices, tablas y
uso del puntero de pila con el registro puntero X. Sólo el byte
bajo del puntero X se ocupa para dispositivos sin más de 256
bytes de espacio de datos. Para tales dispositivos, el byte alto del
puntero no es usado por esta instrucción y puede usarse para
otros propósitos.

33
ST (STD) Almacenar indirectamente usando Y
El resultado de estas combinaciones es indefinido:
Sintaxis: LD Y, Rr
LD Y+, Rr ST Y+, r28
LD -Y, Rr
STD Y+q, Rr ST Y+, r29

Operación: (Y) ← Rr Y: Sin cambios ST -Y, r28


(Y) ← Rr, Y ← Y+1 Y: Con post-incremento
Y ← Y–1, (Y) ← Rr Y: Con pre-decremento ST -Y, r29
(Y+q) ← Rr Y: Sin cambios,
q: Desplazamiento Algunas variantes de esta instrucción no son disponibles para
Operandos: 0 ≤ r ≤ 31, 0 ≤ q ≤ 63 todos los modelos de AVR’s.

Descripción Se almacena un byte de manera indirecta Banderas afectadas: Ninguna


procedente de un registro de trabajo hacia el área de datos. Para
los dispositivos con SRAM, el área de datos se compone de los Ejemplo:
registros de: trabajo, I/O y SRAM interna (y SRAM externa si
es aplicable). Para los dispositivos sin SRAM, el espacio de CLR r29 ; Borra el byte alto de Y
datos se compone sólo por los registros de trabajo. La EEPROM LDI r28, $60 ; Pone el byte bajo de Y a $60
tiene un espacio de dirección separado. ST Y+, r0 ; Almacena r0 en la localidad $60
; (Y post-incrementado)
La dirección de los datos es apuntado por el registro puntero Y ST Y, R1 ; Almacena r1 en la localidad $61
(16 bits). Se limita el acceso de memoria al segmento de datos de LDI r28, $63 ; Pone el byte bajo de Y a $63
64K bytes. Para acceder a otro segmento de datos en dispositivos ST Y, r2 ; Almacena r0 en la localidad $63
con más de 64K bytes de datos de espacio, el registro I/O ST -Y, r3 ; Almacena r0 en la localidad $62
RAMPY tiene que ser correctamente configurado. ; (Y pre-decrementado)
STD Y+2, r4 ; Almacena r4 en la localidad $64
El registro puntero Y puede permanecer sin cambios por la
operación, puede post-incrementarse o pre-decrementarse. Estas
características son apropiadas para acceder a matrices, tablas y
uso del puntero de pila con el registro puntero Y. Sólo el byte
bajo del puntero Y se ocupa para dispositivos sin más de 256
bytes de espacio de datos. Para tales dispositivos, el byte alto del
puntero no es usado por esta instrucción y puede usarse para
otros propósitos.

ST (STD) Almacenar indirectamente usando Z


Sólo el byte bajo del puntero Z se ocupa para dispositivos sin
Sintaxis: LD Z, Rr más de 256 bytes de espacio de datos. Para tales dispositivos, el
LD Z+, Rr byte alto del puntero no es usado por esta instrucción y puede
LD -Z, Rr usarse para otros propósitos.
STD Z+q, Rr
El resultado de estas combinaciones es indefinido:
Operación: (Z) ← Rr Z: Sin cambios
(Z) ← Rr, Z ← Z+1 Z: Con post-incremento ST Z+, r30
Z ← Z–1, (Z) ← Rr Z: Con pre-decremento
(Z+q) ← Rr Z: Sin cambios, ST Z+, r31
q: Desplazamiento
Operandos: 0 ≤ r ≤ 31, 0 ≤ q ≤ 63 ST -Z, r30

Descripción Se almacena un byte de manera indirecta ST -Z, r31


procedente de un registro de trabajo hacia el área de datos. Para
los dispositivos con SRAM, el área de datos se compone de los Algunas variantes de esta instrucción no son disponibles para
registros de: trabajo, I/O y SRAM interna (y SRAM externa si todos los modelos de AVR’s.
es aplicable). Para los dispositivos sin SRAM, el espacio de
datos se compone sólo por los registros de trabajo. La EEPROM Banderas afectadas: Ninguna
tiene un espacio de dirección separado.
Ejemplo:
La dirección de los datos es apuntado por el registro puntero Z
(16 bits). Se limita el acceso de memoria al segmento de datos de CLR r31 ; Borra el byte alto de Z
64K bytes. Para acceder a otro segmento de datos en dispositivos LDI r30, $60 ; Pone el byte bajo de Z a $60
con más de 64K bytes de datos de espacio, el registro I/O ST Z+, r0 ; Almacena r0 en la localidad $60
RAMPZ tiene que ser correctamente configurado. ; (Z post-incrementado)
ST Z, r1 ; Almacena r1 en la localidad $61
El registro puntero Z puede permanecer sin cambios por la LDI r30, $63 ; Pone el byte bajo de Z a $63
operación, puede post-incrementarse o pre-decrementarse. Estas ST Z, r2 ; Almacena r0 en la localidad $63
características son apropiadas para acceder a matrices, tablas y ST –Z, r3 ; Almacena r0 en la localidad $62
uso del puntero de pila; Sin embargo, debido a que este puntero ; (Z pre-decrementado)
puede usarse para las llamadas indirectas a subrutinas y los saltos STD Z+2, r4 ; Almacena r4 en la localidad $64
indirectos, es mejor usar a los punteros X o Y para direccionar al
puntero de pila.

34
STS Almacena directamente en SRAM SUB Resta de dos registros sin acarreo
Sintaxis: STS (k), Rr Sintaxis: SUB Rd, Rr

Operación: (k) ← Rd Operación: Rd ← Rd - Rr

Operandos: 0 ≤ r ≤ 31, 0 ≤ k ≤ 65535 Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Descripción: Almacena un byte de un registro de trabajo en la Descripción: Resta dos registros sin considerar la bandera C y
memoria de datos. Para los dispositivos con SRAM, el espacio deja el resultado en el registro destino Rd.
de datos está compuesto por los registros de trabajo, memoria de
I/O y SRAM interna (y SRAM externa si es aplicable). Para los Banderas afectadas:
dispositivos sin SRAM, el espacio de datos está compuesto sólo
por los registros de trabajo. La EEPROM tiene un espacio de H: Se activa si hay un acarreo negativo (Borrow) del bit 3, de lo
direcciones separado. Debe proporcionarse una dirección de 16- contrario se borrará.
bit. Se limita el acceso de memoria al segmento de datos de 64K V: Se activa si ocurre un desbordamiento del complemento a dos
bytes. Para acceder a otro segmento de datos en dispositivos con como resultado de la operación, de lo contrario se borrará.
más de 64K bytes de datos de espacio, el registro I/O RAMPD N: Se activa si el bit MSB del resultado está a uno, de lo
tiene que ser correctamente configurado. contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
Banderas afectadas: Ninguna C: Se activa si el valor absoluto del contenido de Rr es mayor
que el valor absoluto de Rd, de lo contrario se borrará.
Esta instrucción no es disponible para todos los modelos de Ejemplo:
AVR’s.
ADD r1, r2 ; Suma r2 a r1 (r1=r1+r2)
Ejemplo: ADD r28, r28 ; Suma r28 a sí mismo (r28=r28+r28)

LDS r2, $FF00 ; Carga r2 con el contenido de la localidad


; $FF00 de la memoria de datos
ADD r2, r1 ; Sumar r1 a r2
STS $FF00, r2 ; Escribir en SRAM el contenido de r2

SUBI Resta un dato inmediato a un registro SWAP Intercambia los nibbles

Sintaxis: SUBI Rd,Rr Sintaxis: SWAP Rd

Operación: Rd ← Rd - K Operación: R(7:4) ← Rd(3:0), R(3:0) ← Rd(7:4)

Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 Operandos: 0 ≤ d ≤ 31

Descripción: Resta un registro con una constante y deja el Descripción: Intercambia al nibble bajo con el nibble alto del
resultado en el registro Rd. Esta instrucción trabaja con los Rd.
registros R16 a R31 y es ideal para utilizarla con los punteros X,
Y y Z. Banderas afectadas: Ninguna

Banderas afectadas: Ejemplo:

H: Se activa si hay un acarreo negativo (Borrow) del bit 3, de lo INC r1 ; Incrementar r1


contrario se borrará (cero). SWAP r1 ; Intercambiar los nibbles alto y bajo de r1
V: Se activa si ocurre un desbordamiento del complemento a dos INC r1 ; Incrementar r1
como resultado de la operación, de lo contrario se borrará. SWAP r1 ; Intercambiar otra vez
N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
C: Se activa si el valor absoluto de K es mayor que el valor
absoluto de Rd, de lo contrario se borrará.

Ejemplo:

SUBI r22, $11 ; Resta la constante (dato inmediato) $11 al


;registro de trabajo r22

35
TST revisa si es cero o menor WDR Reinicio del Watchdog
Sintaxis: TST Rd Sintaxis: WDR

Operación: Rd ← Rd (AND) Rd Operación: Reinicio del temporizador “Watchdog”

Operandos: 0 ≤ d ≤ 31 Operandos: Ninguno

Descripción: Prueba si el registro es cero o negativo. Realiza un Descripción: Hace un Reinicio del Temporizador Watchdog. La
AND lógico entre el registro y él mismo. El registro permanece instrucción debe ejecutarse en un tiempo limitado por el
sin cambios. prescaler del Watchdog. Consulta las especificaciones del
Watchdog en el manual del dispositivo.
Banderas afectadas:
Banderas afectadas: Ninguna
V: Se pone a cero.
N: Se activa si el bit MSB del resultado está a uno, de lo Ejemplo:
contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará. WDR ; Reinicializa el temporizador del Watchdog

Ejemplo:

TST r0 ; Prueba r0
BREQ prueba ; Brinca si r0 = 0
...
prueba: NOP ; Destino de desvío (No hacer nada)

36

Vous aimerez peut-être aussi