Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15531388
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2009-03-18 10:51:25

浅析ads下RW段都包含哪种数据

ADS设置RO Base=0x20000000;RW Base=0x80000000;
之后使用axd进行emulator,可以看到常数是直接被编译到RO空间,使用绝对地址方式

               AT91C_BASE_SMC2->SMC2_CSR[0] = (AT91C_SMC2_NWS & 0x4) | AT91C_SMC2_WSEN
对应的汇编
[0xe59f13b0]   ldr      r1,0x2000eb04 ; = #0x00003284
[0xe5001090]   str      r1,[r0,#-0x90]

这个因为=后面的数值比较小,在mov范围,所以ldr r0,=直接被翻译成了mov r0, #0x20操作
               ldr     r0, =0x00000020
[0xe3a00020]   mov      r0,#0x20
这个因为=后面的数值比较大,不再mov范围,所以被翻译成了ldr,数值0x00201000被存放到了ROM的0x20000108地址处
               ldr     r1, = 0x00201000
[0xe59f10d4]   ldr      r1,0x20000108 ; = #0x00201000


===将立即数存入r1寄存器
               mov      r1,#0x20000000
[0xe3a01580]   mov      r1,#0x20000000
===将PC值取出存入r0中
               mov      r0,pc
[0xe1a0000f]   mov      r0,pc
===将取出HOP的绝对地址值,赋值给pc
               ldr      pc,=HOP
对应的反汇编
[0xe59ff050]   ldr      pc,0x2000010c ; = #0x200000b8


===
static uint8 static_tmp = 0xaa; //这个静态变量的数据被存储到了RW区域的0x80010739地址
uint8 local_tmp = 0xbb;//局部变量被忽略
    ++static_tmp;   
[0xe59f11a4] * ldr      r1,0x2000eb28 ; = #0x80010739
......
[0xe5d10000]   ldrb     r0,[r1,#0]
[0xe2800001]   add      r0,r0,#1
[0xe5c10000]   strb     r0,[r1,#0]
    ++local_tmp;

===
[0xe92d4030] * stmfd    r13!,{r4,r5,r14}
......
[0xe24dd064]   sub      r13,r13,#0x64 //从栈上申请局部变量存储空间
//*
uint8 status;
static uint8 static_tmp = 0xaa;
uint8 local_tmp = static_tmp;
[0xe59f21b0]   ldr      r2,0x2000eb38 ; = #0x80010739
......
[0xe5d20000]   ldrb     r0,[r2,#0]
uint8 local_array[100];
    ++static_tmp;   
    static_tmp = ++local_tmp * local_array[0];
 
[0xe5dd1000]   ldrb     r1,[r13,#0]
[0xe2800001]   add      r0,r0,#1
[0xe0000091]   mul      r0,r1,r0
[0xe5c20000]   strb     r0,[r2,#0]
===
uint8 global_var_test = 0x55; //定义全局量,
void AT91F_LowLevelInit()
{
[0xe92d4038]   stmfd    r13!,{r3-r5,r14}
//*
uint8 status;
    global_var_test++; 
[0xe59f11a4] * ldr      r1,0x2000eb28 ; = #0x80010739//该全局量存储在RW空间
......
[0xe5d10000]   ldrb     r0,[r1,#0]      //取出数值
[0xe2800001]   add      r0,r0,#1        //执行++操作
[0xe5c10000]   strb     r0,[r1,#0]      //回写

所以可以看到RW,ZI等空间存描述的全都是static量或者全局变量,因此对于local局部变量来说,或者使用r0...等寄存器替代
或者直接从sp,r13寄存器申请临时存储空间,所以在使用static量或者全局变量之前,必须执行RW,ZI空间初始化操作,即执行
Image$$RO$$Limit
Image$$RW$$Base
Image$$ZI$$Base
Image$$ZI$$Limit
存储段的加载初始化操作,必须在执行bl Main跳转之前完成[luther.gliethttp].

 
阅读(1489) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~