C语言和ARM汇编语言的相互调用 |
您所在的位置:网站首页 › 汇编调用c语言的例子 › 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 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); |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |