#pragma GCC optimize "-Og"
#include "ArduinoTrace.h"
volatile byte a=8,b=2,c=12;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
//------------ process -----------------------
// if ((a>b && a>c) ||b==c || a>8)
// {
// a=a-b;
// }
// else
// {
// a=a+b;
// }
//---------------------------------------------
// Parte realizada en assembly
// asm goto(
// "lds r19,a \n"
// "lds r20,b \n"
// "lds r21,c \n" // ya tengo esto
// "sub r20,r19 \n"
// "in r22,0x3F \n"
// "sbrc r22,0 \n"----
// "rjmp LI30 \n"
// "rjmp LI10 \n"
// "LI30:"
// "sub r21,r19 \n"
// "in r22,0x3F \n"
// "sbrs r22,0 \n"
// "rjmp LI10 \n"
// "rjmp %l[L10] \n"
// "LI10:"
// "sub r20,r21 \n"
// "in r22,0x3F \n"
// "sbrs r22,1 \n"
// "rjmp LI20 \n"
// "rjmp %l[L10] \n"
// "LI20:"
// "cpi r19,9 \n"
// "in r22,0x3F \n"
// "sbrc r22,0 \n"
// "rjmp %l[L20]"
// :
// :
// :"r19","r20","r21","r22"
// :L10,L20
// );
// Parte realizada con registros elegidos por el compilador
asm goto(
"sub %1,%0 \n"
"in %3,%4 \n"
"sbrc %3,0 \n"
"rjmp LI30 \n"
"rjmp LI10 \n"
"LI30:"
"sub %2,%0 \n"
"in %3,%4 \n"
"sbrs %3,0 \n"
"rjmp LI10 \n"
"rjmp %l[L10] \n"
"LI10:"
"sub %1,%2 \n"
"in %3,%4 \n"
"sbrs %3,0 \n"
"rjmp LI20 \n"
"rjmp %l[L10] \n"
"LI20:"
"cpi %0,9 \n"
"in %3,%4 \n"
"sbrc %3,0 \n"
"rjmp %l[L20]\n"
:
:"r" (a),"r" (b),"r" (c),"r" (a),"I" (_SFR_IO_ADDR(SREG))
:
:L10,L20
);
L10:
a = a-b;
goto L30;
L20:
a = a+b;
L30:
DUMP(a);
}
void loop() {
// put your main code here, to run repeatedly:
}