PIC16FXXX之堆栈分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

9. Func1 函数返回时,将取出当前堆栈指针所在的第 1 级堆栈上的数据作为返回地址,由于前面进入 Func9 函数时,发生堆栈溢出,将这第 1 级堆栈上的数据改写了,变成了返回 Func8 函数的地址 07D4(正 确数据应是: 07C9). 于是,程序取出 07D4 作为 Fun1 函数的返回地址, 这使得程序又返回到了 Func8 函数,于是程序进 入了 Func8->Func7->...Func2->Func1->Func8 这种错误的死循环之中。
MCU 型号: PIC16FXXX
PIC16FXXX 之堆栈分析
源自文库void main() {
.... Func1(); while(1) { } } void Func1() { Func2(); } void Func2() { Func3(); } void Func3() { Func4(); } void Func4() { Func5(); } void Func5() { Func6(); } void Func6() { Func7(); } void Func7() { Func8(); } void Func8() { Func9(); } void Func9() { ...; }
进入 Func4 后,堆栈指针指向第 4 级堆栈,返回到 Fun3 地址放在 4 级堆栈上:
进入 Func5 后,堆栈指针指向第 5 级堆栈,返回到 Fun4 地址放在 5 级堆栈上:
进入 Func6 后,堆栈指针指向第 6 级堆栈,返回到 Fun5 地址放在 6 级堆栈上:
进入 Func7 后,堆栈指针指向第 7 级堆栈,返回到 Fun6 地址放在 7 级堆栈上:
在进入 Func1 之前, 堆栈指针指向 0 硬件堆栈全部为空,处于末用状态
进入 Func1 后,堆栈指针指向第 1 级堆栈,返回地址(while(1)指令)放在这级堆 栈上: 进入 Func2 后,堆栈指针指向第 2 级堆栈,返回到 Fun1 地址放在 2 级堆栈上:
进入 Func3 后,堆栈指针指向第 3 级堆栈,返回到 Fun2 地址放在 3 级堆栈上:
Func8 函数的地址。 于是程序能够正确的返回到 Func8 函数上。 然后堆栈指针减一,就指向了第 8 级堆栈。 2. Func8 函数返回时,取出当前堆栈指针所在的第 8 级堆栈上的数据:07D9 作为返回地址,这是返回到 Func7 函数的地址。 于是程序能够正确的返回到 Func7 函数上。 然后堆栈指针减一,就指向了第 7 级堆栈。 3. Func7 函数返回时,取出当前堆栈指针所在的第 7 级堆栈上的数据:07E0 作为返回地址,这是返回到 Func6 函数的地址。 于是程序能够正确的返回到 Func6 函数上。 然后堆栈指针减一,就指向了第 6 级堆栈。 4. Func6 函数返回时,取出当前堆栈指针所在的第 6 级堆栈上的数据:07E7 作为返回地址,这是返回到 Func5 函数的地址。 于是程序能够正确的返回到 Func5 函数上。 然后堆栈指针减一,就指向了第 5 级堆栈。 5. Func5 函数返回时,取出当前堆栈指针所在的第 5 级堆栈上的数据:07EE 作为返回地址,这是返回 到 Func4 函数的地址。 于是程序能够正确的返回到 Func4 函数上。 然后堆栈指针减一,就指向了第 4 级堆栈。 6. Func4 函数返回时,取出当前堆栈指针所在的第 4 级堆栈上的数据:07F5 作为返回地址,这是返回到 Func3 函数的地址。 于是程序能够正确的返回到 Func3 函数上。 然后堆栈指针减一,就指向了第 3 级堆栈。 7. Func3 函数返回时,取出当前堆栈指针所在的第 3 级堆栈上的数据:07FC 作为返回地址,这是返回 到 Func2 函数的地址。 于是程序能够正确的返回到 Func2 函数上。 然后堆栈指针减一,就指向了第 2 级堆栈。 8. Func2 函数返回时,取出当前堆栈指针所在的第 6 级堆栈上的数据:07E7 作为返回地址,这是返回到 Func7 函数的地址。 于是程序能够正确的返回到 Func1 函数上。 然后堆栈指针减一,就指向了第 1 级堆栈。
进入 Func8 后,堆栈指针指向第 8 级堆栈,返回到 Fun7 地址放在 8 级堆栈上:
进入 Func9 后,堆栈指针指向第 1 级堆栈,返回到 Fun8 地址放在 1 级堆栈上: 这时,就发生了堆栈溢出:
堆栈溢出后,堆栈指针如下:
堆栈溢出后,程序返回情况分析: 1. Func9 函数返回时,取出当前堆栈指针所在的第 1 级堆栈上的数据:07D4 作为返回地址,这是返回到
另注:由于程序中肯定使用中断程序,而中断程序也会占用一级硬件堆栈,所以,给我们的最多只有 7 级硬件堆栈可用,也就是说,函数嵌套调用不能超过 7 个。
szdbg@sina.com 2009-07-09
相关文档
最新文档