局部变量保存在内存的哪个位置?
结论
局部变量保存在内存的栈
中!。
测试文件
1、start.S
2、main.c
3、Makefile
测试文件及其相关代码
-
1、start.S
- 汇编启动代码,主要定义栈顶位于内存4096处(sp=4096),然后马上跳转进入C代码的main函数
.text
.global _start
_start:
ldr sp,=1024*4
bl main
loop:
B loop
-
2、main.c
-
从汇编跳转到main.c后,随即会进入main()函数,这时定义了一个局部变量
int a = 7
; 然后通过后面反汇编,我们就可以看到这个局部变量是位于内存的哪个区域;
#define GPFCON *(volatile unsigned long int*)0x56000050
#define GPFDAT *(volatile unsigned long int*)0x56000054
void delay()
{
GPFDAT = 0x60;
}
int main()
{
int a = 7;
GPFCON = 0x1500;
GPFDAT = 0x20;
delay();
}
-
3、Makefile
- 使用arm-linux-gcc交叉编译得到反汇编文件start.dis,我们可以从里面看到局部变量存储在内存中的什么位置;
all:
arm-linux-gcc -c -o start.o start.S
arm-linux-gcc -c -o main.o main.c
arm-linux-ld -Ttext 0 start.o main.o -o start.elf
arm-linux-objcopy -O binary start.elf start.bin
arm-linux-objdump -D start.elf > start.dis
查看反汇编文件start.dis
从文件中可以看到:
- 0x00时,最开始时设置
sp
在内存的4096
处; - 0x2c时,ip=sp=4096;
- 0x34时,fp=ip-4=4092;
- 0x40时,局部变量值7(a=7)保存到
[fp, #-16]
的地方,即[4092-16]=[4076]
的地方;而0x30时,[4080]、[4084]、[4088]、[4092]
分别保存着汇编代码跳转到C代码main函数时的压栈参数fp、ip、lr、pc
;也就是说执行到局部变量的时候,从[4092]
开始,顺序往下保存了pc、lr、ip、fp、局部变量a;
***所以可以看到,局部变量保存在内存的栈中***
start.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:
0: e3a0da01 mov sp, #4096 ; 0x1000
4: eb000008 bl 2c <main>
00000008 <loop>:
8: eafffffe b 8 <loop>
0000000c <delay>:
c: e1a0c00d mov ip, sp
10: e92dd800 stmdb sp!, {fp, ip, lr, pc}
14: e24cb004 sub fp, ip, #4 ; 0x4
18: e3a03456 mov r3, #1442840576 ; 0x56000000
1c: e2833054 add r3, r3, #84 ; 0x54
20: e3a02060 mov r2, #96 ; 0x60
24: e5832000 str r2, [r3]
28: e89da800 ldmia sp, {fp, sp, pc}
0000002c <main>:
2c: e1a0c00d mov ip, sp
30: e92dd800 stmdb sp!, {fp, ip, lr, pc}
34: e24cb004 sub fp, ip, #4 ; 0x4
38: e24dd004 sub sp, sp, #4 ; 0x4
3c: e3a03007 mov r3, #7 ; 0x7
40: e50b3010 str r3, [fp, #-16]
44: e3a03456 mov r3, #1442840576 ; 0x56000000
48: e2833050 add r3, r3, #80 ; 0x50
4c: e3a02c15 mov r2, #5376 ; 0x1500
50: e5832000 str r2, [r3]
54: e3a03456 mov r3, #1442840576 ; 0x56000000
58: e2833054 add r3, r3, #84 ; 0x54
5c: e3a02020 mov r2, #32 ; 0x20
60: e5832000 str r2, [r3]
64: ebffffe8 bl c <delay>
68: e1a00003 mov r0, r3
6c: e89da808 ldmia sp, {r3, fp, sp, pc}
Disassembly of section .comment:
00000000 <.comment>:
0: 43434700 cmpmi r3, #0 ; 0x0
4: 4728203a undefined
8: 2029554e eorcs r5, r9, lr, asr #10
c: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}
10: Address 0x10 is out of bounds.