Проект, моргающий светодиодами — это круто. Но более-менее серьёзный проект без подпрограмм не сотворить.
Потому надо хотя бы преобразовать проект к более приличному виду, то есть вынести процедуры зажигания и гашения светодиодов в подпрограммы.
В принципе, ничего особо нового в этом проекте нет, за исключением операций работы со стеком.
читать дальшеВ функциях LedOn и LedOff в начале и в конце есть команды:
PUSH {LR} ; Сохранить регистр LR в стеке.
; Полезный код
POP {PC} ; Поместить адрес возврата в PC. Выход из подпрограммы.
Вообще, необходимо придерживаться следующего соглашения о вызовах для удобства и совместимости с функциями, написанными на Си.
Аргументы передаются в регистрах R0-R3, первый в R0 и так далее. Если аргументов больше, то они передаются уже через стек.
Содержимое остальных регистров общего назначения, которые в процедуре используются, надо сохранить на стеке же. В том числе и LR, если есть вложенные процедуры.
Сравните:
Про стек в общем я писал. Пусть немного про другой контроллер, но суть та же.
Адрес вершины стека в кортексах записан первым числом в таблице векторов! Регистр SP инициализируется при сбросе именно этим числом.
Локальные метки можно использовать с помощью директивы ROUT, но наименование жуть какое неудобное, мне не нравится.
Пример программы:
main.s.
<< Предыдущее Следующее >>