#pragma GCC optimize "-O0"
#include "ArduinoTrace.h"
volatile uint8_t a[3]={2,3,4}, b=2, i=1; //a,a+1,a+2
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
addressInfo();
Serial.println("INICIO");
i=2;
b=0;
//------------- Proceso en alto nivel -------------------
// //b=a[0];
// asm volatile(
// "lds r18, a \n" //r18 <-- (a[0])
// "sts b, r18 \n"//
// );
// //b=a[1];
// asm volatile(
// "lds r18, a+1 \n" //r18 <-- (a[0])
// "sts b, r18 \n"//
// );
//b=a[i];
asm volatile(// el valor de i solo se conoce en tiempo
// se convierte dr 8 a 16
"lds r18, i \n" //r18 <-- (a[0]) //solo r26 a r31 se pueden usar como X, Y, Z es decir como pointers
"ldi r19, 0 \n"//r19:r18
"subi r18,lo8(-(a)) \n"
"subi r19,hi8(-(a)) \n"// r19:r18 <-- direccion de a[i]
"movw r30, r18, \n" // r31:r30 <--r19:r18 ; Z <-- dir a[i] se puede colocar r30 o zl
"ld r18 Z \n"//r18 <-- (a[i])
"sts b, r18"
);
//------------------------------------------------------
// DUMP(a);
DUMP(b);
DUMP(i);
}
void loop() {
}
void addressInfo()
{
Serial.println("DIRECCIONES de VARIABLES (HEX):");
Serial.print("a: ");
Serial.println((int)&a,HEX); //direccion de a
Serial.print("b: ");
Serial.println((int)&b,HEX); //direccion de b
Serial.print("i: ");
Serial.println((int)&i,HEX); //direccion de c
}