Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; R0 - Временен регистър за запазване на временни данни (изпозлваме го в AND проверката)
- ; R1 - Регистър, който сочи към адреса на масива
- ; R2 - Регистър, който съдържа броят на елементите на масива
- ; R3 - Регистър, в който запазваме сумата на всички четни числа
- ; R4 - Регистър, в който запазваме сумата на всички нечетни числа
- ; R5 - Регистър, в който запазваме броят на четните числа
- ; R6 - Регистър, в който запазваме броят на нечетните числа
- ;
- ; Как работи AND?
- ;
- ; Синтаксис: AND <регистър, в който да се запази резултата>, <операнд 1>, <операнд 2>
- ;
- ; Таблица:
- ;
- ; ----------------------
- ; | О1 О2 | О1 И О2 |
- ; ----------------------
- ; | 0 0 | 0 |
- ; | 0 1 | 0 |
- ; | 1 0 | 0 |
- ; | 1 1 | 1 |
- ; ----------------------
- ;
- ; Обяснение за SUBS R2, R2, #1
- ;
- ; Реално, на C/C++ код имаме следното:
- ;
- ; for(int i = 6; i > 0; i--)
- ;
- ; Тоест, вървим наобратно.
- ;
- .global oddEvenSum ; Начало
- oddEvenSum:
- MOV R0, #1 ; Задаваме начална стойност за AND операцията
- LDR R1, =arr ; Зареждаме адреса на масива в R1
- LDR R2, #6 ; Размера на масива
- for: ; Име на подпрограмата за цикъл
- AND R0, [R1], #4 ; Проверка дали стойността от R1 е равна на 4 байта и запазване в R0 -- С други думи се прави маска
- LDR R0, [R1], #4 ; Зареждаме в регистър R0 стойността на този елемент, за да го използваме по-късно за сумата
- ADDEQ R3, R3, R0 ; Ако горната проверка е вярна, добави R0 към предишната стойност на R3 (тоест самото число е четно)
- ADDNE R4, R4, R0 ; Ако горната проверка е невярна, добави R0 към предишната стойност на R4 (тоест самото число е нечетно)
- ADDEQ R5, R5, #1 ; Ако горната проверка е вярна, добави 1 към предишната стойност на R5 (тоест самото число е четно)
- ADDNE R6, R6, #1 ; Ако горната проверка е невярна, добави 1 към предишната стойност на R6 (тоест самото число е нечетно)
- SUBS R2, R2, #1 ; Намали броят на елементите с единица
- BPL for ; Ако резултата от проверката излезе положително или нула, се върни в цикъла.
- arr: ; Име на подпрограмата за деклариране на масива
- DCD 0x0000, 0x0001, 0x0010, 0x0011, 0x0100, 0x0101 ; Декларираме стойностите на масива
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement