Chinaunix首页 | 论坛 | 博客
  • 博客访问: 375143
  • 博文数量: 110
  • 博客积分: 2990
  • 博客等级: 少校
  • 技术积分: 1295
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-05 08:42
文章分类

全部博文(110)

文章存档

2013年(1)

2012年(8)

2011年(22)

2010年(14)

2009年(65)

我的朋友

分类:

2009-11-02 18:16:01

IAR C for SAM8 生成的目标文件中,自动在main()函数之前插入了一段启动代码,完成系统的初始化工作。
 

举例说明,某目标代码HEX文件中,地址0100开始的片段如下:

:100100008FE6D9BAFC00EC9AD6CF00FE00CEEBF811

:10011000F602DF8D1680F83656CF106B03B08FAF26

 

现对蓝底部分的代码分析如下:

 

行号  地址  十六进制代码   汇编代码                       相当于C语言代码

001                     ?CSTARTUP:

002  0100  8F             DI                            DI();

003                     __INIT_STACK:

004  0101  E6 D9 BA       LD      0xD9, #186            SP = 0xBA;

005                     __INIT_TINY_Z:

006  0104  FC 00          LD      R15, #0               for (p = 0; p < 0x9A; p++)

007  0106  EC 9A          LD      R14, #154                 *p = 0;

008                     ??CLEAR_RAM_0:

009  0108  D6 CF 00       LD      @R15, #0

010  010B  FE             INC     R15

011  010C  00 CE          DEC     R14

012  010E  EB F8          JR      NZ, ??CLEAR_RAM_0

013                     __MAIN_CALL:

014  0110  F6 02 DF       CALL    main                  main();

 

其中,蓝底红字部分因程序不同而异。

 
由此可以了解到,系统启动时,自动对堆栈指针进行了初始化,还对RAM进行了清零。
其中,堆栈指针的初始化值,与项目设置的堆栈大小(在菜单Project | Options,General中的Stack)有关,系统默认为32 bytes;还与应用程序RAM的使用情况有关,当应用程序RAM的剩余空间不足设置的堆栈大小时,编译链接时会报错。
 
转载请注明文章出处:
 
阅读(2193) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~