【问题标题】:What does an equals sign = on the right side of a LDR instruction in ARM mean?ARM中LDR指令右侧的等号=是什么意思?
【发布时间】:2016-10-16 21:10:53
【问题描述】:

在谷歌上搜索了一段时间,但我找不到任何与此相关的文档。我一直在尝试学习 ARM,并且一直在查看为我编写的一个简单的calculator.c 程序编译的 ARM 汇编代码,以查看我是否能理解发生了什么。我一直看到的是这样的说明:

LDR     R3, =__stack_chk_guard__GLIBC_2.4

LDR     R0, =aEnterOperator ; "Enter operator: "

LDR     R0, =aSIsNotAValidOp ; "%s is not a valid operator.  Enter +, -"

注意:分号后面的内容只是IDA添加的自动cmets。

我的问题是,这些 LDR 右侧的“=”是什么意思?在第一种情况下,它似乎是一些指示库加载的标记;在第二种和第三种情况下,'=a' 似乎以 printf 开头。我只是不太确定这一点,因为我在文档中找不到关于 LDR 的这种语法的任何信息。有人可以帮我理解这一点吗?谢谢!

【问题讨论】:

标签: assembly arm ida


【解决方案1】:

在 LDR 指令的第二个操作数的开头使用等号 (=) 表示使用 LDR pseudo-instruction。尽管 ARM 指令集仅支持更小范围内的立即数,但此伪指令用于通过单条指令将任意 32 位常量值加载到寄存器中。

如果= 之后的值被汇编器知道并且符合 MOV 或 MVN 指令的立即值的允许范围,则生成 MOV 或 MVN 指令。否则将常量值放入字面量池中,并使用PC-relative LDR instruction 将值加载到寄存器中。

如果 Ida 在反汇编代码时生成这些 LDR= 指令,那么它一定检测到汇编器或编译器在生成您正在查看的代码时选择了第二个选项。实际指令类似于LDR R0, loc_1234567(或更准确地说类似于LDR R0, [PC, #-1234]),Ida 正在为您在loc_1234567 的文字池中查找值。

【讨论】:

    【解决方案2】:

    = 通常以立即常量为后缀,并指示汇编器将该常量放入附近的文字池中并生成一个pc 相对内存操作数来加载它。这很有用,因为 ARM 指令格式没有足够的空间来存储完整的 32 位常量。加载无法以 8 位编码的常量(我认为)加上从附近的文字池中转移是规避此问题的一种有效且高效的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 2012-10-09
      • 2015-06-19
      相关资源
      最近更新 更多