还是有点疑问
我看了,汇编代码也找了! 我觉得很奇怪的一点就是,为什么在thumb的指令中,使用ldr加载了一个地址,为什么这个地址的指向是该指令的高地址位,比如该指令是在0x4000001c,0x4000001d这两个地址空间内保存,并且我在这条thumb指令之前加了语句标号FUN,然后使用ldr r1,=FUN加载这个地址,虽然执行的时候没有任何问题!但是这条指令加载的值确是0x4000001d,这是我觉得很奇怪的地方!我看了我使用的都是小端模式的!
代码如下 area example,code,readonly entry code32 Start cmp r0, #0 adr r7, FUN+1 bx r7 cmp r0,r1 cmp r0,r1 cmp r0,r1 cmp r0,r1
code16 FUN cmp r0,r2 cmp r0,r2 cmp r0,r2 ldr r1,=FUN cmp r0,r2 cmp r0,r2 cmp r0,r2 mov pc,r1
end
反汇编后如下代码 Start [0xe3500000] cmp r0,#0 00000004 [0xe28f7011] add r7,pc,#0x11 ; #0x1d 00000008 [0xe12fff17] bx r7 0000000c [0xe1500001] cmp r0,r1 00000010 [0xe1500001] cmp r0,r1 00000014 [0xe1500001] cmp r0,r1 00000018 [0xe1500001] cmp r0,r1 FUN [0x4290] cmp r0,r2 <--此处 0000001e [0x4290] cmp r0,r2 00000020 [0x4290] cmp r0,r2 00000022 [0x4902] ldr r1,0x0000002c ; = #0x0000001d <--此处 00000024 [0x4290] cmp r0,r2 00000026 [0x4290] cmp r0,r2 00000028 [0x4290] cmp r0,r2 0000002a [0x468f] mov pc,r1 0000002c [0x0000001d] dcd 0x0000001d ....
第一个问题的原因也就在这里,就是应为adr取得是的低地址,而ldr取得是高地址?我在书里面没有找到关于这方面的说明阿?
但是在arm状态下adr和ldr的结果是一样的,都是取得4字节指令的低地址!就是在thumb状态下不一样了!
|