All of these answers are based on "common processor architectures", and since it involves generating assembler code, it should be "target" - if you decide to do this on processor X, which has some weird stack processing, obviously it’s not worth lower the screen that says [replace paper]. For x86 as a whole, the following are, unless otherwise indicated.
is it safe to move the stack pointers into some other area of memory?
Is the stack memory not "special"? I draw stream libraries should do something like this as they create more stacks ...
Memory as such is not special. However, this suggests that this is not for the x86 architecture, where the stack segment is used to limit the use of the stack. Although this is possible, it is quite rare in the implementation. I know that a few years ago Nokia had a special operating system that uses segments in 32-bit mode. As far as I can imagine now, the only thing I contacted with this is using the stack segment, as described in x86 segmentation mode.
Assuming that any memory area is safe for management using a stack of registers and instructions, I cannot think of why it would be a problem of calling any functions with a known call depth (i.e. there is no recursion, no pointers to functions), if this sum available on the virtual stack. Correctly?
Correctly. Until you expect that you can return to some other function without returning to the original stack. A limited level of recursion would also be acceptable if the stack were deep enough [there are certain types of problems that are certainly difficult to solve without recursion, such as searching for a binary tree).
stack overflow is obviously a problem in normal code, but will there be any additional catastrophic consequences for such a system overflow?
In fact, it would be a terrible mistake if you were a little unlucky.
I would suggest that you use a call to VirtualProtect() (Windows) or mprotect() (Linux, etc.) to mark the "end of the stack" as unreadable and impregnable, so that if your code accidentally leaves the stack, it will fire properly, and not some other more subtle undefined behavior [because it does not guarantee that the memory just below (lower address) is inaccessible, so you can overwrite some other useful things if it leaves the stack, and this may cause some it’s very difficult to debug errors].
Adding a bit of code that periodically checks the stack depth (you know where your stack starts and ends, so it shouldn't be difficult to check if the particular stack value is “out of range” [if you give yourself a little “extra buffer space” between the top part of the stack and the “we are dead” zone protected by you - the “collapse zone”, as they might call it if it was a car in disrepair]. You can also fill the entire stack with a recognizable template and check how many of them are “untouched” .