如下代码是我自己写的一个函数。在android ndk 9r上编译,在Android4.4.4上调试模式真机运行时的反汇编结果。
我的问题是:
1. 图中第一片红色代码区域通过pc和函数末尾的一部分数据,通过计算后得到的r4的值有什么特性?为什么可以这样计算?
注:因为我发现计算后得出的r4是一个比较特殊的值,可能执行内存中某个固定位置。如,如下小段代码,即可将一个全局的指针放到r2中。
0x7501942c <+360>: ldr r3, [pc, #64] ; 0x75019474 <verify()+432>
0x75019430 <+364>: ldr r3, [r4, r3]
0x75019434 <+368>: ldr r2, [r3]
2. 作为上一问的附加,函数末尾的那一部分红色代码的作用是什么?
非常感谢。
Dump of assembler code for function verify():
0x750192c4 <+0>: push {r4, r11, lr}
0x750192c8 <+4>: add r11, sp, #8
0x750192cc <+8>: sub sp, sp, #20
[B][COLOR="red"]0x750192d0 <+12>: ldr r4, [pc, #408] ; 0x75019470 <verify()+428>
0x750192d4 <+16>: add r4, pc, r4
0x750192d8 <+20>: ldr r3, [pc, #404] ; 0x75019474 <verify()+432>
0x750192dc <+24>: ldr r3, [r4, r3][/COLOR][/B]
0x750192e0 <+28>: ldr r3, [r3]
0x750192e4 <+32>: mov r0, r3
0x750192e8 <+36>: bl 0x75018fc0
0x750192ec <+40>: mov r3, r0
0x750192f0 <+44>: str r3, [r11, #-20]
.....
...
0x75019400 <+316>: ldr r1, [r3]
0x75019404 <+320>: ldr r3, [r11, #-16]
0x75019408 <+324>: and r3, r3, #255 ; 0xff
0x7501940c <+328>: rsb r3, r3, #0
0x75019410 <+332>: and r2, r3, #255 ; 0xff
0x75019414 <+336>: ldr r3, [r11, #-24]
0x75019418 <+340>: add r3, r1, r3
0x7501941c <+344>: strb r2, [r3]
0x75019420 <+348>: ldr r3, [r11, #-24]
0x75019424 <+352>: add r3, r3, #1
0x75019428 <+356>: str r3, [r11, #-24]
0x7501942c <+360>: ldr r3, [pc, #64] ; 0x75019474 <verify()+432>
0x75019430 <+364>: ldr r3, [r4, r3]
0x75019434 <+368>: ldr r2, [r3]
0x75019438 <+372>: ldr r3, [r11, #-24]
0x7501943c <+376>: add r3, r2, r3
0x75019440 <+380>: ldrb r3, [r3]
0x75019444 <+384>: cmp r3, #0
0x75019448 <+388>: moveq r3, #0
0x7501944c <+392>: movne r3, #1
---Type <return> to continue, or q <return> to quit---
0x75019450 <+396>: and r3, r3, #255 ; 0xff
0x75019454 <+400>: cmp r3, #0
0x75019458 <+404>: bne 0x750193b8 <verify()+244>
0x7501945c <+408>: ldr r3, [pc, #24] ; 0x7501947c <verify()+440>
0x75019460 <+412>: ldr r3, [r4, r3]
0x75019464 <+416>: mov r0, r3
0x75019468 <+420>: mov r1, #2
0x7501946c <+424>: bl 0x75018fa8
[B][COLOR="Red"] 0x75019470 <+428>: ldrdeq r2, [r0], -r4
0x75019474 <+432>: ; <UNDEFINED> instruction: 0xffffffd0
0x75019478 <+436>: ; <UNDEFINED> instruction: 0xffffffd4
0x7501947c <+440>: ; <UNDEFINED> instruction: 0xffffffd8[/COLOR][/B]
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!