|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM汇编有ldr指令以及ldr、adr伪指令,它们都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别。4 q7 W3 ~" w: d- K2 Y) O; [- ~: m. k
- ldr r0, _start
- adr r0, _start
- ldr r0, =_start
- _start:
- b _start! F$ p9 t! I* \5 m: i& J
3 X0 o( Q5 {# f
# D9 m$ c. h. Z- d% |# g' l5 N
编译的时候设置 RO 为 0x30000000,下面是反汇编的结果:
% A' u* b* Y( @* g5 ^- 0x00000000: e59f0004 ldr r0, [pc, #4] ; 0xc
- 0x00000004: e28f0000 add r0, pc, #0 ; 0x0
- 0x00000008: e59f0000 ldr r0, [pc, #0] ; 0x10
- 0x0000000c: eafffffe b 0xc
- 0x00000010: 3000000c andcc r0, r0, ip
; K; V! f+ [+ y5 ?* c
5 i( y& F- y0 w5 X; ^+ @3 s' e7 ~% Y& _& X$ p7 I
1.ldr r0, _start
# m q. ?8 n( m# a! ]* b# v9 o" Q$ c; r& O! r5 R3 ?" d
这是一条指令,从内存地址 _start 的位置把值读入。在这里_start是一个标号(是一个相对程序的表达式),汇编程序计算相对于 PC 的偏移量,并生成相对于 PC的前索引的指令:ldr r0, [pc, #4]。执行指令后,r0 =0xeafffffe。7 l( ^) h$ u2 U: P6 a7 G/ P
ldr r0, _start是根据_start对当前PC的相对位置读取其所在地址的值,因此可以在和_start标号的相对位置不变的情况下移动。! f" U( r0 H: N9 x5 f* k6 U
& \ L" d$ \$ X# o: I' ]5 g2.adr r0, _start/ u7 W& r* B- w8 ~3 {
& P; X: Y- }& q: {, Z M4 b0 L! H) B) F# R& I
) c6 S5 f, [0 r# z- r
8 {+ P S6 L# U0 P# z
* w- `/ A) b0 d' ~; r |
|