MDK中,ARM局部变量和全局变量存于什么位置,是堆上还是栈上,对这个问题一直比较含糊,感觉局部变量应该是存放在栈上,而全局变量和静态局部变量应该是放在堆上。今天彻底弄清楚了,有代码为证。
一、定义时未初使化的情况
1. 普通局部变量。
#include <string.h>
int main()
{
int intx[0x100][0x100];
memset(intx, 0x00, sizeof(intx));
intx[0][0] = 1;
}
编译后,看对应的 .txt 文件
;;;2 int main()
000000 e52de004 PUSH {lr}
;;;3 {
000004 e24dd701 SUB sp,sp,#0x40000
000008 e24dd004 SUB sp,sp,#4
;;;4 int intx[0x100][0x100];
;;;5 memset(intx, 0x00, sizeof(intx));
00000c e3a01701 MOV r1,#0x40000
000010 e28d0004 ADD r0,sp,#4
000014 ebfffffe BL __aeabi_memclr4
;;;6 intx[0][0] = 1;
000018 e3a00001 MOV r0,#1
00001c e58d0004 STR r0,[sp,#4]
;;;7 }
000020 e3a00000 MOV r0,#0
000024 e28dd701 ADD sp,sp,#0x40000
000028 e28dd004 ADD sp,sp,#4
00002c e49de004 POP {lr}
000030 e12fff1e BX lr
ENDP
000000
PUSH {lr}
保存调用此函数的地址
000004 SUB sp,sp,#0x40000 由此句可看出,的的确确是在栈上,0x40000即是intx的大小。
2. 静态局部变量
先以空函数编译,查看map文件
程序:int main()
{
// static int intx[0x100][0x100];
// memset(intx, 0x00, sizeof(intx));
// intx[0][0] = 1;
}
map

本文详细探讨了在MDK中,ARM处理器的局部变量和全局变量的存储位置。通过代码和编译后的映射文件分析,得出结论:普通局部变量存储在栈上,静态局部变量和全局变量存储在ZI段,初始化的全局变量存储在RW段。

625

被折叠的 条评论
为什么被折叠?



