浅析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].
阅读(1479) | 评论(0) | 转发(0) |