混合使用C、C++和匯編語之: C、C++ 和 ARM 匯編語言之間的調(diào)用
下面的子程序段定義了C語言函數(shù)。
intg(inta,intb,intc,intd,inte)
{
returna+b+c+d+e;
}
下面的程序段顯示了匯編語言調(diào)用。假設(shè)程序進入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個參數(shù))
ADDr2,r1,r0 //計算3*i(第3個參數(shù))
ADDr3,r1,r2 //計算5*i
STRr3,[sp,#-4]! //第五個參數(shù)通過堆棧傳遞
ADDr3,r1,r1 //計算4*i(第4個參數(shù))
BLg //調(diào)用C程序
ADDsp,sp,#4 //從堆棧中刪除第5個參數(shù)
LDRpc,[sp],#4 //返回
END
(3)從C++調(diào)用C
下面的例子顯示了如何從C++程序中調(diào)用C函數(shù)。
下面的C++程序調(diào)用了C程序。
structS{ //本結(jié)構(gòu)沒有基類和虛函數(shù)
S(ints):i(s){}
inti;
};
externCvoidcfunc(S*);
//被調(diào)用的C函數(shù)使用extern“C”聲明
intf(){
Ss(2); //初始化's'
cfunc(s); //調(diào)用C函數(shù)'cfunc'將改變's'
returnsi*3;
}
下面顯示了被調(diào)用的C程序代碼。
structS{
inti;
};
voidcfunc(structS*p){
/*定義被調(diào)用的C功能*/
p->i+=5;
}
(4)從C++中調(diào)用匯編
下面的例子顯示了如何從C++中調(diào)用匯編程序。
下面的例子為調(diào)用匯編程序的C++代碼。
structS{ //本結(jié)果沒有基類和虛擬函數(shù)
//
S(ints):i(s){}
inti;
};
externCvoidasmfunc(S*); //聲明被調(diào)用的匯編函數(shù)
intf(){
Ss(2); //初始化結(jié)構(gòu)體's'
asmfunc(s); //調(diào)用匯編子程序'asmfunc'
returns.i*3;
}
下面是被調(diào)用的匯編程序。
PRESERVE8
AREAAsm,CODE
EXPORTasmfunc
asmfunc//被調(diào)用的匯編程序定義
LDRr1,[r0]
ADDr1,r1,#5
STRr1,[r0]
MOVpc,lr
END
(5)從C中調(diào)用C++
下面的例子顯示了如何從C++代碼中調(diào)用C程序。
下面的代碼顯示了被調(diào)用C++代碼。
structS{//本結(jié)構(gòu)沒有基類和虛擬函數(shù)
S(ints):i(s){}
inti;
};
externCvoidcppfunc(S*p){
//定義被調(diào)用的C++代碼
//連接了C功能
p->i+=5;//
}
調(diào)用了C++代碼的C函數(shù)。
structS{
inti;
};
externvoidcppfunc(structS*p);
/*聲明將會被調(diào)用的C++功能*/
intf(void){
structSs;
s.i=2;/*初始化S*/
cppfunc(s);/*調(diào)用cppfunc函數(shù),該函數(shù)可能改變S的值*/
returns.i*3;
}
c++相關(guān)文章:c++教程
評論