EDA365电子论坛网
标题:
ARM体系结构与编程学习(5)
[打印本页]
作者:
piday123
时间:
2020-11-13 16:02
标题:
ARM体系结构与编程学习(5)
LDR Rd, =label 示例: 字符串复制
6 x4 m; }, u- r7 n( r
Example 2.7 显示了用一个字符串覆盖另一个字符串的 ARM 代码例程。 该例程使用 LDR 伪指令从一个数据节中加载两个字符串的地址。 有以下几点需要特别注意:
- K9 i: N6 ]6 U8 M2 N2 ~
" I- Q0 y! }% h6 `7 E
DCB
, T. i' s! V& y: q" @3 N
DCB 指令定义一个或多个存储字节。除了整数值之外,DCB 还接受带引号的字符串。 字符串的每个字符均存放在连续的字节中。 有关详细信息,请参阅DCB。
' G+ ]1 n" r2 `" N# K+ H, W2 X0 q
9 z+ Q, A6 V8 C
LDR, STR
2 q' }# o% ~3 l/ Q
LDR 和 STR 指令使用后变址寻址来更新其地址寄存器。例如,指令:
8 ^6 `& S& b0 B* |2 ^0 o7 X8 B2 p- u9 P
. n4 k6 {3 a1 U% V& z
LDRB r2,[r1],#1
2 b0 o4 ?, @. ~9 T
用 r1 所指向的地址的内容加载 r2,然后将 r1 增加 1。
6 X( T3 a, T# Y/ ^6 ?
9 A; V( `% |6 y: y. \+ R
Example 2.7. 字符串复制
" s4 D0 p6 r$ r, I
0 k. q/ Z0 s. Z
AREA StrCopy, CODE, READONLY
; x' D! F+ E0 V3 t3 I. K
ENTRY ; Mark first instruction to execute
8 W# D0 |# L4 K7 ~2 y
start
# B( N. }# @+ N; ]
LDR r1, =srcstr ; Pointer to first string(把地址加载到R1)
/ @3 O# ?/ z6 W$ a) y
LDR r0, =dststr ; Pointer to second string
! D8 ]. @- E; `/ ?; b% l
BL strcopy ; Call subroutine to do copy
! G5 z( n( a- w, O3 i3 Y5 D3 ~
stop
- n. ]3 s& r# X+ g& }7 r% m
MOV r0, #0x18 ; angel_SWIreason_ReportException
# e/ f5 t }/ @$ g
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
% M& o, Q$ \. H( G
SVC #0x123456 ; ARM semihosting (formerly SWI)
5 V/ v- w \. K! Z$ ?/ z. E) D! |
strcopy
/ x f# I9 [4 D- } t+ A( t' \
LDRB r2, [r1],#1 ; Load byte and update address
! E4 S3 b# R* Z
STRB r2, [r0],#1 ; Store byte and update address
9 |& E4 k- M1 Z- z. O
CMP r2, #0 ; Check for zero terminator
& y# i& S! p5 ?( _* v
BNE strcopy ; Keep going if not
9 u- H3 ?2 _, f5 P; v2 Y
MOV pc,lr ; Return
/ [' ~0 ]: B6 a3 j$ ?$ b
AREA Strings, DATA, READWRITE (定义数据区)
& n) @' F& g. U9 H: d# s
srcstr DCB "First string - source",0
# `( k* W/ p6 k& V- U4 t
dststr DCB "Second string - destination",0
" e5 G4 w" H2 _
END
, Q3 o+ \) T2 V
+ i, k3 A. T- {& \& f! I* c
' [# R2 K4 w; C9 W! _
5 N' Z" q( W; ^% h
4.6.2 arm汇编实例
- B; K0 ]* o5 N3 X9 \5 `2 Z+ }
;设置本段程序的名称及属性
( p/ `+ b6 v/ b- C: U" X, }% y' j; q
AREA BLOCK , CODE , READONLY
; [7 @( S: X0 c, K0 H: u4 F( }
;设置将要复制的字数
# j0 o; _& V, V1 e3 i2 L
num EQU 20
9 Y' x- Z! A8 S
;标识程序入口点
0 \6 T) Y- K" _$ S- m
ENTRY
0 o. m0 }+ p) Z# ~
Start
8 P- Y% u0 C2 b9 |7 E- ?) S
;R0寄存器指向源数据区src
2 t2 A8 j( N! g: P* `# u
LDR R0,=src
4 ?0 r3 j: |" B/ B3 c8 l$ `
;R1寄存器指向目标数据区dst
) y3 X/ h) m( a/ R" w6 j
LDR R1 ,=dst
- c6 _4 M# ?8 T
;R2指定将要复制的字数
3 m3 I; B' O5 P3 e& T+ L5 E; Z S
MOV R2, #num
/ F6 p j2 d* K, {: r
;设置数据栈指针(R13),用于保存工作寄存器数值(设定SP堆栈开始地址为0x400)
( J4 P+ p/ `$ Q, S
MOV SP,#0X400
3 |: ^% [% k O. K7 \+ Z9 Q
;进行以8个字为单位的数据复制
5 O8 o4 J0 A: @
blockcopy
+ I' q. {8 `/ {7 i: y% ^
;需要进行的以8个字为单位的复制次数
. X# ]& b: A5 ~- ?+ u/ I. C6 H
MOVS R3,R2,LSR #3
) k H- l# L# u7 g' Q2 l! z" |
;对剩余不足8个字的数据,,跳转到copywords,以字为单位进行复制
4 P1 i2 j( g2 r9 d
BEQ copywords
% r$ L' Z \% I" Q+ p/ q2 i
;保存工作寄存器
4 v5 o+ J2 q3 |% E3 m& {
STMFD SP!,{R4-R11}
+ a' n$ m' d. m
Octcopy
0 _0 F! [$ \. ^" O1 o% [5 l( d/ z
;从源数据读取8个字的数据,放到8个工作寄存器中,并更新目标数据区指针R0
) y2 ]+ \& a) G" o; G$ g4 M( U) F
LDMIA R0!,{R4-R11}
0 k( \/ i: g/ b5 _4 v
;将这8个字数据写入到目标数据区中,并更新目标数据区指针R1
& d1 E1 ?- U) e. Y ]: N: t
STMIA R1!,{R4-R11}
|" q, @ ~: |0 g( U) J& |8 a$ J( j
;将块复制次数减1
7 q# R' v% ~8 m/ ^; z
SUBS R3,R3,#1
" x% w2 S% e7 I- \* [
;循环,直到完成以8字为单位的块复制
$ M& ^( e6 w0 o
BNE Octcopy
+ r, g5 _# M$ f* a- u @1 O [
;恢复工作寄存器值
4 Y/ L8 F$ R5 @/ }( l5 t" N" Q2 A
LDMFD SP!,{R4-R11}
r" s# o9 | v
copywords
P" O: L8 T* O$ k9 L
;剩余不足8个字的数据的字数(逻辑与,把R2 前7 位扔掉)
5 Y7 I- U; a) e/ D# `3 S
ANDS R2,R2,#7
3 p! c' S0 H7 i6 R$ q" d
;数据复制完成
1 W6 O* t1 N' A
BEQ stop
" G/ V6 ^# W/ G% Y( q
wordcopy
7 D% i7 G# \0 x
;从源数据读取1个字的数据,放到寄存器R3中,并更新目标数据区指针R0
6 i2 @6 F: v( r" J" o, u
LDR R3,[R0],#4
' B: j1 p" G$ R0 M4 t g
;将这R3中数据写入到目标数据区中,并更新目标数据区指针R1
6 J* V% t6 y8 y" j
STR R3 ,[R1],#4
8 c" p/ d% V! ~( x0 r4 w" E
;将字数减1
+ f [9 G; L, L
SUBS R2,R2,#1
/ M" k5 u- ]# S& [1 x6 n
;循环,直到完成以字为单位的数据复制
4 l0 E7 L" e) S& H& B9 x3 c( X
BNE wordcopy
8 E3 G9 a, t. K3 R
stop
% ]/ v4 ^" F$ \: [
;调用angel_SWIreason_ReportException
# Q) N, r8 c; S( M& Q
;ADP_Stopped_ApplicationExit
2 @9 i7 D) ?( u
;ARM semihosting SWI
/ D n; x$ ~6 z
;从应用程序中退出
+ d4 r, a, n1 s. ?6 _ {, G
MOV R0, #0X18
3 r3 Z5 z- [6 |" y' J% @
LDR R1,=0X20026
/ P2 r. [8 E* K; d! H# F m, U
SWI 0X123456
. w3 v3 G2 d/ M( t/ p( e% {1 F8 J3 ]
;定义数据区blockdata
+ z, t& P3 Y/ T9 o
AREA Blockdata, DATA, READONLY
! }8 M$ q2 T2 N5 D
;定义源数据src及目标数据区dst
/ h) I( [7 x4 n
src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
3 j* H6 P6 p- f; n' w2 |
dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
' k) D3 `, |4 C. g- u
;结束汇编
: [3 @1 i( k, f- u+ f2 P% ?
END
作者:
NingW
时间:
2020-11-13 16:58
ARM体系结构与编程学习(5)
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2