7

我正在看 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 中的有效指令吗?我无法理解这一点,有人可以解释吗?

4

2 回答 2

5

label: .word value将 4 字节value放在(由链接器)分配给label.

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

于 2013-09-17T11:39:22.047 回答
2

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

.label: .word label? 

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

ldr pc, =irq

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

于 2013-09-17T12:19:17.217 回答