ARM9汇编程序内存拷贝(块寻址,快速执行)

程序使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanzhong104204

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值