Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 手臂指令_Android_Assembly_Arm_Reverse Engineering - Fatal编程技术网

Android 手臂指令

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,

我想问一下在arm教学中发生了什么。我了解ASM,但很难理解ARM。我试图在互联网上查找提供基本知识的信息,但我看到的东西有点不同。这是我试图理解的一个代码。。你能解释一下这些说明在做什么吗。我会记下那些我不懂的。这是艾达的密码。有人能解释一下整个功能吗。我会非常感激的。谢谢

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,很可能取label
aDraw_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 relative
LDR/STR
指令只能从
PC

LDR注册表中寻址+/-4096,=某些东西是一种快捷方式。arm基本上是一个固定长度的指令集,或者说没有足够的位来允许任何可能的立即值。此外,此快捷方式允许您使用标签,将某些标签的地址加载到此寄存器中。汇编程序处理这个问题的方法是,当它生成机器代码时,它会在不太远的地方分配一个字位置,该位置不在执行路径中(例如在无条件分支或bx之后)。然后,对于ldr reg,=指令,它对pc相对指令ldr reg,[pc,+offset]进行编码,以将该值加载到寄存器中。这允许加载任何32位值,没有限制。它还允许在稍后由链接器填充数据值(地址)的地方使用标签。您的示例进一步说明了这一点,并对标签进行了计算,因此汇编器或链接器必须解析标签,进行计算,然后将该值放入单词位置。


你试过ARM的吗?“有人能解释一下整个函数吗?”简言之,没有。a)它显然不是“整个函数”,因为结尾没有返回,b)它是一系列指令,用于读取一些内存地址,计算一些偏移,并且写了一些内存地址——我非常怀疑有人能解释为什么没有更多的上下文就无法在这里重现。