Müsste das Programm nach einem Interrupt nicht eigentlich an der Stelle weitermachen wo der Interrupt kam? Oder wird das Unterprogramm einfach abgebrochen?
Solange Du nicht am Stack rummanipulierst, sollte das Programm da weitermachen, wo es unterbrochen wurde.

Wenn Du verhindern willst, das bei einer Werteübergabe ein Interrupt auftritt, kannst Du vorher mit CLI die Interruptabarbeitung stoppen und danach gleich wieder mit SEI freigeben.

Beispiel:
In einem Interrupt wird ein 4Byte Zähler bearbeitet und im RAM zwischengespeichert.
Du verarbeitetst jetzt aber diese Werte im Hauptprogramm in Registern.
Also machst Du das so:
CLI
LDS r16,adr
LDS r17,adr + 1
LDS r18,adr + 2
LDS r19,adr + 3
SEI

Wenn jetzt also während der Werteübernahme dieser Interrupt auftreten würde, wird er aufgehalten, bist alle 4 Werte in den entsprechenden Registern sind.
Diese Wartezeiten sollten natürlich so kurz wie nur irgend möglich sein, sonst kommt dein Interrupttiming in Schwierigkeiten.