当推入堆栈时,GNU Arm嵌入式C工具链是否会跳过内存地址?

时间:2018-01-22 23:22:51

标签: c stack embedded stm32f4

我刚刚介绍了我为STM32F4开发板编写的一些简单的C代码。我正在使用GNU Arm Embedded Toolchain构建代码。主要功能很简单:

int main()
{
    unsigned int ledOn1 = LED1;  // (1 << 12)
    unsigned int ledOn2 = LED3;  // (1 << 14)

    Init(ledOn1, ledOn2);        //  <-- First breakpoint
    while(1);
}

Init功能也很简单:

void Init(int led1, int led2)
{
    // Set given LEDs
    lightsOn = led1 | led2;  //  <-- Second breakpoint

    // Etc...
}

对我来说有趣的是在进行函数调用时如何将数据压入堆栈。

在调用Init函数的“main”行中设置断点,堆栈指针为0x2001fff0,堆栈如下所示:

enter image description here

然后在Init()的第一行代码中设置下一个断点 - 行lightsOn = led1 | led2;。因此,当我们前进时,我们看到堆栈变化如下:

enter image description here

我们看到0x2001FFF0的旧堆栈指针被压入内存位置0x2001FFEC的堆栈。并且Init函数的参数也被推送到位置0x2001FFE40x2001FFE0的堆栈上。但是,我不确定为什么跳过堆栈上的内存地址0x2001FFE8?任何人吗?

0 个答案:

没有答案
相关问题