Android 手臂指令
我想问一下在arm教学中发生了什么。我了解ASM,但很难理解ARM。我试图在互联网上查找提供基本知识的信息,但我看到的东西有点不同。这是我试图理解的一个代码。。你能解释一下这些说明在做什么吗。我会记下那些我不懂的。这是艾达的密码。有人能解释一下整个功能吗。我会非常感激的。谢谢Android 手臂指令,android,assembly,arm,reverse-engineering,Android,Assembly,Arm,Reverse Engineering,我想问一下在arm教学中发生了什么。我了解ASM,但很难理解ARM。我试图在互联网上查找提供基本知识的信息,但我看到的东西有点不同。这是我试图理解的一个代码。。你能解释一下这些说明在做什么吗。我会记下那些我不懂的。这是艾达的密码。有人能解释一下整个功能吗。我会非常感激的。谢谢 LDR R3, =(unk_E9BFB0 - 0x6B1B4C) //This once,i dont get it, is it subtracting? LDR R8,
LDR R3, =(unk_E9BFB0 - 0x6B1B4C) //This once,i dont get it, is it subtracting?
LDR R8, [R5]
MOV R1, R6
ADD R3, PC, R3
LDR LR, [R4,#0xC] //This instruction
LDR R12, =(aDraw_debug - 0x6B1B68) //This once
MOV R2, R7
STR R8, [R3,#0x30]
MOV R0, R3
STR R4, [R3]
ADD R12, PC, R12 ; "draw_debug" //This once
STR R3, [R5]
STR R12, [R3,#0x2C]
ADD R12, LR, #1
STR R12, [R4,#0xC]
BL __aeabi_atexit
LDR
是ARM上的指令,用于从内存加载带有值的寄存器。然而,以下是LDR
的伪指令形式:
LDR R3, =(unk_E9BFB0 - 0x6B1B4C) //This once,i dont get it, is it subtracting?
LDR R12, =(aDraw_debug - 0x6B1B68) //This once
我认为这是从代码位置构造一个偏移量,以便从.text
部分提取数据<例如,code>aDraw_debug-0x6B1B68,很可能取labelaDraw_debug
的地址,并减去某些指令的位置0x6B1B68
最终结果是,这实际上将把aDraw\u debug
的偏移量(从任意点)加载到R12
。同样,另一条指令将unk_E9BFB0
加载到R3
中。这一个可能是编译器生成的数据,因为名称已损坏
另一个LDR
指令:
LDR LR, [R4,#0xC] //This instruction
这是一件直截了当的事LDR
仍用于从内存加载寄存器,但寻址方式不同。在这种情况下,LR
,即链接寄存器,正在加载内存中地址R4+0xC
处的数据
ADD
也很简单,我不确定您是否对它所做的事情感到困惑,但是:
ADD R12, PC, R12 ; "draw_debug" //This once
这只需添加PC+R12
并将其存储在R12
中,而无需更新处理器标志。这将采用先前确定的偏移量,并将其应用于当前的PC
总的来说,这似乎是将值存储到某种
struct
或class
中的代码。编译器选择进行PC相对寻址,但偏移量可能超出指令的可用范围。PC relativeLDR/STR
指令只能从PC
LDR注册表中寻址+/-4096,=某些东西是一种快捷方式。arm基本上是一个固定长度的指令集,或者说没有足够的位来允许任何可能的立即值。此外,此快捷方式允许您使用标签,将某些标签的地址加载到此寄存器中。汇编程序处理这个问题的方法是,当它生成机器代码时,它会在不太远的地方分配一个字位置,该位置不在执行路径中(例如在无条件分支或bx之后)。然后,对于ldr reg,=指令,它对pc相对指令ldr reg,[pc,+offset]进行编码,以将该值加载到寄存器中。这允许加载任何32位值,没有限制。它还允许在稍后由链接器填充数据值(地址)的地方使用标签。您的示例进一步说明了这一点,并对标签进行了计算,因此汇编器或链接器必须解析标签,进行计算,然后将该值放入单词位置。