为什么arm-linux-gcc在进入IRQ模式时只保留r0-r4
发布时间:2020-12-14 01:49:36 所属栏目:Linux 来源:网络整理
导读:我正在使用基于ARM cortex-A8的S5PV210 当我声明这样的中断例程时: void isr_routine(void) __attribute__ ((interrupt ("IRQ"))); 并像这样编译 arm-linux-gcc -c -march=armv7-a -fpie -fno-builtin $ -o $@ 我知道gcc会通过推送一些寄存器为我切换上下文
我正在使用基于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} 这与我关于如何切换上下文的概念背道而驰. PUSH {r0-r12} 可以吗?为什么gcc推送lr注册,为什么gcc不推r5-r10 rigsters? 解决方法
r4-r11作为ARM ABI的一部分保留在函数调用中,因此除非函数本身要破坏它们,否则中断例程不需要保存它们.如果中断例程调用的另一个函数想要修改这些寄存器,则它已经有义务将它们保存并恢复为正常ABI的一部分.似乎在这个集合中,编译器只想使用r4和r11(不使用r5-r10).
虽然非权威,维基百科的文章很容易阅读,可能会有所帮助:http://en.wikipedia.org/wiki/Calling_convention#ARM (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |