●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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。