四种栈模型,
满栈减,Full Descending
满栈增,Full Ascending
空栈减,Empty Descending
空栈增,Empth Ascending
增/减:ascending/descending,是针对压栈的时候,入栈的时候地址是变大还是变小定义的。
满栈/空栈:满栈是先移动sp指针在存储数据,空栈是先存储数据在移动sp指针.
满栈:SP 指着最后一个被放进去的有效数据(“脚”踩在货物上)。
空栈:SP 指着下一个将要放数据的空位置(“手”指着空货架)。
FD(满递减):压栈用 STMDB,出栈用 LDMIA。(匹配)
FA(满递增):压栈用 STMIB,出栈用 LDMDA。
ED(空递减):压栈用 STMDA,出栈用 LDMIB。
EA(空递增):压栈用 STMIA,出栈用 LDMDB。
| 栈模型 | 英文全称 | 压栈指令 (存储) | 出栈指令 (加载) | 指针变化逻辑 |
|---|---|---|---|---|
| 满递减 (FD) | Full Descending | STMDB | LDMIA | 先减后存 / 先取后加 |
| 满递增 (FA) | Full Ascending | STMIB | LDMDA | 先加后存 / 先取后减 |
| 空递减 (ED) | Empty Descending | STMDA | LDMIB | 先减后存 / 先加后取 |
| 空递增 (EA) | Empty Ascending | STMIA | LDMDB | 先存后加 / 先减后取 |
满栈:sp指针指向栈顶
空栈:sp指针指向栈底
这四个后缀决定了基址寄存器(如 SP)如何变化以及变化发生在传输前还是传输后:
| 后缀 | 全称 | 指针变化 | 先操作还是先变化 | 适用场景 |
|---|---|---|---|---|
| IA | Increment After | 地址递增 | 先传输数据,指针再 +4 | 出栈(Pop)、正向遍历数组 |
| IB | Increment Before | 地址递增 | 指针先 +4,再传输数据 | 正向遍历(较少用) |
| DA | Decrement After | 地址递减 | 先传输数据,指针再 -4 | 逆向遍历(较少用) |
| DB | Decrement Before | 地址递减 | 指针先 -4,再传输数据 | 压栈(Push)、逆向填充 |