используйте стек в подпрограммах (push/pop) для временного хранения значений.
Однако надо помнить, что при входе в подпрограмму на вершине стека будут лежать два байта адреса возврата, а потом - параметры. Так что сначала надо выбрать адрес возврата, потом параметры, а потом положить адрес возврата на место.
Т.е.
push param1 ;укладываем параметры подпрограммы в стек
push param2
...
push paramN
rcall SubRoutine ; команда rcall кладет в стек адрес возврата!
...
SubRoutine:
pop RetAddr1 ;сохраняем адрес возврата
pop RetAddr2
pop SubParamN ;выбираем параметры из стека
..
pop SubParam2
pop SubParam1
push RetAddr2 ;возвращаем адрес возврата на место
push RetAddr1
...
<Subroutine code>
...
ret ; команда ret выбирает адрес возврата из стека!
Как-то так... Или про параметры речи не шло?
Разница между теорией и практикой на практике гораздо больше, чем в теории.