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