Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Test STM32F4-Assembler project
- ; Локальные переменные
- AREA |.text|, CODE, READONLY
- ; Инициализация системы тактирования
- EXPORT SystemInit
- SystemInit PROC
- BX LR ; Возвращаемся обратно
- ENDP
- ; Получение данных
- ; Возвращает всегда 12
- get_data PROC
- MOV R0, #12
- ; Возврат
- BX LR
- ENDP
- ; Подсчт суммы элементов массива размером 32 байта [R0]
- do_smth_calc PROC
- PUSH {R4, LR}
- ; Сохраним аргумент
- MOV R3, R0
- ; uint32_t Temp = 0;
- MOV R0, #0
- ; i = 0
- MOV R1, #0
- _for2
- ; i < 32
- ; Если больше или равно 32, валим
- CMP R1, #32
- BGE _exit2
- ; Temp += Buffer[i];
- LDRB R2, [R3, R1]
- ADD R0, R0, R2
- ; прибавим 1 к R1, и на следующую итерацию
- ADD R1, R1, #1
- ; перепрыгнем на следующую итерацию
- B _for2
- _exit2
- ; В R0 теперь результат
- POP {PC, R4}
- ENDP
- ; Тестовая процедура
- ; Объявление локального буфера, заполнение, передача указателя на него как аргумента
- smth PROC
- ; uint32_t smth(void)
- ; Сохраним адрес возврата и R4 для выравнивания по 8 байт
- PUSH {R4, LR}
- ; {
- ; uint8_t buffer[32];
- ; Выделим 32 байта для буфера на стеке.
- SUB SP, SP, #32
- ; i пусть будет в регистре каком-нибудь
- ; int i;
- ; for(i = 0; i < 32; i++)
- ; i = 0
- MOV R1, #0
- _for1
- ; i < 32
- ; Если больше или равно 32, валим
- CMP R1, #32
- BGE _exit1
- ; {
- ; R0 = get_data();
- ; получим очередной байт в R0
- BL get_data
- ; R1 - номер элемента, оно же и смещение
- ; buffer[i] = R0;
- STRB R0, [SP, R1]
- ; }
- ; i++
- ; прибавим 1 к R1, и на следующий цикл
- ADD R1, R1, #1
- ; перепрыгнем на следующую итерацию
- B _for1
- _exit1
- ; R0 = do_smth_calc(&buffer[0]);
- MOV R0, SP
- BL do_smth_calc
- ; }
- ; Вернм SP
- ADD SP, SP, #32
- ; В R0 теперь результат
- POP {PC, R4}
- ENDP
- EXPORT main
- main PROC
- ; Вызовем
- BL smth
- __mainloop ; Главный цикл
- ; Код какой-то полезный
- ; На очередной круг
- B __mainloop
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement