Besides basic instructions for a general-purpose computer (binary arithmetic, move instruction, and jump on condition), it seems you can't implement a universal turing machine (is that even the right term?) without something more. That something is the ability to do arbitrary levels of function calls, I believe, yet how does a CPU implement them?
Setting a return address before jumping to the function code works for one call, but what if there are nested function calls? How will the CPU keep track of all the return addresses?
Is there a return address stack on the CPU (limited to memory on chip), or is it emulated in software at the assembler using regular RAM?
(In case it matters, I'll ask on behalf of Intel 8088 or 80x86 CPUs.)
Thanks!