学习韦东山老师sdram 实例程序,有部分看不懂什么意思,问题如下:
mov r1, #1207959552 @ #1207959552=0x48000000 存储控制器的13个寄存器的开始地址
adrl r2, mem_cfg_val @ 这13个值的起始存储地址
add r3, r1, #52 @ 13*4 = 54
1:
ldr r4, [r2], #4 @ 读取设置值,并让r2加4
str r4, [r1], #4 @ 将此值写入寄存器,并让r1加4
cmp r1, r3 @ 判断是否设置完所有13个寄存器
bne 1b @ 若没有写成,继续
mov pc, lr @ 返回
.align 4
mem_cfg_val:
@ 存储控制器13个寄存器的设置值
.long 0x22011110 @ BWSCON
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7
.long 0x008C07A3 @ REFRESH
.long 0x000000B1 @ BANKSIZE
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7
第一次执行 adrl r2, mem_cfg_val 是将mem_cfg_val的地址放到r2中, mem_cfg_val是标号,无实际意义,mem_cfg_val的地址就是 第一个立即数 0x22011110 所在的地址,也就是说, adrl r2, mem_cfg_val 是将立即数 0x22011110 所在的地址放到任中。
ldr r4, [r2], #4 @ 将0x22011110写入r4,并r2=0x22011110所在的地址+0x4,此时,r2中的数表示的
@是第二个值0x00000700 所在的地址(.long表示定义长整型占4个字节,0x00000700
@所在的地址=0x22011110所在的地址+0x4)
str r4, [r1], #4 @ 将0x22011110写入到地址0x48000000,并r1=0x48000000+0x4=0x48000004
cmp r1, r3 @ 判断是否设置完所有13个寄存器
bne 1b @ 若没有写成,继续 ldr r4, [r2], #4 (将0x00000700写到r4中,......)......