Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59991
  • 博文数量: 17
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 14:14
文章分类

全部博文(17)

文章存档

2011年(1)

2009年(16)

我的朋友

分类: LINUX

2009-05-06 12:40:59

1.首先我们针对堆和栈中的分析进行gdb调试。

int b;                //栈 
char s[] = "abc";     //栈 ,在常量区也会有一份,在知道这里的时候会从常量区拷贝一份出来,填充到栈上。
char *p2;             //栈 
char *p3 = "123456";  //123456\0在常量区,p3在栈上。 
static int c =0;     //全局(静态)初始化区 
p1 = (char *)malloc(10); //堆
p2 = (char *)malloc(20); //堆

(gdb) p &b
$18 = (int *) 0x7fb95db0
(gdb) p &s
$17 = (char (*)[4]) 0x7fb95db4
(gdb) p &p2
$20 = (char **) 0x7fb95dac
(gdb) p &p3
$19 = (char **) 0x7fb95da8
(gdb) p &c
$27 = (int *) 0x410a54


执行到p2 = (char *)malloc(20)的时候,内存堆栈分布情况为:
在调用函数中执行
--参数n
   ....
   参数2
   参数1
   返回地址
--
在被调用函数中执行
临时变量

c   --
b   --  这是一个从静态变量区拷贝过来的数组,放在栈中。
s = a  --
b
p2
p3


在mipsel上面反汇编看看,多么整齐的4字节指令啊
(gdb) disassemble main
Dump of assembler code for function main:
0x004006c0 :    lui    gp,0x2
0x004006c4 :    addiu    gp,gp,-31936
0x004006c8 :    addu    gp,gp,t9
0x004006cc :    addiu    sp,sp,-56
0x004006d0 :    sw    ra,52(sp)
0x004006d4 :    sw    s8,48(sp)
0x004006d8 :    move    s8,sp
0x004006dc :    sw    gp,16(sp)
0x004006e0 :    lw    v1,-32740(gp)
0x004006e4 :    addu    zero,zero,v0
0x004006e8 :    lw    a0,2472(v1)
0x004006ec :    addiu    v0,v1,2472
0x004006f0 :    lw    v0,4(v0)
0x004006f4 :    sw    a0,36(s8)
0x004006f8 :    sw    v0,40(s8)
0x004006fc :    addiu    v0,v1,2472
阅读(1006) | 评论(0) | 转发(0) |
0

上一篇:堆与栈

下一篇:dpkg工具高级使用

给主人留下些什么吧!~~