您的位置 首页 知识

arm:c语言和汇编混合编程

仅作演示。1.C和汇编可相互调用,汇编子函数格式参考汇编:普通的函数调用的汇编代码解析http://www.cnblogs.com/mylinux/p/4139972.html…

仅作演示。

1.C和汇编可彼此调用,汇编子函数格局参阅汇编:一般的函数调用的汇编代码解析http://www.cnblogs.com/mylinux/p/4139972.html

  本文演示了 : 汇编嵌入到c言语

        汇编调用c言语,c言语调用汇编。

2.C函数参数从左到右是放到r0-r3,[不行再push stack];push stack用stmfd ldmfd,右边的参数会先入栈。

;//call_asm.sPRESERVE8AREA C$$code, CODE, READONLY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IMPORT cfunc_printIMPORT c_addIMPORT c_subEXPORT AsmCallerAddEXPORT AsmCallerSubEXPORT AsmCallerPrintEXPORT slib_ReadCpuStatusAsmCallerAdd              ; ,履行子函数TestFunc6(1,2)sub r13, r13, #4    ;sp-=4 str r14, [r13]      ;sp>lrbl c_add            ;BL : r0,r1中的参数传到子函数ldr r14, [r13]      ;lr>sp  add r13, r13, #4    ;sp+=4 bx r14              ;goto spAsmCallerSub mov     ip, spstmfd   sp!, {fp, ip, lr, pc}sub     fp, ip, #4bl      c_subldmfd   sp, {fp, sp, pc}  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AsmCallerPrint sub r13, r13, #4    ;sp -= 4 str r14, [r13]      ;sp > lrbl cfunc_print      ; ldr r14, [r13]      ;lr > sp  add r13, r13, #4    ;sp += 4 bx r14              ;goto spslib_ReadCpuStatusmov     ip, spstmfd   sp!, {fp, ip, lr, pc}sub     fp, ip, #4mrs     r0,cpsrldmfd   sp, {fp, sp, pc}END
//asm_c.c/*依据“ARM-thumb 进程调用规范”:r0-r3    用作传入函数参数,传出函数回来值。在子程序调用之间,能够将 r0-r3 用于任何用处。被调用函数在回来之前不用康复 r0-r3。假如调用函数需求再次运用 r0-r3 的内容,则它有必要保存这些内容。r4-r11   被用来寄存函数的局部变量。假如被调用函数运用了这些寄存器,它在回来之前有必要康复这些寄存器的值。r12      是内部调用暂时寄存器 ip。它在进程链接胶合代码(例如,交互操作胶合代码)顶用于此人物。在进程调用之间,能够将它用于任何用处。被调用函数在回来之前不用康复 r12。r13      是栈指针 sp。它不能用于任何其它用处。sp 中寄存的值在退出被调用函数时有必要与进入时的值相同。r14      是链接寄存器 lr。假如您保存了回来地址,则能够在调用之间将 r14 用于其它用处,程序回来时要康复r15      是程序计数器 PC。它不能用于任何其它用处。留意:在中止程序中,一切的寄存器都有必要维护,编译器会主动维护R4~R11*/int c_add(int a ,int b){return a+b;}int c_sub(int a ,int b){return a-b;}unsigned int asm_c_ctl_cp15(void){unsigned int i = 0;Uart_Printf("asm_c_ctl_cp15\n");__asm {mrc p15,0,r0,c1,c0,0 MOV i,r0}return i;}unsigned int asm_c_ReadCPSR(void){unsigned int i = 0;__asm {mrs     r0,cpsrMOV i,r0}return i;}void cfunc_print(){Uart_Printf("this is cfunc_print,called_by_asm\n");}void asm_demo(void){int i, j,a ;Uart_Printf("asm_demo\n");asm_c_ctl_cp15();//在c中运用汇编言语操作协处理器cp15Uart_Printf("4+5 = %d \n" ,  AsmCallerAdd(4, 5) ); //汇编调用c言语函数//mdk_jlink://get into AsmCallerAdd(4, 5) :  r0=4 ,r1=5 //get into c_add    : r0=4 ,r1=5 //return from c_add : r0=9//return from AsmCallerAdd: r0=0x36160 ,r1=9 .//函数参数从左到右是放到r0-r3,[不行再push stack]//push stack用stmfd ldmfd,右边的参数会先入栈//STMFD&&LDMFD  http://www.cnblogs.com/mylinux/p/4139972.htmlUart_Printf("9-5 = %d \n" ,  AsmCallerSub(9, 5) );//汇编调用c言语函数Uart_Printf("slib_ReadCPSR :%x \n" , asm_c_ReadCPSR() ); //在c言语中混合汇编,读取Cpsr寄存器AsmCallerPrint();//汇编调用c言语函数switch(0x1f & slib_ReadCpuStatus()){//c言语调用汇编编写的函数case 0x13:Uart_Printf("in svc\n" , a);} }// asm_demo// asm_c_ctl_cp15// 4+5 = 9 // 9-5 = 4 // slib_ReadCPSR :60013    //mode[4-0] 10011 svc形式。// this is cfunc_print,called_by_asm。// in svc

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/276675.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部