BY eHWRITTEN ON HALO1 MIN READ
push stack
你说得完全对,我们现在来搞清楚为什么栈是“先进后出”(LIFO),即使它是从高地址往低地址生长的。 ✅ 结论先说: “先进后出”描述的是“逻辑顺序”, “从高地址往低地址生长”描述的是“物理实现”。 这两者没有矛盾! 我们来一步步看: 1. 栈逻辑上是个桶(LIFO): 你压入的数据是按顺序

你说得完全对,我们现在来搞清楚为什么栈是“先进后出”(LIFO),即使它是从高地址往低地址生长的。
✅ 结论先说: “先进后出”描述的是“逻辑顺序”, “从高地址往低地址生长”描述的是“物理实现”。 这两者没有矛盾!
我们来一步步看:
1. 栈逻辑上是个桶(LIFO): 你压入的数据是按顺序“堆叠”起来的,最后压进去的数据在最上面,最先弹出来,这就是“先进后出”。
举个例子:
push 1
push 2
push 3
此时栈从栈底到栈顶是:1 -> 2 -> 3,最上面是 3。
如果你现在 pop 三次,你会得到:3, 2, 1,先进(1)后出,后进(3)先出,这就是 LIFO。
2. 栈在内存里从高地址往低地址生长: 这是 CPU 架构决定的(如 x86),所以:
sp = 0x7c00
push ax ; 例:ax = 0x1234
CPU 会先让 sp -= 2,变成 0x7bfe,然后把 0x1234 写入 [0x7bfe]。
这样,越新的数据越放在低地址,但这并不改变“谁先压栈、谁后出栈”的逻辑顺序。
3. 举个图示帮助你理解:
| 地址 | 内容 |
|---|---|
| 0x7bfe | 0x1234 (最后压入) |
| 0x7c00 | 0x5678 (更早压入) |
| … | … |
现在 sp 指向 0x7bfe,如果 pop,先弹出 0x1234,再 pop 才是 0x5678。
所以: - 逻辑顺序是“先进后出” - 地址增长方向是“高地址 → 低地址”