混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用
下面的子程序段定义了C语言函数。
intg(inta,intb,intc,intd,inte)
{
returna+b+c+d+e;
}
下面的程序段显示了汇编语言调用。假设程序进入f时,r0中的值为i。
;intf(inti){returng(i,2*i,3*i,4*i,5*i);}
PRESERVE8
EXPORTf
AREAf,CODE,READONLY
IMPORTg //声明C程序g()
STRlr,[sp,#-4]! //保存返回地址lr
ADDr1,r0,r0 //计算2*i(第2个参数)
ADDr2,r1,r0 //计算3*i(第3个参数)
ADDr3,r1,r2 //计算5*i
STRr3,[sp,#-4]! //第五个参数通过堆栈传递
ADDr3,r1,r1 //计算4*i(第4个参数)
BLg //调用C程序
ADDsp,sp,#4 //从堆栈中删除第5个参数
LDRpc,[sp],#4 //返回
END
(3)从C++调用C
下面的例子显示了如何从C++程序中调用C函数。
下面的C++程序调用了C程序。
structS{ //本结构没有基类和虚函数
S(ints):i(s){}
inti;
};
externCvoidcfunc(S*);
//被调用的C函数使用extern“C”声明
intf(){
Ss(2); //初始化's'
cfunc(s); //调用C函数'cfunc'将改变's'
returnsi*3;
}
下面显示了被调用的C程序代码。
structS{
inti;
};
voidcfunc(structS*p){
/*定义被调用的C功能*/
p->i+=5;
}
(4)从C++中调用汇编
下面的例子显示了如何从C++中调用汇编程序。
下面的例子为调用汇编程序的C++代码。
structS{ //本结果没有基类和虚拟函数
//
S(ints):i(s){}
inti;
};
externCvoidasmfunc(S*); //声明被调用的汇编函数
intf(){
Ss(2); //初始化结构体's'
asmfunc(s); //调用汇编子程序'asmfunc'
returns.i*3;
}
下面是被调用的汇编程序。
PRESERVE8
AREAAsm,CODE
EXPORTasmfunc
asmfunc//被调用的汇编程序定义
LDRr1,[r0]
ADDr1,r1,#5
STRr1,[r0]
MOVpc,lr
END
(5)从C中调用C++
下面的例子显示了如何从C++代码中调用C程序。
下面的代码显示了被调用C++代码。
structS{//本结构没有基类和虚拟函数
S(ints):i(s){}
inti;
};
externCvoidcppfunc(S*p){
//定义被调用的C++代码
//连接了C功能
p->i+=5;//
}
调用了C++代码的C函数。
structS{
inti;
};
externvoidcppfunc(structS*p);
/*声明将会被调用的C++功能*/
intf(void){
structSs;
s.i=2;/*初始化S*/
cppfunc(s);/*调用cppfunc函数,该函数可能改变S的值*/
returns.i*3;
}
c++相关文章:c++教程
评论