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

LDR Rd, =label 示例: 字符串复制

Example 2.7 显示了用一个字符串覆盖另一个字符串的 ARM 代码例程。 该例程使用 LDR 伪指令从一个数据节中加载两个字符串的地址。 有以下几点需要特别注意:

DCB

DCB 指令定义一个或多个存储字节。除了整数值之外,DCB 还接受带引号的字符串。 字符串的每个字符均存放在连续的字节中。 有关详细信息,请参阅DCB

LDR, STR

LDRSTR 指令使用后变址寻址来更新其地址寄存器。例如,指令:

LDRB    r2,[r1],#1

r1 所指向的地址的内容加载 r2,然后将 r1 增加 1。

Example 2.7. 字符串复制

        AREA    StrCopy, CODE, READONLY
        ENTRY                             ; Mark first instruction to execute
start
        LDR     r1, =srcstr               ; Pointer to first string(把地址加载到R1)
        LDR     r0, =dststr               ; Pointer to second string
        BL      strcopy                   ; Call subroutine to do copy
stop
        MOV     r0, #0x18                 ; angel_SWIreason_ReportException
        LDR     r1, =0x20026              ; ADP_Stopped_ApplicationExit
        SVC     #0x123456                 ; ARM semihosting (formerly SWI)
strcopy
        LDRB    r2, [r1],#1               ; Load byte and update address
        STRB    r2, [r0],#1               ; Store byte and update address
        CMP     r2, #0                    ; Check for zero terminator
        BNE     strcopy                   ; Keep going if not
        MOV     pc,lr                     ; Return
        AREA    Strings, DATA, READWRITE (定义数据区)
srcstr  DCB     "First string - source",0
dststr  DCB     "Second string - destination",0
        END
 
 
 
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,以字为单位进行复制
        BEQ   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
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/glorin/archive/2011/04/27/6368180.aspx

你可能感兴趣的:(ARM体系结构与编程学习(五))