#pragma GCC optimize "-Og"
#include "ArduinoTrace.h"
volatile byte a=13,b=10,c,d,e=6; //prueba 1
//volatile byte a=13,b=9,c,d,e=6; //prueba 2
//volatile byte a=4,b=10,c,d,e=6; //prueba 3
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
//--------------- PROCESO --------------------
// if(a>b && b>9)
// {
// c=a-b;
// d=c+4;
// }
// else
// {
// c=a+b;
// d=c-6;
// }
// if(d>=8)
// {
// e=3;
// }
//---------------------------------------------
asm goto
(
"lds r16,a \n"
"lds r17,b \n"
"sub r17,r16 \n" //resta (b-a)
"in r17,0x3F \n"
"sbrs r17,0 \n" //leer C (si C=1 salta a 37)
"rjmp %l[L20] \n"
"lds r17,b \n" //volvemos a cargar b
"subi r17,10 \n" //resta b-10 (10 porque 9 no está incluido, tons se suma uno)
"in r17,0x3F \n" //guarda en SREG
"sbrc r17,0 \n" //si C=1 salta a l20(false). Como sumamos 1 a la constante, analizamos el carry 0 que es para mayor o igual (importante)
"rjmp %l[L20] \n"
:
:
:"r16","r17","r23"
:L20
);
//true
L10:
asm volatile
(
"lds r16,a \n"
"lds r17,b \n"
"lds r18,c \n"
"lds r19,d \n"
"mov r18,r16 \n" //copia info a en r18
"sub r18,r17 \n" //resta a copy - b
"mov r19,r18 \n" //copia info c en r19
"subi r19,-4 \n" //"resta" r19-(-4)
"sts c,r18 \n"
"sts d,r19 \n"
:
:
:"r16","r17","r18","r19"
);
asm goto
(
"rjmp %l[L30] \n"
::::L30
);
//cumple lo de false
L20:
asm volatile
(
"lds r16,a \n"
"lds r17,b \n"
"lds r18,c \n"
"lds r19,d \n"
"mov r18,r16 \n" //a lo guarda en r18
"add r18,r17 \n" //suma r18 y r17
"mov r19,r18 \n" //copia la info de r18 en r19.
"subi r19,6 \n"
"sts c,r18 \n"
"sts d,r19 \n"
:
:
:"r16","r17","r18","r19"
);
asm goto
(
"rjmp %l[L30] \n"
::::L30
);
//if(d<=8)
L30:
asm goto
(
"lds r19,d \n" //carga d
"cpi r19,8 \n" //activa banderas, compara(resta) d y 8.
"in r24,0x3F \n" //carga sreg
"sbrc r24,0 \n" //si C=0 comenta rjmp. C=1 manda direct a L50
"rjmp %l[L50] \n"
:
:
:"r19","r24"
:L50
);
//e=3
L40:
asm volatile
(
"lds r24,e \n" //carga e
"ldi r20,3 \n" //carga constante
"mov r24,r20 \n" //copia constante en r24
"sts e,r24" //guarda e.
:
:
:"r24","r20"
);
L50:
DUMP(c);
DUMP(d);
DUMP(e);
}
void loop() {
// put your main code here, to run repeatedly:
}