ARM体系结构与编程学习(五)

    技术2022-05-18  12

    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


    最新回复(0)