您的位置:首页 > 编程语言

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: