arm編譯器能編譯c
⑴ ARM中c語言調用匯編程序,如何用ARM編譯器調試啊,急!!!求大家幫助
編程的時候用ADS1.2就可以了,新建一個工程,把匯編的.s和C程序的.c都加進去,注意好程序的入口位置,然後編譯,用AXD進行調試,查看內存,寄存器等值很方面
⑵ arm 匯編調用 C 函數問題
不同的編譯器對C 函數的處理不同,如armcc和gcc就有很多不同,從你的代碼來看,應該使用的是armcc編譯器;
應注意到代碼中涉及兩次返回:函數返回和中斷返回;
進入中斷後,lr寄存器保存的是中斷函數的返回地址,因此中斷返回時出棧時將該返回地址賦給PC即可,這一點比較好理解;
但函數返回的問題比較復雜:
1.為什麼不使用BL來調用C函數?
因為bl 指令跳轉范圍有限(好像4M左右吧),但bl指令可以將返回地址保存在lr中,當然,如果你的跳轉范圍不大,也可使用BL,則不需要ldr lr, =int_return 。
;而「ldr pc, =EINT_Handle」跳轉范圍為4G,但不會保存返回地址。
2. C函數使用 ldr pc, lr來實現返回,所以lr應預先保存好返回地址,即ldr lr, =int_return
⑶ arm編程與C語言的編程區別和方法
匯編主要是要了解CPU指令及用法,常說的是PC機的x86匯編,指令是x86的復雜指令集。緩沖
arm匯編是arm的精簡指令集,比x86容易學,程序格式倒是和x86匯編差不多。
C語言ARM的和x86的差不多,除了對硬體寄存器操作不同,其它語法和流程都一樣。
arm匯編程序每一行是指定arm
core執行一條指令,每條指令都是硬體相關。
如:LDR
R3,
#1
;用LDR指令將數值1放入R3寄存器准備參與運算
C語言與arm指令無關,只與邏輯運算有關,指定硬體地址的操作才與硬體相關;
如果用arm編譯器來編譯,每行可能編譯出1到多條arm指令。
如:i++;
//變數
i
遞增1等效於LDR
R3,#1
;
用LDR指令將數值1放入R3寄存器准備參與運算ADD
R2,
R2,
R3
;
用ADD指旁返令將R2、R3寄存器里的數值相加後放回R2寄存器以上等效匯編的R2、R3寄存器只是為了舉例,運哪飢C語言不像匯編,不需要由程序員指定用哪個寄存器參與運算,編譯器編譯時會根據程序結構自動判斷選擇。
無論是c語言還是匯編語言,編譯器編譯後的結果是機器執行碼,很多人因為匯編語言比較難懂及指令相關,所以以為它就是機器語言,其實它仍是人類設計的編寫程序的語言,仍需要編譯器編譯成機器碼才能執行,它只是比C語言更接近硬體而已。
⑷ arm匯編怎麼調用C程序
.global _C函數名
;然後在匯編裡面
BL _C函數名
;注意調用的前.設置好堆棧就好了.
;當然..如果C函數是單獨一個文件的話,,還是需要編譯這個文件,
;並加入鏈接裡面,如果寫在其他文件裡面的.makefile裡面不需要額外的東西
範例匯編文件.調用C文件的..mycmp函數
xxxx.asm
.global _mycmp
BL _mycmp
yyyyy.c
void mycmp(void)
{}
⑸ ARM編程只用C語言不要匯編可以嗎
可以的,但是c編譯器最終會生成匯編代碼的。