LDR pc,[pc,#reset]在我今天学习的书中,向量表中所使用的这种平静的代码。我们知道"pc“是用来获取指令的地址(程序计数器),但是当使用LDR指令的第一个参数时,它违反了pc的地址性质。
发布于 2017-04-06 13:49:17
不知道你违反了什么意思。你真的应该读一下ARM文档,而不是让我们为你做。
只是看看语法
ldr Rt,[Rn,#immed]它将取Rn中的值,使用它作为一个地址,添加即时并从该位置读取一个单词,然后将该值放在Rt中。如果Rt是R15 (程序计数器),那么它就分支。您是否可以使用它在手臂和拇指模式之间进行更改,这是特定于您正在使用的体系结构(ARMv4、ARMv5、ARMv6等)。加上其他的例外。
如果你做了一个回溯
ldr Rt,[Rn,#immed]!那么我认为你得到了你应得的不可预测的结果。
在arm模式下,R15是前面的两个指令(嗯,总是前面有两个指令)。因此,如果这个ldr位于地址0x100,那么当它执行Rn时,它将添加立即,然后跳转到结果中,因此这可以作为一种非常懒惰的方法来生成编译(组装)时间跳转表。
.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 .创建此表的
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 #40x108+8 = 0x110,它提供地址0x20C,该地址将加载到R15中,并导致跳转到该地址。
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>如果我把这一行改为
ldr pc,[pc,#CAROL]把它重新组装到一个不同的地址。就会更容易
b ted 然后把它改为
b alice如果你能接触到有分支的人,否则稍微便宜一点
ldr pc,=ted代之以
ldr pc,=carol如果你想做一个集合时间的改变,可以到达任何地方,并且没有任何if armv4,那么如果armv5那么等等的细微差别(除了切换到拇指与否)。
https://stackoverflow.com/questions/43246612
复制相似问题