【问题标题】:The use of "=" sign in ARM assembly [duplicate]在ARM程序集中使用“=”号[重复]
【发布时间】:2020-11-01 11:21:33
【问题描述】:

我用谷歌搜索了它,但找不到任何东西,我是汇编新手,我有一个符号定义,我认为它等同于 C 的#define 语句。

FIRST       EQU         0x20000480

在__main中,我想把这个0x20000480的值加载到R1寄存器中,所以我有如下代码,

LDR         R1, FIRST

这给出了一个错误

main.s(65): error: A1150E: Bad symbol, not defined or external

如果我在 FIRST 前面插入一个“=”,

LDR         R1, =FIRST

然后它构建得很好。

谁能在这里解释一下“=”运算符(如果是运算符)的用法吗?

【问题讨论】:

  • LDR R1, FIRST 是从内存中加载的实际指令,LDR R1, =FIRST 是由汇编器实现并加载地址的伪指令。
  • 所以您正在尝试使用汇编语言进行编程,而没有汇编程序使用的语法的明确文档就在您的指尖?好像汇编语言编程还不够难。
  • 程序集特定于工具(不是目标)。如果他们完全支持它,并非所有人都平等地处理这个伪指令。请注意,此主题已在此处多次介绍。提问前请先看。
  • @andymango 也许只有我一个人,但 ARM 组装是最简单的。鉴于EQU 指令,OP 似乎正在使用 Keil 或 ARM Development Studio。我也花了一段时间才习惯 GCC 汇编语法。
  • @old_timer 新手在搜索时通常甚至不知道正确的关键字。让我们不要那么苛刻。

标签: assembly arm


【解决方案1】:

“=”表示可能的文字池访问。 在这种情况下,ldr 指令是一条伪指令,它转换为movmvnldr [pc, #offset] 之一

源代码:

ldr     r0, =0xff
ldr     r1, =0xffffffff
ldr     r2, =0xf00000ff

反汇编:

mov     r0, #0xff
mvn     r1, #0x00
ldr     r2, [pc, #offset]

0xff 可以用 12 位空间以及 0(~0xffffffff)来表示,因此它分别转换为 movmvn
http://www.davespace.co.uk/arm/introduction-to-arm/immediates.html

另一方面,由于 0xf00000ff 不是这种情况,文字池访问应以 pc 相对负载的形式进行。

然而,在armv7 上,由于movwmovt 指令优于内存访问,您可以使用任何32 位值加载寄存器

movw    r2, #0xffff // ANY 16bit value
movt    r2, #0xf000 // ANY 16bit value to the upper part without corrupting the lower one

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多