Посудите сами, что будет происходить в первой версии программы в следующем фрагменте кода:
Код: Выделить всё
call pause1; вызов нашей подпрограммы
; вот этот тип странной наружности ;)--
pause1
movwf TRISB
return
После вызова подпрограммы pause1 в стеке будет адрес возврата, а управление передастся на метку pause1. Оператор movwf TRISB проработает, затем return вынет адрес возврата из стека и передаст управление на команду, следующую за инструкцией call pause1, т.е. опять на метку pause1. Это только Вы знаете, что это должна быть подпрограмма. Процессору это все равно, он и не знает, что такое подпрограммы вообще. Короче, тело подпрограммы выполнится опять и при выполнении команды return процессор полезет в стек за адресом возврата. А там ничего нет. Поэтому и Stack Underflow.