#include <ArduinoTrace.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
volatile byte a[3]={7,4,8}; //prueba 1
// volatile byte a[3]={3,5,9}; //prueba 2
volatile byte b=0;
//------ pasar a assembly ----------------------
//b=fooA(a);
asm(
"movw r24, r28 \n" //A r25 y r24 <----- valor de Y
// "adiw r24, 0x01 \n" // r25, r24 <----- Direccion de memoria de arreglo a (GDB)
"adiw r24, 0x22 \n"// r25, r24 <----- Direccion de memoria de arreglo a (Simulador)
"call fooA \n" //Guardar la direccion de retorno (proxima instruccion) y salta a fooA
//"std Y+4, r24 \n" // vuelve del return con un valor y se la da asign al b (GDB)
"std Y+37, r24 \n"// vuelve del return con un valor y se la da asign al b (Simulador)
);
//---------------------------------------------
DUMP(b);
}
void loop() {
// put your main code here, to run repeatedly:
}
//------ pasar a assembly ----------------------
// byte fooA(byte a[])
// {
// volatile byte q;
// if(a[1]>=5)
// {
// q=a[0]+1;
// }
// else
// {
// q=a[2]-2;
// }
// return q;
// }
asm(
" fooA: \n"
"push 28 \n"
"push 29 \n"//Guardar Y del caller (setup) en stack
"push r1 \n"//crea un espacio en stack para la variable q
"in r28, 0x3d \n" //Copia la direccion del sp en Y (parte baja)
"in r29, 0x3e \n" //Copia la direccion del sp en Y (parte alta) ... (Y de fooA)
//if
"movw r30, r24 \n" //Z <-- dir a
"ldd r18, Z+1 \n" //r18 <--- a[1]
"cpi r18, 5 \n" // a[1]- 5
"brcc L1 \n" // si es verdadera va a L1
//else
"ldd r24,Z+2 \n" // r24 <--- a[2]
"subi r24, 2 \n"// r24 <---- a[2]-2
"std Y+1, r24 \n"// q=a[2]-2
"ldd r24, Y+1 \n" // return q que esta en el registro 24
"rjmp L2 \n"
//True
"L1: \n"
"ld r24, Z \n"
"subi r24, -1 \n"
"std Y+1, r24 \n "
"ldd r24, Y+1 \n"
// return q que esta en el registro 24
"L2: \n"
"pop r0 \n"// liberar espacio de q
"pop r29 \n"//Restaurar Y del caller
"pop r28 \n"
"ret"
);
//-----------------------------------------------