Example 2.7 显示了用一个字符串覆盖另一个字符串的 ARM 代码例程。 该例程使用 LDR
伪指令从一个数据节中加载两个字符串的地址。 有以下几点需要特别注意:
DCB
DCB
指令定义一个或多个存储字节。除了整数值之外,DCB
还接受带引号的字符串。 字符串的每个字符均存放在连续的字节中。 有关详细信息,请参阅DCB。
LDR, STR
LDR
和 STR
指令使用后变址寻址来更新其地址寄存器。例如,指令:
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