Anyway, when I took an assembly course a couple years back, we referred to passing on the stack as "the C calling convention," so I suppose I'm probably overgeneralizing.
Yes - there's no such thing as "the C calling convention", there are just conventions for particular instruction sets and, as indicated, most of the conventions involve passing some parameters in registers.
Obviously you have to be careful when passing by register though, as many ops destroy register values so you can't expect them to retain their starting value when you return, unless you manually restore them inside the subroutine. I suppose that's a general observation of anything you do in assembly, though.
Yes, if programming in assembler, or developing a compiler, you have to make sure you know whether a register gets overwritten, but that's not specific to passing parameters in registers.