首页
学习
活动
专区
圈层
工具
发布

Arm指令
EN

Stack Overflow用户
提问于 2014-07-16 17:38:56
回答 3查看 606关注 0票数 0

我想问问这里的arm指令是怎么回事。我有ASM的知识,但我很难理解手臂。我试着在互联网上查找给出基本信息的信息,但我看到的东西有点不同。这是我想要理解的代码..。你能解释一下这些指令是干什么的吗?我会标记那些我不明白的。这是IDA的代码。有人能解释一下整个功能吗。我会非常感激的。谢谢

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-16 20:18:35

LDR是ARM上的指令,用于从内存中加载带有值的寄存器。然而,以下是LDR的伪指令形式

代码语言:javascript
复制
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指令:

代码语言:javascript
复制
LDR             LR, [R4,#0xC]  //This instruction

是件直截了当的事情。LDR仍然用于从内存中加载寄存器,但寻址不同。在这种情况下,链接寄存器LR正在加载内存中地址R4 + 0xC处的数据。

ADD也很简单,我不确定您是否对它正在做的事情感到困惑,但是:

代码语言:javascript
复制
ADD             R12, PC, R12 ; "draw_debug"  //This once 

这只需添加PC + R12并将其存储在R12中,而无需更新处理器标志。这将获取先前确定的偏移量,并将其应用于当前的PC

总的来说,这看起来是将值存储到某种structclass中的代码。编译器选择进行PC相对寻址,但偏移量很可能超出指令的可用范围。PC相关的LDR/STR指令只能从PC中寻址+/- 4096。

票数 2
EN

Stack Overflow用户

发布于 2014-07-16 20:58:11

ldr reg是一条捷径。arm是一个大部分固定长度的指令集,或者说没有足够的位来允许任何可能的即时值。此外,此快捷方式允许您使用标签,将某些标签的地址加载到此寄存器。汇编程序所做的是,当它生成机器代码时,它会在不太远的地方分配一个单词位置,这个位置不在执行路径中(例如,在一个无条件的分支或bx之后)。然后,对于ldr reg,=指令,它编码一个pc相对指令ldr reg,pc,+偏移量,以将该值加载到寄存器中。这允许加载任何32位值,不受限制。它还允许在链接器稍后填写数据值(地址)时使用标签。你的例子更进一步,在标签上做数学运算,所以汇编程序或链接器必须解析标签,做数学运算,然后把这个值放在单词位置。

票数 0
EN

Stack Overflow用户

发布于 2014-07-17 01:09:18

  • ARM.COM Arm指令集
  • ARM.com信息中心- ARM指令集快速参考卡
  • ARM指令集的Doc
  • 为每个指令网页建立索引
  • Arm指令集
  • 嵌入式系统体系结构: ARM的ARM指令集体系结构由Mark McDermott和我们在ARM的好朋友帮助
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24787258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档