/**
* 结论:
* 1. 函数中的前 4 个整型参数是通过 ARM 的前 4 个寄存器 r0、r1、r2 和 r3 来传递的。
* 传递参数可以是与整型兼容的数据类型,如字符类型 char、半字类型 short 等
* 2. 如果为双字类型,则需要两个寄存器来传递,尽量避免使用该类型
* 3. 不能通过寄存器传递的参数,通过函数堆栈来传递。这样不论是函数的调用者还是被调用者都必须通过访问堆栈来访问参数,
* 使程序的执行效率下降
* 4. 当传递的参数超过 4 个时,要将多个相关参数组织在一个结构体中,用传递结构体指针来代替多个参数
* 5. 进行浮点运算时,尽量避免使用 double 类型
* 6. 使用函数时要先定义后调用是 ARM 编程的基本规则之一。在函数调用之前定义函数,
* 编译器可以检查被调用函数的寄存器使用情况,从而对其进行进一步的优化
* compile with arm-linux-gnueabihf-gcc v8.3
* flags: -O0 -mcpu=cortex-a7 -mtune=cortex-a7 -mfloat-abi=hard -mfpu=neon
* 00010470 <caller1>:
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 <func1>
1048c: e1a03000 mov r3, r0
10490: e1a00003 mov r0, r3
10494: e8bd8800 pop {fp, pc}
* 00010498 <caller2>:
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 <func2>
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);
}