天天看点

关于局部变量在内存中的存储位置测试结论

局部变量保存在内存的哪个位置?

  • 结论
    • 测试文件
    • 测试文件及其相关代码
    • 查看反汇编文件start.dis

结论

局部变量保存在内存的

中!。

测试文件

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.
           

继续阅读