ARM体系结构与编程学习(五)
2011-04-27 22:47
330 查看
4.6.2 arm汇编实例
;设置本段程序的名称及属性
AREA BLOCK , CODE , READONLY
;设置将要复制的字数
num EQU 20
;标识程序入口点
ENTRY
Start
;R0寄存器指向源数据区src
LDR R0,=src
;R1寄存器指向目标数据区dst
LDR R1 ,=dst
;R2指定将要复制的字数
MOV R2, #num
;设置数据栈指针(R13),用于保存工作寄存器数值(设定SP堆栈开始地址为0x400)
MOV SP,#0X400
;进行以8个字为单位的数据复制
blockcopy
;需要进行的以8个字为单位的复制次数
MOVS R3,R2,LSR #3
;对剩余不足8个字的数据,,跳转到copywords,以字为单位进行复制
BQE copywords
;保存工作寄存器
STMFD SP!,{R4-R11}
Octcopy
;从源数据读取8个字的数据,放到8个工作寄存器中,并更新目标数据区指针R0
LDMIA R0!,{R4-R11}
;将这8个字数据写入到目标数据区中,并更新目标数据区指针R1
STMIA R1!,{R4-R11}
;将块复制次数减1
SUBS R3,R3,#1
;循环,直到完成以8字为单位的块复制
BNE Octcopy
;恢复工作寄存器值
LDMFD SP!,{R4-R11}
copywords
;剩余不足8个字的数据的字数(逻辑与,把R2 前7 位扔掉)
ANDS R2,R2,#7
;数据复制完成
BEQ stop
wordcopy
;从源数据读取1个字的数据,放到寄存器R3中,并更新目标数据区指针R0
LDR R3,[R0],#4
;将这R3中数据写入到目标数据区中,并更新目标数据区指针R1
STR R3 ,[R1],#4
;将字数减1
SUBS R2,R2,#1
;循环,直到完成以字为单位的数据复制
BNE wordcopy
stop
;调用angel_SWIreason_ReportException
;ADP_Stopped_ApplicationExit
;ARM semihosting SWI
;从应用程序中退出
MOV R0, #0X18
LDR R1,=0X20026
SWI 0X123456
;定义数据区blockdata
AREA Blockdata, DATA, READONLY
;定义源数据src及目标数据区dst
src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;结束汇编
END
;设置本段程序的名称及属性
AREA BLOCK , CODE , READONLY
;设置将要复制的字数
num EQU 20
;标识程序入口点
ENTRY
Start
;R0寄存器指向源数据区src
LDR R0,=src
;R1寄存器指向目标数据区dst
LDR R1 ,=dst
;R2指定将要复制的字数
MOV R2, #num
;设置数据栈指针(R13),用于保存工作寄存器数值(设定SP堆栈开始地址为0x400)
MOV SP,#0X400
;进行以8个字为单位的数据复制
blockcopy
;需要进行的以8个字为单位的复制次数
MOVS R3,R2,LSR #3
;对剩余不足8个字的数据,,跳转到copywords,以字为单位进行复制
BQE copywords
;保存工作寄存器
STMFD SP!,{R4-R11}
Octcopy
;从源数据读取8个字的数据,放到8个工作寄存器中,并更新目标数据区指针R0
LDMIA R0!,{R4-R11}
;将这8个字数据写入到目标数据区中,并更新目标数据区指针R1
STMIA R1!,{R4-R11}
;将块复制次数减1
SUBS R3,R3,#1
;循环,直到完成以8字为单位的块复制
BNE Octcopy
;恢复工作寄存器值
LDMFD SP!,{R4-R11}
copywords
;剩余不足8个字的数据的字数(逻辑与,把R2 前7 位扔掉)
ANDS R2,R2,#7
;数据复制完成
BEQ stop
wordcopy
;从源数据读取1个字的数据,放到寄存器R3中,并更新目标数据区指针R0
LDR R3,[R0],#4
;将这R3中数据写入到目标数据区中,并更新目标数据区指针R1
STR R3 ,[R1],#4
;将字数减1
SUBS R2,R2,#1
;循环,直到完成以字为单位的数据复制
BNE wordcopy
stop
;调用angel_SWIreason_ReportException
;ADP_Stopped_ApplicationExit
;ARM semihosting SWI
;从应用程序中退出
MOV R0, #0X18
LDR R1,=0X20026
SWI 0X123456
;定义数据区blockdata
AREA Blockdata, DATA, READONLY
;定义源数据src及目标数据区dst
src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;结束汇编
END
相关文章推荐
- ARM体系结构与编程学习(十一)
- ARM体系结构与编程学习(十二)
- ARM体系结构与编程学习(十)
- ARM体系结构与编程学习(十三)
- ARM体系结构与编程学习(四)
- ARM体系结构与编程学习(二)
- ARM体系结构与编程学习(九)
- ARM体系结构与编程学习(五)
- ARM体系结构与编程学习(六)
- ARM体系结构与编程学习(八)
- ARM体系结构与编程学习(十一)
- ARM体系结构与编程学习(九)
- ARM体系结构与编程学习(一)
- ARM的体系结构与编程系列博客——ARM体系版本
- arm体系结构学习笔记 part2 -- 中断相关
- arm体系结构学习笔记 part3 -- 异常处理机制
- ARM的体系结构与编程系列博客——ARM的历史与应用范围
- ARM的体系结构与编程系列博客——ARM处理器系列介绍
- ARM的体系结构与编程系列博客——ARM处理器系列介绍
- ARM的体系结构与编程系列博客——ARM的历史与应用范围