Assembly ARM中的Linux IRQ处理

Assembly ARM中的Linux IRQ处理,assembly,arm,Assembly,Arm,我试图理解IRQ处理在ARM平台上的Linux中是如何工作的,但我无法理解中的汇编程序宏handle\u IRQ。这是定义CONFIG_MULTI_IRQ_处理程序时的宏: ldr r1, =handle_arch_irq mov r0, sp adr lr, BSYM(9997f) ldr pc, [r1] 我假设它将函数的地址加载到r1中,堆栈指针加载到r0,链接寄存器加载到0x9997F,pc加载到函数地址 但是我不理解=front of=handle\u arch\u irq,我不理解

我试图理解IRQ处理在ARM平台上的Linux中是如何工作的,但我无法理解中的汇编程序宏handle\u IRQ。这是定义CONFIG_MULTI_IRQ_处理程序时的宏:

ldr r1, =handle_arch_irq
mov r0, sp
adr lr, BSYM(9997f)
ldr pc, [r1]
我假设它将函数的地址加载到r1中,堆栈指针加载到r0,链接寄存器加载到0x9997F,pc加载到函数地址


但是我不理解=front of=handle\u arch\u irq,我不理解为什么返回地址总是固定的,如果代码中添加了一行,它会改变,为什么它在pc上使用ldr,而不是直接移动。

相当基本的汇编语法:;请注意,GNU汇编程序并没有强加armasm的0-99限制——这里没有0x前缀,而且ADR特别采用标签参数,而不是立即数。大概handle_arch_irq是一个函数指针,因此需要去引用调用-它是如何定义的?谢谢你的回答。当你不知道确切的搜索位置时,搜索这些小东西有点困难。看来我只对了一半。handle\u arch\u irq是一个函数指针:在ASM中,handle\u arch\u irq是一个带有保留空间4的全局标识符,在C中,它被分配给一个函数调用handle\u arch\u irq=mdesc->handle\u irq。基本上,我如何在ARM汇编程序中实现函数指针。你就是这样做的。没有bl[r1];它也可以是ldr r1、[r1]和bl r1。在某些情况下,ldr pc、[r1]和9997标签之间可能存在额外代码。