第五篇 ARM C 高效编程 - 函数

/**
 * 结论:
 *     1. 函数中的前 4 个整型参数是通过 ARM 的前 4 个寄存器 r0、r1、r2 和 r3 来传递的。
 *       传递参数可以是与整型兼容的数据类型,如字符类型 char、半字类型 short 等
 *     2. 如果为双字类型,则需要两个寄存器来传递,尽量避免使用该类型
 *     3. 不能通过寄存器传递的参数,通过函数堆栈来传递。这样不论是函数的调用者还是被调用者都必须通过访问堆栈来访问参数,
 *        使程序的执行效率下降
 *     4. 当传递的参数超过 4 个时,要将多个相关参数组织在一个结构体中,用传递结构体指针来代替多个参数
 *     5. 进行浮点运算时,尽量避免使用 double 类型
 *     6. 使用函数时要先定义后调用是 ARM 编程的基本规则之一。在函数调用之前定义函数,
 *        编译器可以检查被调用函数的寄存器使用情况,从而对其进行进一步的优化
 *     7. 编译器会对 C 函数中的每一个局部变量分配一个寄存器。如果多个局部变量不会交迭使用,
 *        那么编译器会对它们分配同一个寄存器,当局部变量多于可用的寄存器时,编译器会把多余的变量存储到堆栈
 *     8. ARM可供分配的寄存器不会多于12个,尽量控制函数中变量的数目,使其尽量分配在寄存器中
 *     9. 可以被分配到寄存器的变量包括:程序中的局部变量,调用子程序时传递的参数,与地址无关变量
 * compile with arm-linux-gnueabihf-gcc v8.3
 * flags: -O0 -mcpu=cortex-a7 -mtune=cortex-a7 -mfloat-abi=hard -mfpu=neon
 * 00010470 :
   10470:       e92d4800        push    {fp, lr}
   10474:       e28db004        add     fp, sp, #4
   10478:       e3a03004        mov     r3, #4
   1047c:       e3a02003        mov     r2, #3
   10480:       e3a01002        mov     r1, #2
   10484:       e3a00001        mov     r0, #1
   10488:       ebffffd0        bl      103d0 
   1048c:       e1a03000        mov     r3, r0
   10490:       e1a00003        mov     r0, r3
   10494:       e8bd8800        pop     {fp, pc}
 * 00010498 :
   10498:       e92d4800        push    {fp, lr}
   1049c:       e28db004        add     fp, sp, #4
   104a0:       e24dd008        sub     sp, sp, #8
   104a4:       e3a03006        mov     r3, #6
   104a8:       e58d3004        str     r3, [sp, #4]
   104ac:       e3a03005        mov     r3, #5
   104b0:       e58d3000        str     r3, [sp]
   104b4:       e3a03004        mov     r3, #4
   104b8:       e3a02003        mov     r2, #3
   104bc:       e3a01002        mov     r1, #2
   104c0:       e3a00001        mov     r0, #1
   104c4:       ebffffd3        bl      10418 
   104c8:       e1a03000        mov     r3, r0
   104cc:       e1a00003        mov     r0, r3
   104d0:       e24bd004        sub     sp, fp, #4
   104d4:       e8bd8800        pop     {fp, pc}
 */

int func1(int a, int b, int c, int d)
{
	return a + b + c + d;
}

int func2(int a, int b, int c, int d, int e, int f)
{
	return a + b + c + d + e + f;
}

int caller1(void)
{
	return func1(1, 2, 3, 4);
}

int caller2(void)
{
	return func2(1, 2, 3, 4, 5, 6);
}

你可能感兴趣的:(ARM-高效C编程,arm,c语言)