(&)的地址从符号表中获取值

时间:2014-10-17 23:34:54

标签: c assembly linker

我有一个关于如何在符号表中放置符号以及如何从C中引用这些符号的问题。

因此,假设我有一个启动程序集文件,其中一些基本的东西在调用main()之前完成。它所做的一件事就是导出几个定义堆栈的符号。

St_Length       EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
                EXPORT  St_Length
                EXPORT  ra_Stack
ra_Stack        SPACE   St_Length

然后在我想要引用那些符号的source.c文件中,我有类似的东西:

extern uint32_t St_Length; /* exported from asm.s */
void func( void )
{
    uint32_t i;
    for(i = 0; i < (uint32_t)(&St_Length); ++i)
        \\do something
}

这似乎工作正常,即它实际上将执行该循环0x400次。我的问题是为什么我必须使用&符号来获取我认为应该是符号的,而不是符号的地址?

注意:这适用于使用Keil提供的工具链的ARM Cortex-M3。

感谢您的帮助。

编辑:以下是生成的地图文件中符号表的相关部分:

 Global Symbols

    Symbol Name                              Value     Ov Type        Size  Object(Section)


    St_Length                               0x00000400   Number         0  startup_stm32f10x_md.o ABSOLUTE

对符号表'type'列的任何解释也都非常有用。

1 个答案:

答案 0 :(得分:0)

因为您使用EQU已将St_Length定义为地址0x400的符号。要在某个适当的地址将其定义为变量,您应该尝试以下方式:

St_Length DCD 0x400

(把它放在你的数据区。)