gpt4 book ai didi

c - 为什么arm-linux-gcc在进入IRQ模式时只保留r0-r4

转载 作者:太空狗 更新时间:2023-10-29 14:54:56 25 4
gpt4 key购买 nike

我正在使用基于 ARM cortex-A8 的 S5PV210

当我像这样声明一个中断例程时:

void isr_routine(void)  __attribute__ ((interrupt ("IRQ")));

然后像这样编译

arm-linux-gcc -c -march=armv7-a -fpie -fno-builtin $< -o $@

我知道 gcc 会通过推送一些寄存器来为我切换上下文。在我知道这个之前,我是手动完成的。所以我很好奇 gcc 是如何做到的。拆开后发现如下代码

PUSH     {r0-r4,r11,r12,lr}

这违背了我关于如何切换上下文的概念。在Arm cortex-A8官方文档中,明确表示r0-r12是用户态和IRQ模式共享的,而用户态的lr是独立于IRQ模式的。所以,我以前是这样切换context的

PUSH     {r0-r12}

可以吗?为什么 gcc 推送 lr 寄存器而不推送 r5-r10 寄存器?

最佳答案

r4-r11 作为 ARM ABI 的一部分在函数调用中保留,因此中断例程不需要保存它们,除非函数本身要破坏它们。如果中断例程调用的另一个函数想要修改这些寄存器,它已经有义务将它们作为正常 ABI 的一部分进行保存和恢复。看来在这个集合中,编译器只想使用r4和r11(r5-r10没有使用)。

虽然非权威性,但维基百科文章易于阅读并且可能有所帮助:http://en.wikipedia.org/wiki/Calling_convention#ARM

关于c - 为什么arm-linux-gcc在进入IRQ模式时只保留r0-r4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26342904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com