ARM堆栈操作原理咨询:升降序、满空栈定义与push溢出问题
ARM堆栈相关问题解答
1. 升序(ascending)和降序(descending)堆栈的定义
- 升序堆栈:也叫递增栈,栈顶地址会随着数据入栈逐步向高地址方向增长,每压入一份新数据,栈指针就会向地址更大的方向偏移对应长度。
- 降序堆栈:也叫递减栈,栈顶地址会随着数据入栈逐步向低地址方向增长,每压入一份新数据,栈指针就会向地址更小的方向偏移对应长度,这是ARM架构默认使用的堆栈增长方向。
2. 满栈(full)和空栈(empty)的定义
- 满栈:栈指针始终指向栈内最后一个已经存入的有效数据的位置,当前栈指针指向的地址已经存储了合法的栈数据。
- 空栈:栈指针始终指向栈内下一个可写入数据的空闲位置,当前栈指针指向的地址还没有存入有效栈数据。
以上两个属性可以组合出ARM支持的四种堆栈类型:满升序(FA)、满降序(FD)、空升序(EA)、空降序(ED),其中满降序(FD)是实际开发中最常用的堆栈类型。
3. 满栈场景下执行push指令是否会导致栈溢出
栈溢出和堆栈是满栈还是空栈没有直接关联,仅和当前栈的剩余可用空间、以及push操作要写入的数据量有关。
满栈的标准push操作流程为:先按照堆栈的升降规则把栈指针偏移到新的可写位置,再把数据写入新的栈指针地址,最终栈指针保持指向刚写入的有效数据,符合满栈的定义。
只要当前栈的剩余空间足以容纳push操作要写入的所有数据,操作就不会触发溢出;如果剩余空间不足,不管是满栈还是空栈,执行push都会出现栈溢出,导致非法内存访问问题。
内容的提问来源于stack exchange,提问作者Circuit_Breaker0.7
相关产品推荐
相关产品推荐

