#pragma GCC optimize "-O0"
#pragma GCC optimize "Og"
#include <ArduinoTrace.h>
volatile uint8_t a[3]={2,3,4},b=5,i=1;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
i=2;
b=0;
//------------------- PROCESO --------------------------//
// for(i=0; i<3; i++){
// b=b+a[i];
// }
// i = 0;
// while(i < 3){
// b=b+a[i];
// i++;
// }
//----------------------------------------------------- //
//------------- Proceso en lenguaje ensamblador ----------//
// // for convertido en while
// i = 0;
asm volatile(
"ldi r18, 0 \n"
"sts i, r18 \n"
);
// while(i < 3)
asm volatile("init: ");
asm volatile(
"lds r18, i \n"
"cpi r18, 3 \n" //r18-3 <--> i - 3
"brlo body \n" //i < 3
"rjmp end \n"
);
asm volatile("body: ");
// b=b+a[i];
asm volatile(
"lds r18, b \n" //r18 <-- (b)
"lds r20, i \n"
"ldi r21, 0 \n" //r21:r20 <-- (i) en 16 bits
"subi r20, lo8(-(a)) \n"
"sbci r21, hi8(-(a)) \n" //r21:r20 <-- dirección de a[i]
"movw zl, r20 \n" //Z <-- dir de a[i]
"ld r19, Z \n" //r19 <-- (a[i])
"add r18, r19 \n" //r18 <-- (b) + (a[i])
"sts b, r18 \n" //b <-- (b) + (a[i])
);
// i++;
asm volatile(
"lds r18, i \n"
"inc r18 \n" //i++
"sts i, r18 \n"
);
asm volatile("rjmp init");
asm volatile("end: ");
//----------------------------------------------------- //
for(int j=0;j<3;j++)
{
Serial.print("a[");
Serial.print(j);
Serial.print("] = ");
Serial.println(a[j]);
}
Serial.println();
Serial.print("b = ");
Serial.println(b);
//Al usar punto podemos ejecutar funciones miembros
}
void loop() {
// put your main code here, to run repeatedly:
}