There are actually architectures that require the instruction sequences previously mentioned to call subroutines and return from subroutines (and not using push and pop, either!). However, most CISC architectures, and many RISC architectures, have dedicated instructions to call subroutines and return from subroutines.
For the i386 architectures, the following instruction can be used to call a subroutine:
This single instruction saves the return address (the address of the instruction following call f) on the stack, then branches to f.
To return from a subroutine:
This instruction, in contrast, pops the return address and continues execution there.