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

浅析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].

阅读(1072) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值