#pragma GCC optimize ("-O0")
#include "ArduinoTrace.h"
volatile uint8_t a[3] = {2, 3, 4}, b = 6, i = 1, *p; //5 bytes totales para almacenar las 3 variables
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("INICIO");
i = 2;
b=0;
//------------- Proceso en alto nivel -------------------
//b=a[i-2];
// asm volatile(
// "lds r18,i \n"
// "subi r18,2 \n" //r18 <-- (i)-2
// "ldi r19,0 \n" //r19:r18 <-- (i) - 2 en 16 bits
// "subi r18, lo8(-(a)) \n"
// "sbci r19,hi8(-(a)) \n" //r19:r18 <-- dir de a[i-2]
// "movw Zl, r18 \n" //Z <-- dir de a[i-2]
// "ld r18,Z \n" //r18 <-- (a[i-2])
// "sts b,r18"
// );
//Ejemplo 2
//p=&a[i];
asm volatile(
"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 de a[i]
"sts p,r18 \n"
"sts p+1,19 \n" // Variable p (2 bytes) <-- dir de a[i]
);
//b=*(p-2);
asm volatile(
"lds r18, p \n"
"lds r19, p+1 \n" // r19:r18 dir de a[i]
"subi r18,lo8(2)\n"
"sbci r19,hi8(2) \n" //r19:r18 <-- dir de a[i-2]
"movw Zl,r18 \n" // Z <-- dir de a[i-2]
"ld r18, Z \n" //r18 <-- (a[i-2])
"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
}