Recursion in assembly makes stack frames tangible: each call physically pushes a return address and locals, which is why deep recursion overflows and why compilers do tail-call optimization. Seeing gcc turn your factorial into a loop at -O2 is the classic first encounter with serious compiler transformation.