ARM中LDR指令右边的等号=是什么意思?

What does an equals sign = on the right side of a LDR instruction in ARM mean?

我用谷歌搜索了一段时间,但找不到与此相关的任何文档。我一直在尝试学习 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添加的自动注释。

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

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

在 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 的文字池中的值。