#pragma GCC optimize "-O0"
#pragma GCC optimize "-Og"
#include <ArduinoTrace.h>
volatile uint8_t a[3]={2,3,4},b[3]={5,6,7},i=1;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  i=2;

  //------------------- PROCESO --------------------------//
  // for(i=0;i<3;i++)
  asm volatile(
    "ldi r22, 0 \n"
    "sts i, r22 \n" //i=0
  );
  asm volatile("initFor:");
  asm volatile(
    "lds r22, i \n"
    "cpi r22, 3 \n" //i<3
    "brlo bodyFor \n" //Jump bodyFor
    "rjmp end \n" //Jump end
  );
  // {
    //a[i] = b[i]; 
    asm volatile("bodyFor:");
    asm volatile(
      "lds r18, i \n"
      "ldi r19, 0 \n" //r19:r18 <-- (i) en 16 bits
      "subi r18, lo8(-(b)) \n" 
      "sbci r19, hi8(-(b)) \n" //r19:r18 <--- dir b[i]
      "movw zl, r18 \n" //Z <-- dir de b[i]
      "ld r20, Z \n" //r20 <-- (b[i])

      "lds r18, i \n"
      "ldi r19, 0 \n" //r19:r18 <-- (i) en 16 bits
      "subi r18, lo8(-(a)) \n" 
      "sbci r19, hi8(-(a)) \n" //r19:r18 <--- dir a[i]
      "movw zl, r18 \n" //Z <-- dir de a[i]
      "st Z, r20 \n" //a[i] <-- (b[i]) store en lo que esta apuntando z, esta apuntando la dir de a[i], lo que tiene el registro, y ese regiostro tiene el contenido de b[i]
  
      "lds r22, i \n"
      "inc r22 \n" 
      "sts i, r22 \n"// i++
      "rjmp initFor \n" // Jump initFor
    );
    asm volatile("end:");
  //}
  //----------------------------------------------------- //

  for(int j=0;j<3;j++)
  {
    Serial.print("a[");
    Serial.print(j);
    Serial.print("] = ");
    Serial.println(a[j]);
  }

  for(int j=0;j<3;j++)
  {
    Serial.print("b[");
    Serial.print(j);
    Serial.print("] = ");
    Serial.println(b[j]);
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}