ARM中变量存放的位置

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值