Цитата(Krom @ May 17 2011, 16:48)

; сохраняем регистр прерываний
push IE
; запрещаем прерывания
clr EA
; берем требуемый адрес
mov DPTR,#PROCESS
; подсовываем в стек
push DPH
push DPL
; и выходим куда нужно
reti
Кстати, если уж на то пошло, именно в таком варианте (с одной конкретной «подпрограммой завершения», в стек заносится фиксированный адрес) на 51-ых это решалось короче:
Код
tf0_isr:
_push <PSW, ACC, AR0>
...
breq @@PROCESS; ну к примеру так решили, что надо проджолжать на низком приоритете
_pop <AR0, ACC, PSW>
@@reti: ; в очередной раз спасибо VslavX за утилтику «локальных меток»
reti
@@PROCESS:
acall @@reti
; а вот тут и начинается код того PROCESS -- тут уже уровень прерывания очищен
; выполнение продолжается на уровне приоритета основной программы
...
...
_pop <AR0, ACC, PSW>
ret
Т.е. вместо занесения в DPTR константы и заталкивания её в стек (или через аккумулятор -- на байт длиннее, но не нужно DPTR трогать) -- одна команда acall.
reti есть что там, что там. Помнить про пушнутое и попать его -- тоже.
Цитата(VslavX @ May 17 2011, 22:10)

При этом RTOS уже не нужна - работает специальная процедура - вот тут то и потребовалось сделать возврат из прерывания в особую точку.
Знакомо, хотя и с «суперциклом», а не с нормальной ОС.
Один из тех исключительных случаев, когда это действительно нужно.