您好,欢迎来到华佗养生网。
搜索
您的当前位置:首页C和汇编之间的函数调用

C和汇编之间的函数调用

来源:华佗养生网


C和汇编之间的函数调用

ARM工程中,C程序调用汇编函数和汇编程序调用C函数时经常的事情,遵守ARM-Thumb过程调用标准ATPCS(ARM-Thumb Procedure Call Standard)。

ATPCS标准——ARM编译器使用的函数调用规则(详见下面)

➢ (温故知新)C语言程序中的调用

int main()

{

printf(\"1234+5678=%d\\n\

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo7.cn 版权所有 湘ICP备2022005869号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务