Advertisement
CosminVarlan

18. Fibonacci (ASM)

Dec 16th, 2021
1,268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. uint8_t fibo(uint8_t a){
  2.     volatile uint8_t x=a;      
  3.     volatile uint8_t z=0;
  4.  
  5.       asm(
  6.         "ldi r26, 1 \n"   // incarc prima valoare din sirul lui fibonacci in registrul r26
  7.         "dec %1     \n"   // decrementez numarul elementului pentru ca voi porni de fapt de la urmatrul
  8.         "ldi r27, 1 \n"   // incarc prima valoare din sirul lui fibonacci in registrul r27
  9.         "dec %1     \n"   // decrementez iarasi  
  10.         "1:         \n"      // eticheta pentru a ma intoarce si a face bucla
  11.         "mov r21, r26  \n"   // copii registrul 26 in 21
  12.         "add r21, r27  \n"   // adun la r21 pe r27 (de fapt am calculat suma lui 26 cu 27)
  13.         "mov r26, r27  \n"   // mut continutul lui r27 in r26
  14.         "mov r27, r21  \n"   // mut continutul lui r21 (suma) in r27
  15.         "dec %1     \n"      // decrementez pozitia.... daca se ajunge la zero, atunci se seteaza flagu-ul ZERO pe 1 si urmatoarea linie va fi ignorata
  16.         "brne 1b    \n"      // daca nu s-a ajuns la 0 in urma decrementarii, se sare la eticheta 1 pentru a relua si a calcula o noua suma
  17.         "mov %0, r21  \n"    // la sfarsit se trece continutul lui r21 (ultima suma) in parametrul de iesire.
  18.         : "+r" (z) : "r" (x) : "r26", "r27", "r21"
  19.         );
  20.  
  21.     return z;
  22. }
  23.  
  24. void setup() {
  25.   Serial.begin(9600);
  26.   uint8_t m = fibo(3); // 1,1,2,3,5,8,13,21,34,55 (al zecelea),89,
  27.   Serial.println(m);
  28. }
  29. void loop() {}
  30.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement