Аппаратно сохраняются лишь R0-R3, R12, LR, PC и PSR; остальные регистры, если надо, должен сохранять сам программист (ну или компилятор, если обработчик прерывания пишется на языке высокого уровня). И не обязательно в главном стеке -- сохраняются они в стеке, который был активен на момент прерывания (а это может быть и стек процесса -- это уж как программа написана). Более-менее полная "выжимка" из документации по поводу обработки прерываний имеется
здесь. Конечно, всё это расписано в документации, но там разбросано по многим страницам, да ещё часто представлено в виде псевдокода; как по мне, текстовое описание того, что делается, удобней, чем делающий это код.
Более приортитетное прерывание прерывает текущий обработчик, если последний не успел поднять свой приоритет (например, вообще запретить прерывания); в таком случае в стеке сохраняются регистры прерванного обработчика. В итоге в стеке (или двух стеках -- первый раз в стеке процесса, дальше -- в главном стеке) регистры могут сохраняться многократно, поэтому надо следить, чтобы его размеры были достаточны.