Advertisement

C语言(基于函数调用)使用堆栈而汇编语言不使用堆栈

阅读量:

在之前的学习过程中,笔者查阅了大量有关Uboot的资料,其中多次提到为C语言的执行环境准备堆栈。同时,在Uboot的start.S汇编代码中,也观察到系统初始化阶段存在堆栈指针初始化的操作。然而,尽管经常看到相关论述指出系统初始化需要对堆栈进行初始化,即正确设置堆栈指针sp的值,但始终未见有明确解释为何要进行这一步骤。因此,本文将通过深入分析,尝试解答这一问题:即为何C语言函数调用需要用到堆栈,而汇编代码却无需初始化堆栈。

要理解这一问题的前提是了解堆栈的功能。关于堆栈的具体作用若要详尽阐述则需大量篇幅,在此仅作简要介绍。总体而言,堆栈的主要功能包括保存现场或上下文以及传递参数。

所谓保存现场或上下文,其含义类似于案发现场的情境记录。若未及时记录这些信息,则可能被后续操作破坏而导致无法恢复原状。此处所指的“现场”即为CPU运行时所使用的寄存器状态(如r0、r1等)。如果在跳转至子函数执行前没有保存这些寄存器的内容,则其值可能被子函数修改或覆盖。因此,在调用子函数之前应当先将这些寄存器的状态临时存储起来,并在子函数执行完毕返回后重新恢复这些状态,从而确保CPU能够继续正常运行。

在计算机领域,“上下文”一词对应的英文是context。所谓上下文即与当前CPU运行相关的所有信息内容,具体而言就是那些正在使用中的寄存器数据。因此,“保存现场”和“保存上下文”实际上是同一概念的不同表

全部评论 (0)

还没有任何评论哟~