【问题标题】:what does label: .word label mean in ARM Assemblylabel: .word label 在ARM Assembly中是什么意思
【发布时间】:2013-09-17 11:33:48
【问题描述】:

我在uboot里看下面的序列

.globl _start
_start: b   reset
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq
#ifdef CONFIG_SPL_BUILD
_undefined_instruction: .word _undefined_instruction
_software_interrupt:    .word _software_interrupt
_prefetch_abort:    .word _prefetch_abort
_data_abort:        .word _data_abort
_not_used:      .word _not_used
_irq:           .word _irq
_fiq:           .word _fiq
_pad:           .word 0x12345678 /* now 16*4=64 */
#else
_undefined_instruction: .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:    .word prefetch_abort
_data_abort:        .word data_abort
_not_used:      .word not_used
_irq:           .word irq
_fiq:           .word fiq
_pad:           .word 0x12345678 /* now 16*4=64 */
#endif  /* CONFIG_SPL_BUILD */

现在如果有 IRQ 或 FIQ 核心将分支到 _irq,但在一种情况下它会找到 _irq : .word _irq,这是什么意思?

_irq 的地址是 ARM 中的有效指令吗? 这个我看不懂,谁能解释一下?

【问题讨论】:

  • 这只是一个中断向量表,不是可执行代码。
  • 在中断时将使用此向量表。还看到table的#if部分有一个分支
  • "ldr pc, _irq" : 用 addr _irq 中的值加载 pc 和 "_irq: .word irq" : 在 addr _irq 有值 irq,它是 irq 例程的函数指针.因此,当 irq 发生时,pc 会跳转到 irq 例程。只是为了写下我的理解。

标签: assembly arm


【解决方案1】:

label: .word value 将 4 字节 value 放置在(由链接器)分配给 label 的地址处。

所以_irq: .word _irq 有效地将_irq 的地址放在 该地址(例如,如果_irq 标签的地址是 0x12345678,您将在地址 0x12345678 处获得值 0x12345678)。

【讨论】:

  • 对,所以现在如果出现中断,会发生预取中止异常吗?因为 ADDR(_irq) 不是指令
  • 如果我猜的话,我会说他们已经剥离了 SPL 构建的中断/异常处理(由于大小限制),并且使用上述向量作为导致CPU崩溃/挂起。不过我不能肯定,因为我不熟悉 uboot。
  • 仔细查看缺少下栏_irq: .word irq。它们不是同一个标签。
  • @artlessnoise:如您所见,两种变体都出现在 OP 发布的代码中(_label: .word label_label: .word _label)。
  • 你是对的。如果使用CONFIG_SPL_BUILD 并且遇到中断,那将会崩溃。我似乎记得 u-boot 现在我想到它甚至不正常使用中断。这是 OP 的another question like that。来自 OP 的一些上下文会有所帮助。
【解决方案2】:

您可能想知道这是一种递归引用:为什么

.label: .word label? 

他们不会一样吗?实际上,.label 只是编译器的指令,但 .word 后面的“label”是函数指针,在这种情况下,指向中断函数。我认为这更像是编译器的把戏。你也可以这样做

ldr pc, =irq

为了得到同样的结果,这里的“ldr”也是一个指令而不是arm指令。

【讨论】:

  • 是的,一个很好的答案,但不同的是你可以写*_irq = my_handler;来更新地址。使用ldr pc, =irq 无法更改矢量。
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 2012-10-05
相关资源
最近更新 更多