ну да reti этож обычно из прерывания.
ну вот для примера скока их у меня в простейшем коде
~$ grep -i -e callx -e reti -C1 ~/data/devel/lcdconv/lcdconv.S
rjmp main ; 0. reset, ext pin, power-on, brown-out, watchdog
reti ; 1. external interrupt 0
reti ; 2. external interrupt 1
reti ; 3. timer 1 capture event
reti ; 4. timer 1 compare match
reti ; 5. timer 1 overflow
reti ; 6. timer 0 overflow
reti ; 7. uart rx complete
reti ; 8. uart data register empty
reti ; 9. uart tx complete
reti ; a. analog comparator
чтоб ничего не затиралось есть всего 3 варианта: надо либо ничего не портить (не писать), либо сохранять-возвращать то что поришь, либо использовать непересекающиеся наборы обьектов для записи (регистров, массивов итп), для разных задач и разных процессоров оптимальным будет разный подход, 1й вариант обычно неприемлем и соответственно остается комбинация 2го и 3его.
AQ29, это совсем не сложно и совсем не портит эффективность , скорее наоборот
некоторые языки предлагают вообще интересные варианты, как скажем yeld в python
которая позволяет уступить процессор вызвавшему процедуру коду а при следующем вызове функции - продолжить с места где она уступила.
(это по сути поведение которое скрыто от кода делают многозадачные ос на 1 ядре)
разница в языках программирования восновном только в том насколько надо заботиться о доступе к нужным данным, о переключении контекстов для распараллеливаемых задач итп, и соответственно насколько можно влиять на эффективность кода.
ассемблер дает неограниченные возможности но и требует делать все самому.
макроассемблер позволяет удобно все это все оформить, ктото говорит что это просто декор а по мне так реальный инструмент достичь читабельности и минимизировать ошибки.
C - скрывает некую часть работы и позволяет начинающим не знать что m[n] m+sz*n это одно и то же

а неначинающим сконцентрироваться на алгоритме не заботясь о множестве мелочей, которые на masm устанешь делать, правда за такой сервис он требует например изучения поведения версий компиляторов с разными O0,1,2 , если хочешь макс эффективности кода
а про forthcpu - вот неплохая статейка , они кстати и в космосе долго летали и в конце прошлого века на них много надежд возлагали
https://habr.com/ru/articles/133338/
вообще forth один из немногих языков в которм возможен почти 0-интерпритатор, тоесть можно писать вполне сложные и читабельные конструкции почти в машинных кодах.
ну собственно макроассемблер позволяет аналогичное делать на обычных cpu но заходит к задаче с другой стороны.
...чета я разболтался, новыйгод-прерывание видимо перекдючило контекст в процессоре
