arm:c語言和彙編混合編程

2020-12-17 電子產品世界
僅作演示。

1.C和彙編可相互調用,彙編子函數格式參考彙編:普通的函數調用的彙編代碼解析http://www.cnblogs.com/mylinux/p/4139972.html

本文引用地址:http://www.eepw.com.cn/article/201611/317685.htm

  本文演示了 : 彙編嵌入到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

相關焦點

  • ARM中ADS環境下C語言和彙編語言混合編程及示例
    另外在一些對性能非常敏感的代碼塊,基於彙編與機器碼一一對應的關係,這時不能依靠C編譯器的生成代碼,而要手工編寫彙編,從而達到優化的目的。彙編語言是和CPU的指令集緊密相連的,作為涉及底層的嵌入式系統開發,熟練對應彙編語言的使用也是必須的。這裡主要討論C和彙編的混合編程,包括相互之間的函數調用。下面分四種情況來進行討論,不涉及C++語言。
  • C語言和ARM彙編混合編程實現階乘運算
    階乘運算必須用彙編語言實現;2. 通過C語言調用階乘運算結果並顯示出來。本文引用地址:http://www.eepw.com.cn/article/201611/316769.htm(1) 用彙編語言編寫階乘運算子程序,命名為zmc.s;程序如下:AREA asmfile,CODE,READONLY EXPORT asmDoubleasmDouble sub R1,R0,#1
  • Keil中C語言與彙編語言混合編程需要注意的幾個地方
    點擊上方 「 暢學電子 」 一鍵關注,輕鬆學習電子知識暢學電子網·訂閱號每天更新電子行業技術文章,及單片機最新資訊,隨時隨地輕鬆學習在keil C語言與彙編語言的混合編程中曾經遇到過的一些問題
  • 自學編程第1節:程式語言有哪些,什麼關係?彙編C/C++,JAVA簡介
    首先,謝謝大家點擊閱讀獵奇哥的編程系列教程,後期慢慢補充,詳細介紹C語言,C++語言編程的方方面面,儘量幫助大家能夠儘量簡單的學會C++編程核心入門知識。總章節數待定,視內容的更新情況。說起編程,最早的是彙編語言,這種語言大家通常叫做低級語言,做一個程序,需要非常多的指令和代碼,完成的卻是一個非常簡單的功能,程式設計師的工作量非常大,當然,那個時期,電腦的功能也沒有現在的這麼強大,彙編對於當時來說,也是夠用。
  • PIC單片機asm與C混合編程
    另外,PICC 的彙編編譯器要求輸入原程序文件的擴展名是「*.as」,而MPASM 預設認定的原程序以「*.asm」為擴展名。在基於PICC 編譯環境下開發PIC 單片機的C 語言應用程式時基本無需關心其彙編編譯器,除非是在混合語言編程時用彙編語言編寫完整的彙編原程序模塊文件。
  • 嵌入式系統高級C語言編程
    內容簡介  《嵌入式系統高級C語言編程》將主要介紹針對嵌入式系統的基於C語言的軟體項目開發的流程,較為複雜的c語言編程知識和技巧,編程風格和調試習慣
  • 提高C語言編程的四大秘訣傳授
    簡潔而便利的C語言代碼會讓自己的工作更加輕鬆,同時一方麵團隊的合作,是很多工程師追求的目標,本文就工作中的一些體會和經驗做相關的闡述。第1招:以空間換時間電腦程式中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程序的效率問題,我們就有了解決問題的第1招--以空間換時間。
  • python+C、C++混合編程的應用
    在有些領域,比如通信,性能很關鍵,但並不意味這個領域的coder只能苦苦掙扎於c/c++的陷阱中,比如可以使用多種語言混合編程。我看到的一個很好的Python與c/c++混合編程的應用是NS3(Network Simulator3)一款網絡模擬軟體,它的內部計算引擎需要用高性能,但在用戶建模部分需要靈活易用。
  • 【愛找茬】都是C語言,單片機C語言和普通的C語言究竟有什麼差異呢?
    許多小夥伴在學完C語言後想入門單片機,但學著學著發現明明都是C語言,為什麼單片機C語言和我當初學的C語言有差異呢?今天小編就來梳理我們平時所學的C語言與單片機C語言的有什麼樣的不同。
  • DSP編程技巧之24---C/C++與彙編語言的交互之-(2)從C/C++代碼調用...
    在C/C++與彙編語言混合編程的情況下,一般我們都會選擇C/C++來實現所期待的大部分功能,對於少數和硬體關聯度高(例如操作某些CPU寄存器)以及對運算的實時性要求高(例如高速、多點的FFT)的功能才使用彙編來實現,這就使得大多數情況下,C/C++與彙編的交互都是從C/C++代碼調用彙編代碼中的函數
  • 有關arm彙編中的align
    經常會看到arm-linux彙編中有如下的指令:.arm-linu是按照2^n的方案對齊的,需要說明的是這個對齊和ld-script裡的對齊不同,不是一會事。For other systems, including the i386 using a.out format, and the arm and strongarm,it is the number of low-order zero bits the location counter must have after advancement.
  • 程式語言那些事
    提起編程,一定離不開程式語言,有些軟體既可以用A語言來編寫,也可以用B語言來編寫,為什麼會有這麼多程式語言,面對這麼多程式語言該如何選擇。彙編語言由於機器語言的難於記憶,因此人們使用一些符號來表示指定的寄存器和操作,這就是彙編語言。在彙編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數的地址。在不同的設備中,彙編語言對應著不同的機器語言指令集,通過彙編過程轉換成機器指令。
  • 混合使用C、C++和彙編語之:內聯彙編和嵌入型彙編的使用
    使用它可以在C/C++程序中實現C/C++語言不能完成的一些工作。例如,在下面幾種情況中必須使用內聯彙編或嵌入型彙編。·程序中使用飽和算術運算(Saturatingarithmetic),如SSAT16和USAT16指令。·程序中需要對協處理器進行操作。
  • C語言與彙編語言的區別
    而如果是用0」和「1」的序列,毫無特徵,很難被程式設計師記住。這也是為什麼要有彙編語言產生的原因了。以上對彙編語言的解釋基本上就道出了彙編語言的本質,知道了彙編語言的本質,我們不難理解,彙編語言編譯成CPU可執行的機器語言其實只要做一個翻譯的動作就好了,因為,助記符與對應的二進位指令是一一對應的。進而,我們再來解釋為什麼彙編語言會比C語言有更高的執行效率。
  • ARM指令學習筆記
    >SHL R2,3ADD R1,R2就是說arm的指令更人性化,加上後來對arm偽指令的學習,我個人覺得arm指令集是彙編中的高級語言了。該類偽指令如下:條件彙編控制:IF、ELSE和ENDIF宏定義:MACRO和MEND重複彙編:WHILE及WEND這些就是它有點像高級語言的地方,可以用偽指令實現某些高級語句。其實高級語言不就是一個個彙編指令的打包嗎?大同小異。值得提及的是MACRO和MEND,這個東西感覺就是C中的#define,很強大。
  • 基於Cortex-A9 LED彙編、C語言驅動編寫
    四、驅動編寫下面我們分別用彙編和C語言來給LED編寫驅動程序。1.彙編代碼大家如果掌握了我之前講解的彙編指令的知識點,那麼這個代碼很容易就能看明白:.globl _start.arm_start: LDR R0,=0x11000C20 @將配置寄存器GPX1CON的地址寫入到R0 LDR R1,[R0]  @讀取寄存器GPX1CON
  • 編程是什麼——高級程式語言FORTRAN的問世
    而程式語言經歷了機器語言到彙編語言的更新之後,人們發現了限制程序推廣的關鍵因素——程序的可移植性。需要設計一個能夠不依賴於計算機硬體,能夠在不同機器上運行的程序。彙編語言其實只是比機器語言更加容易記憶和書寫,它和機器語言一樣,也是一種面向機器的語言,很難從其代碼上理解程序設計意圖,設計出來的程序需要繼續修改才能夠移植到其他平臺。
  • gcc、arm-linux-gcc和arm-elf-gcc的關係?
    \n"); return 0;}編譯命令為:gcc -o test test.c 編譯生成 test 可執行文件。gcc 編譯流程分為四個步驟:預處理、編譯 、彙編、連結。個人認為預處理和編譯主要由 gcc-core 來完成,彙編和連結主要由 Binutils 來完成。
  • C語言對8051 編程
    1 為什麼要用高級語言當設計一個小的嵌入式系統時 一般我們都用彙編語言 在很多工程中 這是一個很好的方法 因為 代碼一般都不超過
  • 學習C語言必看的最經典書籍
    、提高、開發、拓展全攻略》  這本比較好的c語言學習書籍從實際應用入手,以實驗過程和實驗現象為主導,循序漸進地講述51單片機c語言編程方法以及51單片機的硬體結構和功能應用。全書共分5篇,分別為入門篇、內外部資源操作篇、提高篇、實戰篇和拓展篇。本學習c語言必看的最經典書籍內容豐富,實用性強,書中大部分內容均來自科研工作及教學實踐,許多c語言代碼可以直接應用到工程項目中。本書配套光碟提供13講近30學時的教學視頻和本書實例代碼,可使讀者更快更好地掌握單片機知識和應用技能。