Advertisement
Garey

ARM Assembly

Apr 24th, 2019
3,231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 3.28 KB | None | 0 0
  1. ; R0 - Временен регистър за запазване на временни данни (изпозлваме го в AND проверката)
  2. ; R1 - Регистър, който сочи към адреса на масива
  3. ; R2 - Регистър, който съдържа броят на елементите на масива
  4. ; R3 - Регистър, в който запазваме сумата на всички четни числа
  5. ; R4 - Регистър, в който запазваме сумата на всички нечетни числа
  6. ; R5 - Регистър, в който запазваме броят на четните числа
  7. ; R6 - Регистър, в който запазваме броят на нечетните числа
  8. ;
  9. ; Как работи AND?
  10. ;
  11. ; Синтаксис: AND <регистър, в който да се запази резултата>, <операнд 1>, <операнд 2>
  12. ;
  13. ;   Таблица:
  14. ;
  15. ; ----------------------
  16. ; | О1 О2   | О1 И О2 |
  17. ; ----------------------
  18. ; | 0   0    |    0    |
  19. ; | 0   1    |    0    |
  20. ; | 1   0    |    0    |
  21. ; | 1   1    |    1    |
  22. ; ----------------------
  23. ;
  24. ; Обяснение за SUBS R2, R2, #1
  25. ;
  26. ; Реално, на C/C++ код имаме следното:
  27. ;
  28. ; for(int i = 6; i > 0; i--)
  29. ;
  30. ; Тоест, вървим наобратно.
  31. ;
  32.  
  33. .global oddEvenSum      ; Начало
  34.  
  35. oddEvenSum:
  36. MOV R0, #1          ; Задаваме начална стойност за AND операцията
  37. LDR R1, =arr            ; Зареждаме адреса на масива в R1
  38. LDR R2, #6          ; Размера на масива
  39.  
  40. for:                ; Име на подпрограмата за цикъл
  41. AND R0, [R1], #4        ; Проверка дали стойността от R1 е равна на 4 байта и запазване в R0 -- С други думи се прави маска
  42. LDR R0, [R1], #4        ; Зареждаме в регистър R0 стойността на този елемент, за да го използваме по-късно за сумата
  43.  
  44. ADDEQ R3, R3, R0        ; Ако горната проверка е вярна, добави R0 към предишната стойност на R3 (тоест самото число е четно)
  45. ADDNE R4, R4, R0        ; Ако горната проверка е невярна, добави R0 към предишната стойност на R4 (тоест самото число е нечетно)
  46.  
  47. ADDEQ R5, R5, #1        ; Ако горната проверка е вярна, добави 1 към предишната стойност на R5 (тоест самото число е четно)
  48. ADDNE R6, R6, #1        ; Ако горната проверка е невярна, добави 1 към предишната стойност на R6 (тоест самото число е нечетно)
  49.  
  50. SUBS R2, R2, #1         ; Намали броят на елементите с единица
  51.  
  52. BPL for             ; Ако резултата от проверката излезе положително или нула, се върни в цикъла.
  53.  
  54. arr:                ; Име на подпрограмата за деклариране на масива
  55. DCD 0x0000, 0x0001, 0x0010, 0x0011, 0x0100, 0x0101 ; Декларираме стойностите на масива
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement