和C调用汇编一致,前四个参数用R0-R3传递,后面的用堆栈传递 测试这个程序:
//******************************************************
//main.C extern int test(int, int, int);
int n; int main(void)
{
n = test(2,4,6);
while(1);
} int add(int a, int b, int c)
{
return a+b+c;
}
//******************************************************
;****************************************************
;test.S
IMPORT add ;引进add
EXPORT test ;供出test
AREA test,CODE,READONLY
CODE32
STR LR,[SP],#-4 ;保存LR:入栈
BL add ;调用C程序
LDR LR,[SP,#4]! ;LR出栈
MOV PC,LR ;返回main END
;*************************************************** 过程说明:main调用n = test(2,4,6),使2、4、6分别通过R0、R1、R2传递给汇编函数test,然后test调用C程序add,R0、R1、R2分别传给a、b、c,然后求和结果用R0返回test,test又将R0返回main函数,所以最后 n = 12; 如图:
注意汇编程序中IMPORT和EXPORT的用法:
IMPORT add:进口,指add在外部文件中,当前文件要调用
EXPORT test:出口,指test在当前文件中,可以给外部文件调用 同样在C文件中,如果要调用外部文件,使用extern关键字申明函数,如:extern int test(int, int, int); 这些关键字是必须的,如果在没有使用这些关键字的情况下,调用外部函数,编译器要报错的。
|