C語言和ARM匯編語言的相互調用
1.匯編程序訪問C語言全局變量
全局變量隻能通過地址間接調用,為了訪問C語言中全局變量,首先要通過extern偽指令引入全局變量,然後將其地址裝入寄存器中。
對於unsigned char類型,使用LDRB/STRB訪問;
對於unsigned short類型,使用LDRH/STRH訪問;
對於unsigned int類型,使用LDR/STR訪問;
對於char類型,使用LDRSB/STRSB訪問;
對於short類型,使用LDRSH/STRSH訪問;
例子:
.text
.global asmsubroutine
.extern globvar
asmsubroutine:
LDR R1,=globvar
LDR R0,[R1]
ADD R0,R0,#2
STR R0,[R1]
MOV PC,LR
.end
2.C程序調用匯編程序
C程序調用匯編程序首先通過extern聲明要調用的匯編程序模塊,聲明中形參個數要與匯編程序模塊中需要的變量個數一致,且參數傳遞要滿足ATPCS規則,然後在C程序中調用。
例子:
#include<stdio.h>
extern void *strcopy(char*d,char*s);//模塊聲明
int main()
{
char*srcstr="first";
char*dststr="second";
strcopy(dststr,srcstr);//匯編模塊調用;
}
.text
.global strcopy
Strcopy:
LDRB R2,[R1],#1
STRB R2,[R0],#1
CMP R2,#0
BNE Sstcopy
MOV PC,LR
.end
匯編程序調用C程序
在調用之前必須根據C語言模塊中需要的參數個數,以及ATPCS參數規則,完成參數傳遞,即前四個參數通過R0-R3傳遞,後麵的參數通過堆棧傳遞,然後再利用B、BL指令調用。
例子:
int g(int a,int b,int c,int d,int e)//C語言函數原型
{
return(a+b+c+d+e);
}
匯編語言完成是求i+2i+3i+4i+5i的結果;
.global _start
.text
_start:
.extern g ;引入c程序
STR LR,{SP,-#4}!;保存PC
ADD R1,R0,R0
ADD R2,R1,R0
ADD R3,R1,R2
STR R3,{SP,#-4}!
ADD R3,R1,R1
BL g ;調用C函數g
ADD SP,SP,#4
LDR PC,[SP],#4
.end
return(0);
最後更新:2017-04-03 14:53:48