.equ:
伪指令, 跟define一个意思.
例子:
.equ MEM_CTL_BASE, 0x48000000
.text:
可执行的代码段.
.global:
指定入口函数
bl:
转去指定位置执行, 类似调用函数.
例子:
bl disable_watch_dog @走去disable_watch_dog的代码段去执行
ldr:
LDR{条件} 目的寄存器,<存储器地址>
将一个立即数地址上的这个立即数传给一个寄存器
例子:
ldr r0, 0x12345678 @就是把0x12345678 这个地址中的值存放到r0中
ldr还有一个伪指令, 伪指令的形式是“LDR Rn,=expr”。
例子:
ldr pc, =on_sdram @程序指针pc, 指向一个on_sdram代码段
str:
跟ldr相反, 将寄存器值写入内存地址
例子:
str r1, [r0] @将r1寄存器的值, 写到r0里面储存的内存地址中去.
mov pc, lr
跟return一个意思, 从函数中跳回.
局部标签+cmp+bne 1b
1:
一般是先cmp, 如果ne(not equals), 就往回(b)跳到(1)标签位置,
例子:
1:
..... @blabla
cmp r1, r3 @比较R1跟R3的值
bne 1b @ 如果不想等, 就再来一遍, 类似一个while(r1 != r3){...}
mov pc, lr @ 如果相等了, 就回去函数被调用的地方后面继续.
.align 4
按4个byte对齐数据, 下面跟着一堆数据, 都按照4个byte大小对齐,方便读入到寄存器(32bit=4byte).
http://blog.csdn.net/xgx198831/article/details/8333446
@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@*************************************************************************
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
bl memsetup @ 设置存储控制器
bl copy_steppingstone_to_sdram @ 复制代码到SDRAM中
ldr pc, =on_sdram @ 跳到SDRAM中继续执行
on_sdram:
ldr sp, =0x34000000 @ 设置堆栈
bl main
halt_loop:
b halt_loop
disable_watch_dog:
@ 往WATCHDOG寄存器写0即可
mov r1, #0x53000000 @将立即数0x53000000写入寄存器R1
mov r2, #0x0 @将立即数0写入寄存器R2
str r2, [r1] @将R2里面的值写到R1所表示的内存中去.
mov pc, lr @ 返回
copy_steppingstone_to_sdram:
@ 将Steppingstone的4K数据全部复制到SDRAM中去
@ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
mov r1, #0 @R1是内存起始地址0, 也是steppingstone的开始地址
ldr r2, = SDRAM_BASE @用R2记录SDRAM的起始地址, 0x30000000
mov r3, #4*1024 @R3的值是要复制的数据的数量, 一共4KB
1:
ldr r4, [r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4
str r4, [r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
cmp r1, r3 @ 判断是否完成:源地址等于Steppingstone的未地址?
bne 1b @ 若没有复制完,继续
mov pc, lr @ 返回
memsetup:
@ 设置存储控制器以便使用SDRAM等外设
mov r1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的开始地址
adrl r2, mem_cfg_val @ 这13个值的起始存储地址, 就是mem_cfg_val标签所在的位置, 其实是不是类似于指针?
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