我想问问这里的arm指令是怎么回事。我有ASM的知识,但我很难理解手臂。我试着在互联网上查找给出基本信息的信息,但我看到的东西有点不同。这是我想要理解的代码..。你能解释一下这些指令是干什么的吗?我会标记那些我不明白的。这是IDA的代码。有人能解释一下整个功能吗。我会非常感激的。谢谢
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发布于 2014-07-16 20:18:35
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部分中提取数据。例如,aDraw_debug - 0x6B1B68可能采用标签aDraw_debug的地址,并减去某些指令0x6B1B68的位置。
最终的结果是,这实际上会将aDraw_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相关的LDR/STR指令只能从PC中寻址+/- 4096。
发布于 2014-07-16 20:58:11
ldr reg是一条捷径。arm是一个大部分固定长度的指令集,或者说没有足够的位来允许任何可能的即时值。此外,此快捷方式允许您使用标签,将某些标签的地址加载到此寄存器。汇编程序所做的是,当它生成机器代码时,它会在不太远的地方分配一个单词位置,这个位置不在执行路径中(例如,在一个无条件的分支或bx之后)。然后,对于ldr reg,=指令,它编码一个pc相对指令ldr reg,pc,+偏移量,以将该值加载到寄存器中。这允许加载任何32位值,不受限制。它还允许在链接器稍后填写数据值(地址)时使用标签。你的例子更进一步,在标签上做数学运算,所以汇编程序或链接器必须解析标签,做数学运算,然后把这个值放在单词位置。
发布于 2014-07-17 01:09:18
https://stackoverflow.com/questions/24787258
复制相似问题