程序使用Keil RealView MDK-v4.00进行编译、仿真通过
实验用SOC:S3C2440
注意仿真时的内存权限问题,在开始仿真后,请先设置内存访问权限,参考权限如下:
map 0,4096 read write exec
map 0x53000000,0x5300FFFF read write
PRESERVE8
AREA RESET, CODE, READONLY
ENTRY
Reset
ldr sp, =4096 ;@ 设置栈指针到4KB SRAM末尾,以下都是函数,调用前需要设好栈
bl disable_watch_dog ;@ 关闭WATCHDOG,否则CPU会不断重启
bl main ;@ 调用main函数
b Reset
main
stmfd sp!,{r0-r7,lr};保存现场
adr r0,str2
adr r1,str1
mov r2,#45
bl memcpy
ldmfd sp!,{r0-r7,pc};从子程序返回并恢复现场
;@关看门狗定时器
disable_watch_dog
mov r0,#0x53000000
mov r1,#0
str r1,[r0]
mov pc,lr
;memcpy(char *dst, const char *src, int sz)
;功能:拷贝字符串
;参数:r0~dst目标数据地址指针,r1~src源数据指针,r2~sz待拷贝的块的大小
;返回值:r0~size_t 拷贝大小
memcpy
stmfd sp!,{r3-r7,lr};保存现场
mov r3,#0
;当块大小>=16*n时,使用块拷贝寻址加快执行速度
memcpy_loop
ldmia r1!,{r4-r7}
stmia r0!,{r4-r7}
add r3,r3,#16
and r4,r2,#~0x0f
cmp r3,r4
bne memcpy_loop
;剩余字节如果>=4*n时,使用字拷贝
memcpy_loop0
ldr r4,[r1],#4
str r4,[r0],#4
add r3,r3,#4
and r4,r2,#~0x03
cmp r3,r4
bne memcpy_loop0
;使用字节拷贝处理其余待拷贝数据
memcpy_loop1
ldrb r4,[r1],#1
strb r4,[r0],#1
add r3,r3,#1
cmp r3,r2
bne memcpy_loop1
mov r0,r3 ;设置返回值
ldmfd sp!,{r3-r7,pc};从子程序返回并恢复现场
str1 ;定义16个字
dcd 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
str2
dcd -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
END