When the program is started the stack pointer ($sp) is initialized to 0x7FFFEFFC (the address of the last fullword below the top of user memory). As the program runs, the stack grows downward into the available space. The data segment grows upward as the program runs. Of course, in a dynamic program, the segments grow and shrink. If the combined size of the segments exceeds the available space their boundaries will meet somewhere in the middle of the range. When this happens there is no memory left.