看看下面这个奇怪的程序
我找了好几本书了,上面都说adr确实是专门用来加载地址的! 但是我看的书上也都写了对于ldr的指令也可以用于32位的常数或者地址的加载,但是这似乎有悖于我的实验程序!!
我只想让您给个解释,到底是不是这样的结果,应该说对于两段程序同在arm状态下或者同时在thumb状态下就可以顺利使用ldr指令取得地址,但是如果两段程序跨了状态,尤其是arm下调用thumb的程序,就不可以使用ldr了?? 高手们实际的工作中有没有这样的问题!? 代码如下 area example,code,readonly entry code32 Start adr r7, FUN1+1 bx r7 nop code16 FUN1 nop adr r2,FUN 《〈〈〈----此处,都是取地址,但结果却不一样 ldr r1,=FUN 《〈〈〈----此处 nop FUN nop nop mov pc,r2 〈〈〈〈---大家可以在这里使用r1或者r2都可以正确跳转,太奇怪了!!!不同的地址,结果一样 end
反汇编后如下
Start [0xe28f7005] add r7,pc,#5 ; #0x4000000d 40000004 [0xe12fff17] bx r7 40000008 [0xe1a00000] nop FUN1 [0x46c0] nop 4000000e [0xa201] adr r2,0x40000014 〈〈〈---这里 40000010 [0x4902] ldr r1,0x4000001c ; = #0x40000015〈〈〈--这里,和上面的的不一样 40000012 [0x46c0] nop FUN [0x46c0] nop 40000016 [0x46c0] nop 40000018 [0x4697] mov pc,r2 4000001a [0x0000] dcw 0x0000 .. 4000001c [0x40000015] dcd 0x40000015 ...@
请高手给个解答 |