首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是LDR,[pc,#reset]

什么是LDR,[pc,#reset]
EN

Stack Overflow用户
提问于 2017-04-06 05:43:11
回答 1查看 1.5K关注 0票数 0
代码语言:javascript
复制
LDR pc,[pc,#reset]

在我今天学习的书中,向量表中所使用的这种平静的代码。我们知道"pc“是用来获取指令的地址(程序计数器),但是当使用LDR指令的第一个参数时,它违反了pc的地址性质。

EN

回答 1

Stack Overflow用户

发布于 2017-04-06 13:49:17

不知道你违反了什么意思。你真的应该读一下ARM文档,而不是让我们为你做。

只是看看语法

代码语言:javascript
复制
ldr Rt,[Rn,#immed]

它将取Rn中的值,使用它作为一个地址,添加即时并从该位置读取一个单词,然后将该值放在Rt中。如果Rt是R15 (程序计数器),那么它就分支。您是否可以使用它在手臂和拇指模式之间进行更改,这是特定于您正在使用的体系结构(ARMv4、ARMv5、ARMv6等)。加上其他的例外。

如果你做了一个回溯

代码语言:javascript
复制
ldr Rt,[Rn,#immed]!

那么我认为你得到了你应得的不可预测的结果。

在arm模式下,R15是前面的两个指令(嗯,总是前面有两个指令)。因此,如果这个ldr位于地址0x100,那么当它执行Rn时,它将添加立即,然后跳转到结果中,因此这可以作为一种非常懒惰的方法来生成编译(组装)时间跳转表。

代码语言:javascript
复制
.equ BOB  ,  0x0
.equ CAROL,  0x4
.equ TED  ,  0x8
.equ ALICE,  0xC
nop
.align 8
ldr pc,[pc,#TED]
.word 0
.word bob
.word carol
.word ted
.word alice
.align 8
bob:
    nop
    nop
    b .
ted:
    nop
    b .
carol:
    nop
    nop
    nop
    nop
    b .
alice:
    b .

创建此表的

代码语言:javascript
复制
 100:   e59ff008    ldr pc, [pc, #8]    ; 10 <bob-0x1f0>
 104:   00000000    andeq   r0, r0, r0
 108:   00000200    andeq   r0, r0, r0, lsl #4
 10c:   00000214    andeq   r0, r0, r4, lsl r2
 110:   0000020c    andeq   r0, r0, r12, lsl #4
 114:   00000228    andeq   r0, r0, r8, lsr #4

0x108+8 = 0x110,它提供地址0x20C,该地址将加载到R15中,并导致跳转到该地址。

代码语言:javascript
复制
00000200 <bob>:
 200:   e1a00000    nop         ; (mov r0, r0)
 204:   e1a00000    nop         ; (mov r0, r0)
 208:   eafffffe    b   208 <bob+0x8>

0000020c <ted>:
 20c:   e1a00000    nop         ; (mov r0, r0)
 210:   eafffffe    b   210 <ted+0x4>

00000214 <carol>:
 214:   e1a00000    nop         ; (mov r0, r0)
 218:   e1a00000    nop         ; (mov r0, r0)
 21c:   e1a00000    nop         ; (mov r0, r0)
 220:   e1a00000    nop         ; (mov r0, r0)
 224:   eafffffe    b   224 <carol+0x10>

00000228 <alice>:
 228:   eafffffe    b   228 <alice>

如果我把这一行改为

代码语言:javascript
复制
ldr pc,[pc,#CAROL]

把它重新组装到一个不同的地址。就会更容易

代码语言:javascript
复制
b ted 

然后把它改为

代码语言:javascript
复制
b alice

如果你能接触到有分支的人,否则稍微便宜一点

代码语言:javascript
复制
ldr pc,=ted

代之以

代码语言:javascript
复制
ldr pc,=carol

如果你想做一个集合时间的改变,可以到达任何地方,并且没有任何if armv4,那么如果armv5那么等等的细微差别(除了切换到拇指与否)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43246612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档