下面是我的问题的背景:使用GCC codesourcedy的 如何在GCC中不使用堆栈和函数调用?
- 我使用的是ARM7架构(ARM720T TDMI ...)(ARM-NONE-EABI版本4.5.2)
- 我是一个新手,具有gcc和ARM架构,但已经嵌入了5年;-)
在我的项目中,在初始化堆栈之前从一个程序集文件调用一个C函数。由于堆栈未初始化,因此该函数不得使用堆栈。
是否有可能使用一些“编译指令”命令强制gcc不使用该特定功能的堆栈?
附加信息:我的工作的目标是将之前用ARMASM编译的项目转换为gcc。所以在ARMASM中,在堆栈初始化工作之前调用这个C函数。也许最终的答案是,这是不可能做到这一点在海湾合作委员会...
下面是在汇编代码中调用的C函数的ELF列表的摘录(正如你可以看到我试过always_inline,但从组装调用时,这似乎不够):
000049d0 <CInit_Init>:
__attribute__((always_inline)) extern void CInit_Init(void) {
49d0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
49d4: e28db000 add fp, sp, #0
__attribute__((always_inline)) void COM1_Init(void);
__attribute__((always_inline)) extern inline void COM1_Init_I(void) {
// Skip if already enabled
if (TEST_BIT_CLR(HwrSysControl1, HwSysControl1UartEnable)) {
49d8: e59f3038 ldr r3, [pc, #56] ; 4a18 <CInit_Init+0x48>
49dc: e5933000 ldr r3, [r3]
49e0: e2033c01 and r3, r3, #256 ; 0x100
49e4: e3530000 cmp r3, #0
49e8: 1a000007 bne 4a0c <CInit_Init+0x3c>
HwrUart1Control = (
49ec: e59f3028 ldr r3, [pc, #40] ; 4a1c <CInit_Init+0x4c>
49f0: e59f2028 ldr r2, [pc, #40] ; 4a20 <CInit_Init+0x50>
49f4: e5832000 str r2, [r3]
HwUartControlDataLength8|
HwUartControlFifoEnable|
HwUartControlRate115200);
BIT_SET(HwrSysControl1, HwSysControl1UartEnable);
49f8: e59f3018 ldr r3, [pc, #24] ; 4a18 <CInit_Init+0x48>
49fc: e59f2014 ldr r2, [pc, #20] ; 4a18 <CInit_Init+0x48>
4a00: e5922000 ldr r2, [r2]
4a04: e3822c01 orr r2, r2, #256 ; 0x100
4a08: e5832000 str r2, [r3]
COM1_Init_I();
}
4a0c: e28bd000 add sp, fp, #0
4a10: e49db004 pop {fp} ; (ldr fp, [sp], #4)
4a14: e12fff1e bx lr
4a18: 80000100 .word 0x80000100
4a1c: 800004c0 .word 0x800004c0
4a20: 00070001 .word 0x00070001
在此先感谢!
谢谢!我会研究你的解决方案,并在几天后回到你身边。我特别喜欢设置临时堆栈指针的想法... –
最后我在调用C函数之前设置sp。但我仍然不明白为什么/如何使用另一个编译器的相同汇编代码能够在不使用堆栈指针的情况下调用C函数... –
看一下反汇编,或者没有使用堆栈,或者在堆栈的系统上是为你设置的,等等,它可能内联第二级调用等。 –