просто настроить стек.В противном случае, если вы не хотите, чтобы в стеке не было локальных переменных и было достаточно мало кода, чтобы вы не исчерпали регистры, не вызывайте никаких функций из этой функции и т. Д. Если вам действительно нужны переменные, используйте глобальные переменные.Компилятор НЕ МОЖЕТ генерировать ваш код без использования стека, если вы заставите код исчерпать регистры и глобальные переменные.Ни один переключатель компилятора не будет изобретать хранилище, и я бы не стал доверять компилятору, у которого есть нестандартный прием, не связанный со стеком, который он мог бы попытаться использовать.
Простой, без локальных переменных, даже не требуется промежуточный регистр:
unsigned int fun ( unsigned int a, unsigned int b )
{
return(a+b);
}
нет стека:
00000000 <fun>:
0: e0810000 add r0, r1, r0
4: e12fff1e bx lr
вы всегда можете изменить стек после вызова исходного кода C, для установки стека перед вызовом C требуется одна-несколько инструкций,просто установите указатель стека.Вам не нужны все указатели стека, только один.либо установите указатель стека, либо напишите функцию на ассемблере, а не на C. Вы все равно должны инициализировать стек перед com-портом.Это одна инструкция, два слова местоположения, и вы звоните C, поэтому стоимость ничтожна.
.globl _start
_start:
b reset
reset:
ldr sp,=0x20008000
bl more_fun
b .
.globl fun
fun:
bx lr
.globl fun_out
fun_out:
bx lr
unsigned int fun ( unsigned int , unsigned int );
void fun_out ( unsigned int, unsigned int, unsigned int, unsigned int );
unsigned int more_fun ( unsigned int a, unsigned int b, unsigned int c )
{
unsigned int d;
d = fun(a,b);
fun_out(a,b+c,b,a+c);
}
на инструкции, два слова, и вы можете позвонить C
4: e59fd00c ldr sp, [pc, #12] ; 18 <fun_out+0x4>
8: eb000003 bl 1c <more_fun>
...
18: 20008000 andcs r8, r0, r0
0000001c <more_fun>:
1c: e92d4070 push {r4, r5, r6, lr}
20: e1a05002 mov r5, r2
24: e1a06000 mov r6, r0
28: e1a04001 mov r4, r1
2c: ebfffff7 bl 10 <fun>
30: e1a00006 mov r0, r6
34: e0853006 add r3, r5, r6
38: e0851004 add r1, r5, r4
3c: e1a02004 mov r2, r4
40: ebfffff3 bl 14 <fun_out>
44: e8bd8070 pop {r4, r5, r6, pc}