I take it that the concept of a modular subroutine call/return existed prior to the concept of a call stack (and hence to the possibility of recursive subroutines or of recursion limits). I would guess that reentrant routines were conceived prior to preemptive multitasking (perhaps in the context of recursion or of hardware interrupt events). I expect some of these related concepts (like the notion of function arguments and return values, and local variable scopes) would have developed in concert with early high-level languages, although some would also be reflected in the evolution of different hardware instruction sets.
Does anyone know when (and in what order) these concepts developed? Are there any resources that cover the history of practical computer science at this level?