【发布时间】:2018-02-01 19:24:28
【问题描述】:
AVR C 编译器是否让程序记住 SRAM 中函数开始将其数据(变量、数组)存储在数据堆栈中的索引寄存器之一的地址,以便通过公式获得局部变量的绝对地址:
absoluteAdr = functionDataStartAdr + localShiftOfVariable.
当变量声明的长度或堆栈指针在函数的结束/开始增加所有变量长度时,它们是否会增加数据堆栈点。
【问题讨论】:
-
你尝试的时候发生了什么?你的编译器做了什么?
-
这就是我的意思,去试试吧,我假设你已经有 gcc 或其他免费/试用版之一......
-
我们知道答案是肯定的并且知道,你的问题有点含糊,我理解语言障碍,这很好。显然编译器必须生成可以寻址/访问变量的代码。有时变量被优化为寄存器,有时是地址。有时它是 pc 相对的,有时它是绝对的。并且与架构提供的内容以及编译器作者选择的内容有很大关系。
-
当项目在堆栈上时,它通常是通过引用,特别是对于 C,堆栈指针或带有一些偏移量的帧指针,所以是的,基数加偏移量提供了绝对值。 pc relative 是 pc 加上一个偏移量提供了一个绝对值。对于全局变量或静态局部变量,编译器通常会留下一个 pc 相对位置(这里一般来说,根据需要将其应用于 AVR 或其他),链接器稍后会用绝对地址填充该相对位置。如果您提供与位置无关的代码 (PIC),那么您会玩更多游戏
-
有时一个变量甚至会在一个有地址的寄存器中结束(这可能会更令人困惑) - AVR gcc 有点特殊,因为它似乎将寄存器作为寄存器和内存来寻址(在 AVR 寄存器文件中)
标签: c compiler-construction microcontroller avr ram