<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > arm:c語(yǔ)言和匯編混合編程

          arm:c語(yǔ)言和匯編混合編程

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          僅作演示。

          1.C和匯編可相互調(diào)用,匯編子函數(shù)格式參考匯編:普通的函數(shù)調(diào)用的匯編代碼解析http://www.cnblogs.com/mylinux/p/4139972.html

          本文引用地址:http://www.ex-cimer.com/article/201611/317685.htm

            本文演示了 : 匯編嵌入到c語(yǔ)言

                  匯編調(diào)用c語(yǔ)言,c語(yǔ)言調(diào)用匯編。

          2.C函數(shù)參數(shù)從左到右是放到r0-r3,[不夠再push stack];push stack用stmfd ldmfd,右邊的參數(shù)會(huì)先入棧。

          ;//call_asm.sPRESERVE8AREA C$$code, CODE, READONLY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IMPORT cfunc_printIMPORT c_addIMPORT c_subEXPORT AsmCallerAddEXPORT AsmCallerSubEXPORT AsmCallerPrintEXPORT slib_ReadCpuStatusAsmCallerAdd              ; ,執(zhí)行子函數(shù)TestFunc6(1,2)sub r13, r13, #4    ;sp-=4 str r14, [r13]      ;sp>lrbl c_add            ;BL : r0,r1中的參數(shù)傳到子函數(shù)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/*根據(jù)“ARM-thumb 過(guò)程調(diào)用標(biāo)準(zhǔn)”:r0-r3    用作傳入函數(shù)參數(shù),傳出函數(shù)返回值。在子程序調(diào)用之間,可以將 r0-r3 用于任何用途。被調(diào)用函數(shù)在返回之前不必恢復(fù) r0-r3。如果調(diào)用函數(shù)需要再次使用 r0-r3 的內(nèi)容,則它必須保留這些內(nèi)容。r4-r11   被用來(lái)存放函數(shù)的局部變量。如果被調(diào)用函數(shù)使用了這些寄存器,它在返回之前必須恢復(fù)這些寄存器的值。r12      是內(nèi)部調(diào)用暫時(shí)寄存器 ip。它在過(guò)程鏈接膠合代碼(例如,交互操作膠合代碼)中用于此角色。在過(guò)程調(diào)用之間,可以將它用于任何用途。被調(diào)用函數(shù)在返回之前不必恢復(fù) r12。r13      是棧指針 sp。它不能用于任何其它用途。sp 中存放的值在退出被調(diào)用函數(shù)時(shí)必須與進(jìn)入時(shí)的值相同。r14      是鏈接寄存器 lr。如果您保存了返回地址,則可以在調(diào)用之間將 r14 用于其它用途,程序返回時(shí)要恢復(fù)r15      是程序計(jì)數(shù)器 PC。它不能用于任何其它用途。注意:在中斷程序中,所有的寄存器都必須保護(hù),編譯器會(huì)自動(dòng)保護(hù)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_cp15n");__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_asmn");}void asm_demo(void){int i, j,a ;Uart_Printf("asm_demon");asm_c_ctl_cp15();//在c中使用匯編語(yǔ)言操作協(xié)處理器cp15Uart_Printf("4+5 = %d n" ,  AsmCallerAdd(4, 5) ); //匯編調(diào)用c語(yǔ)言函數(shù)//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 .//函數(shù)參數(shù)從左到右是放到r0-r3,[不夠再push stack]//push stack用stmfd ldmfd,右邊的參數(shù)會(huì)先入棧//STMFD&&LDMFD  http://www.cnblogs.com/mylinux/p/4139972.htmlUart_Printf("9-5 = %d n" ,  AsmCallerSub(9, 5) );//匯編調(diào)用c語(yǔ)言函數(shù)Uart_Printf("slib_ReadCPSR :%x n" , asm_c_ReadCPSR() ); //在c語(yǔ)言中混合匯編,讀取Cpsr寄存器AsmCallerPrint();//匯編調(diào)用c語(yǔ)言函數(shù)switch(0x1f & slib_ReadCpuStatus()){//c語(yǔ)言調(diào)用匯編編寫的函數(shù)case 0x13:Uart_Printf("in svcn" , 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



          關(guān)鍵詞: armc語(yǔ)言匯編混合編

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();