我正在查看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中的有效指令吗? 我无法理解这一点,任何人都可以解释一下吗?
答案 0 :(得分:4)
label: .word value
将4字节value
放置在(由链接器)指定的地址label
。
因此_irq: .word _irq
有效地将_irq的地址放在该地址(例如,如果_irq
标签的地址是0x12345678,则在地址0x12345678处获得值0x12345678)。
答案 1 :(得分:2)
您可能想知道这是一种递归参考:为什么
.label: .word label?
它们不一样吗?实际上,.label只是编译器的一个指令,但.word后面的'label'是一个函数指针,在这种情况下,是一个中断函数。我认为这更像是编译器的伎俩。你也可以
ldr pc, =irq
得到相同的结果,其中“ldr”这里也是指令而不是arm指令。