Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Test STM32F4-Assembler project
- ; Отладочный вывод в Кейл
- AREA |.strings|, DATA, READONLY
- ; Запишем нужные нам строки
- ; В конце добавим 0 - он показывает конец строки
- ; 0x0a показывает перенос строки
- helloworld DCB "Hello world", 0
- test_x DCB "test: %x", 0x0a, 0 ; %x: hex
- test_s DCB "test: %s", 0x0a, 0 ; %s: string
- mimimi DCB "mimimi", 0
- manyarg DCB "%d %d %d %d %s %d", 0 ; шесть замен
- AREA |.text|, CODE, READONLY
- ; Внешние символы (stdio)
- IMPORT printf
- IMPORT puts
- ; Инициализация системы тактирования
- EXPORT SystemInit
- SystemInit PROC
- BX LR ; Возвращаемся обратно
- ENDP
- EXPORT main
- main PROC
- ; Место для инициализации
- ; Выведем текст "Hello world" в Кейл
- ; puts("Hello World");
- LDR R0, =helloworld
- BL puts
- ; Теперь выведем с подстановкой числа!
- ; "test: %x", вместо %x будет написано текстом значение регистра R1
- ; (так как он второй аргумент), шестнадцатеричный формат: 1234567A
- LDR R0, =test_x
- LDR R1, =0x1234567A
- BL printf
- ; И с подстановкой строки.
- LDR R0, =test_s
- LDR R1, =mimimi
- BL printf
- ; Пример передачи большого количества аргументов в функцию (7 штук)
- ; Добъёмся такого результата: "1 2 3 4 mimimi 5"
- ; Сначала запихнём аргументы в стек, используя R0-R3 свободно.
- ; Указатель стека указывает на 4 аргумент! Остальные идут в порядке увеличения адреса
- ; Их три штуки: "%d %s %d". Число, строка, число
- MOV R0, #4
- LDR R1, =mimimi
- MOV R2, #5
- ; Сдвинем указатель стека на 4 слова, чтоб не затереть ничего важного (хоть там ничего и нет)
- ; Так как пишем в сторону старших адресов, где сидят обычно старые данные от функций, откуда мы пришли
- ; Вообще-то надо было всего 3 слова, но ядро любит выравнивание на 8 байт (PRES8), потому округление в большую сторону.
- SUB SP, SP, #0x10
- STR R0, [SP, #0]
- STR R1, [SP, #4]
- STR R2, [SP, #8]
- ; Теперь можно и первые 4 аргумента обычным порядком передать
- LDR R0, =manyarg
- MOV R1, #1
- MOV R2, #2
- MOV R3, #3
- ; Аргументы подготовлены. Вызовем функцию
- BL printf
- ; Вернм указатель стека на место
- ADD SP, SP, #0x10
- __mainloop ; Главный цикл
- ; Код какой-то полезный
- ; На очередной круг
- B __mainloop
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement