Advertisement
CosminVarlan

17. Maximul dintr-un array de numere (ASM)

Dec 16th, 2021
1,130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. volatile byte a[10] = {5,3,1,9,2,8,7,6,12,4};
  2. volatile byte dim=10;
  3. volatile byte val=0;
  4.  
  5. void setup() {
  6.     Serial.begin(9600);
  7.     asm volatile(
  8.       "ld  __tmp_reg__, Z+  \n"  // bag prima vloare intr-un registru temporar si mut pointerul (Z) pe urmatoarea valoare din sir
  9.       "mov r24, __tmp_reg__ \n"  // prima valoare o pun ca minim (valoarea minima va fi retinuta in r24)
  10.       "dec %2               \n"  // decrementez numarul de elemente ramase
  11.       "1:                   \n"  // aici va incepe bucla
  12.       "ld __tmp_reg__, Z+   \n"  // incarc urmatoarea valoare in registru temporar
  13.       "cp __tmp_reg__, r24  \n"  // compar valoarea noua cu ce am in registru r24
  14.       "brlo 2f              \n"  // daca vrem sa aflam maxim (sau brle 2f daca vrem minimul)
  15.       "mov r24, __tmp_reg__ \n"  // rescriem valoarea din registrul 24 cu cea exitenta in registrul temporar - pentru ca e noua valoare (nu a sarit instructiunea anterioara)
  16.       "2:                   \n"                
  17.       "dec %2               \n"  // decrementez numarul de elemente ramase
  18.       "breq 3f              \n"  // daca s-a ajuns la 0 elemente ramase, sar la final
  19.       "rjmp 1b              \n"  // reiau procesul pentru urmatorul numar
  20.       "3:    \n"
  21.       "mov %0, r24  \n"
  22.       :"=r" (val): "z" (a), "r"(dim) : "memory", "r24"
  23.     );
  24.     Serial.println(val);
  25. }
  26. void loop() {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement