程序计数器(PC)、堆栈指针(SP)与函数调用过程 |
您所在的位置:网站首页 › 单片机pc值怎么计算 › 程序计数器(PC)、堆栈指针(SP)与函数调用过程 |
PC(program counter)是CPU中用于存放下一条指令地址的寄存器,SP为堆栈指针。下面将介绍函数调用过程中CPU对PC和SP这两个寄存器的操作。 假设有如下函数Fun Fun() { ………………… Sub-fun(a, b); ………………… }当函数Fun调用其子函数sub-fun时,CPU内部执行情况如下: 1. 执行CPU指令push,将参数a、b入栈,即根据CPU SP寄存器的值,把a、b的值存入SP指向的地址,并把SP减1(栈通常从高地址向低地址生长)。 2. 执行CPU指令call,CPU会把目前PC寄存器的值push到heap中,这个动作意味着存储返回地址。 3. 接着CPU把PC寄存器的值设为函数sub-fun的地址,则下个被执行的指令就是函数sub-fun的第一行语句。 4. 当函数sub-fun在执行时,可以根据目前SP寄存器的值计算出参数a、b的地址。 5. 如果函数sub-fun有定义局部变量,这些变量的地址会从目前heap的顶端继续生长(这就是为什么我们在嵌入式开发时,总是会要求应用程序工程不要定义size太大的局部变量,否则容易导致栈溢出的原因)。 6. 当函数sub-fun执行完毕后,CPU会执行ret指令,这个命令会从heap顶端pop出返回地址——即调用sub-fun之前Fun函数执行到的语句的地址,然后更改PC寄存器的值为这个返回地址,则下个指令就会返回执行函数sub-fun的下一行语句,从而完成了函数调用。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |