I'd say the main difference between functions and subroutines is variable scope.

In BASIC, a subroutine has access (or at least can have access) to all of the variables in your main routine. A C++ function has only local variables. You don't pass variables into functions. You pass-in values. Also, a function can only return one value.

If you want to affect more than one variable, you have to use pointers and/or references.

You can use global variables, but it is generally bad practice. (Function-libraries actually use globals rather freely.)

I seem to remember subroutines from Fortran too... but I'm not sure... too many years since I took a Fortran class! I also think that most assembly languages have subroutines... I think I first learned about stack operations when learning how subroutines are handled in assembly/machine code.