● C和汇编之间的函数调用
ARM工程中,C程序调用汇编函数和汇编程序调用C函数时经常的事情,遵守ARM-Thumb过程调用标准ATPCS(ARM-Thumb Procedure Call Standard)。
ATPCS标准——ARM编译器使用的函数调用规则(详见下面)
(温故知新)C语言程序中的调用
int main()
{
printf("1234+5678=%d\n",sum(1234,5678));
return 0;
}
请编写sum函数,实现两个数的相加。
int sum(int x,int y)
{
int s;
s=x+y;
return s
}
C程序调用汇编程序函数
要点:
1. 在汇编语言中,用该函数名作为汇编代码段的标识,定义函数代码,最后用MOV PC,LR返回
2. 在汇编语言中用EXPORT导出函数名
3. 在C语言中用extern关键词声明函数原型。
4. 函数调用时参数传递规则:寄存器组中的{R0-R3}作为参数传递和结果返回寄存器,如果参数数目超过4个,则使用堆栈进行传递。
;工程exp10_1_2
;汇编函数文件strcopy.s
;把R1指向的数据块复制到R0指向的存储块。
AREA StrCopy,CODE,READONLY
EXPORT strcopy
strcopy
LDRB R2,[R1],#1
STRB R2,[R0],#1
CMP R2,#0
BNE strcopy
MOV PC,LR
END
;C文件main.c
;调用strcopy函数
extern void StrCopy(char *d,const char *s); //声明调用子程序的例子strcopy为外部引用符号
int main(void)
{
const char *src=”Source”;
char dest[12]=”Destination”;
strcopy(dest,src); //调用汇编函数strcopy
printf(“After copying:\n”);
printf(“%s\n%s\n”,src,dest);
return(0);
}
根据ATPCS的C语言程序调用汇编函数规则,参数由左向右依次传递给寄存器R0~R3,可知汇编函数strcopy在C程序中的原型应该为:
void strcopy(char *d,const char *s);
其中,参数d对应R0,参数s对应R1。函数没有返回值,类型为void。函数名称与汇编函数标号名称一致。
汇编程序调用c程序函数
(工程Exp10_1_3,与实验三类似)
C函数
int g(int a,int b,int c,int d,int e)
{
return a+b+c+d+e;
}
汇编函数f中调用C函数g(),以实现下面的功能:
int f(int i)
{
return g(i, 2*i, 3*i, 4*i, 5*i );
}
整个汇编函数f的代码如下:
EXPORT f
AREA f,CODE,READONLY
IMPORT g
STR LR,[SP,#-4]
ADD R1,R0,R0
ADD R2,R1,R0
ADD R3,R1,R2
STR R3,[SP,#-4]
ADD R3,R1,R1
BL g
ADD SP,SP,#4
RSB R0,R0,#0
LDR PC,[SP],#4
END
;由于函数g()有5个参数,所以该函数用寄存器R0~R3来传递a~d,而用堆栈来传递第5个参数e。
汇编程序访问c程序变量
实际上是引用不同文件定义的变量:
IMPORT:声明符号为外部引用符号
EXPORT:声明符号为导出符号
例子:
AREA globals,CODE,READONLY
EXPORT asmsubroutine ;声明可导出符号,以供外程序调用
IMPORT globvar ;声明引用外部符号
asmsubroutine
LDR R1,= globvar
LDR R0,[R1]
ADD R0,R0,#2
STR R0,[R1]
MOV PC,LR
END
ATPCS标准(ARM-Thumb Procedure Call Standard)
ARM编译器使用的函数调用规则。
1. 寄存器的使用规则
R0 ~R3用来传递参数;
R4~R11用来保存局部变量;
R12用做子程序内部调用的scratch寄存器
R13堆栈指针,保存当前处理器模式的堆栈的栈顶
R14链接寄存器
R15程序计数器
进入函数时,必须保存R4~R11中被函数破坏的寄存器。
2. 堆栈的使用规则
FD类型。
3. 参数的传递规则
<4个:R0~R3
>4个:堆栈
4. 函数返回值
R0,R1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论