存器R0~R3中,如果参数个数多于4个,将剩余的字数据通过数据栈来传递;
●如果包括浮点参数则要通过相应的规则将浮点参数转换为整数参数,然后依次将各
参数传送到寄存器R0~R3中。如果参数多于4个,将剩余字数据传送到数据栈中,
入栈的顺序与参数顺序相反,即最后一个字数据先入栈。
4. 子程序结果返回规则
●结果为一个32位的整数时,通过寄存器R0返回;结果为一个64位整数时,通过寄存
器R0,R1返回。
●结果为一个浮点数时,可以通过浮点运算部件的寄存器F0、D0或者S0来返回;结果
为复合型的浮点数(如复数)时,可以通过寄存器F0~Fn或者D0~Dn来返回。
●对于位数更多的结果,需要通过内存来传递。
2.6.1.3 ARM开发工具编译环境和GNU编译环境的差别
ARM开发工具编译环境(如ads)和GNU编译环境下内嵌汇编的格式和伪操作是不同的。后文将不介绍ARM开发工具编译环境下的混合编程实现,但是,读者对于两者的伪操作上区别还是需要了解的,以便在需要的时候将ARM开发工具编译环境下的汇编移植到GNU编译环境
另外,对于注释,在ARM开发工具编译环境中注释行以“;”开始。GNU环境注释行以“#”开始,行较多时将内容放在“/*”和“*/”之间。
2.6.2 C调用汇编
在C中调用汇编文件中的函数,要做的主要工作有两个,一是在C中声明函数原型,并加extern关键字;二是在汇编中用global 导出函数名,并用该函数名作为汇编代码段的标识,最后用mov pc, lr返回。然后,就可以在C 中使用该函数了。从C的角度,并不知道该函数的实现是用C还是汇编。更深的原因是因为C的函数名起到表明函数代码起始地址的作用,这个和汇编的label是一致的。
以下给出一个调用的例子,程序包括两个文件:main.c和Asmfile_gnu.s。main.c用c实现,包含主函数,负责调用Asmfile_gnu.c的global asmDouble,并将调用前后的值输出;Asmfile_gnu.c用ARM汇编实现,包含被调用函数“global asmDouble”,实现整数的倍乘。
main.c: