Эх хотелось повторить срачик по терминологии процедур и функций, но сдержусь
А указателей на регистры не бывает
Как это не бывает? Регистр - такая же ячейка памяти, как остальные. Написать что-то вроде sts 0, r16 никто не мешает, результатом будет медленное (2 такта вместо 1) копирование r16 в r0
в C, по определению, при выходе из функции обязаны содержать значения, которые были до вызова функции.
Не забывайте про оптимизацию. На уровне ЯВУ это указатели, а на уровне машинных команд может быть прямая запись в регистры.
Функция - получивший деньги у программиста идет в магазин, покупает пиво и приносит его программисту,который дал деньги.
Процедура - получивший деньги идет в магазин, покупает пиво и все. Что происходит с пивом - проблема программиста, давшего деньги.
Если целью программиста было пиво, то вызов функции вернет это пиво ему прямо в руку (прямо в то место откуда была вызвана), а процедура - в любое указанное место (задаваемое указателем). Если же программиста интересовал процесс - он может сразу выронить принесенное ему функцией пиво (не сохранять результат работы), либо не указывать процедуре адрес.