#pragma GCC optimize ("Og")
#include "ArduinoTrace.h"
volatile int8_t n=3,sum;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("INICIO");
//------------- Proceso en alto nivel -------------------
body1: // 2- Etiquetas goto
// {
// sum = sum+n;
// n=n-1;
// }
asm volatile // 3- Instrucciones asm
(
"lds r16, sum \n" // r16 <- (sum)
"lds r17, n \n" // r17 <- (n)
"add r16, r17 \n" // r16 <- (sum) + (n)
"sts sum, r16 \n" // sum <- (sum) + (n)
"dec r17 \n" // r17 <- (n)-1 <-> r17 <- n--
"sts n, r17" // n <- (n)-1
);
// while (n>0) // 1- Original
// {
// sum=sum+n;
// n=n-1;
// }
// while (n>0) // 2- Etiquetas goto
// {
// if (n>0)
// {
// goto body1;
// }
// }
asm goto // 3- Instrucciones asm
(
"lds r16, n \n" // r16 <- (n)
"cpi r16, 1 \n" // comparar (n) y 1
"brlt %l[end1] \n" // si n<1 <--> n<=0 goto: end1
"jmp %l[body1]" // sino goto: body1
::::end1, body1
);
end1: // 2- Etiquetas goto
//--------------------------------------------------------
DUMP(n);
DUMP(sum);
}
void loop() {
}