1、STR lr, [sp, #-4]! 是將lr寄存器也稱鏈接寄存器r14(用于保存子程序的返回地址)的值(32位)存入sp指向堆棧的地址,從sp到sp-3地址單元。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供華州網(wǎng)站建設(shè)、華州做網(wǎng)站、華州網(wǎng)站設(shè)計、華州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、華州企業(yè)網(wǎng)站模板建站服務(wù),10年華州做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
2、匯編代碼沒有保持8字節(jié)棧對齊而調(diào)用C或C++代碼。ADS下的代碼用RVDS2編譯時,即使已經(jīng)8字節(jié)棧對齊,連接器也將之當作非8字節(jié)棧對齊。所以要用偽指令指明一下。
3、匯編跳至C語言代碼執(zhí)行,自動調(diào)用R0,R1等來傳遞參數(shù),比如R0傳遞給a,R1傳遞給b,以此類推。返回時自動用R0傳遞返回值。
4、你想搞清楚如果跨語言編程,最好徹底明白C語言的機制。也就是寫一段函數(shù)調(diào)用程序比如下面的 main(){ int i;} fu(int i){in j} 然后編譯成匯編語言,好好研究一下?;蛘咴購?fù)雜一點。
5、調(diào)用匯編則更簡單,unsigned int UserAppPTR = 0x00081040; //設(shè)置成匯編入口的絕對地址。
論C和匯編的混合編程,包括相互之間的函數(shù)調(diào)用。下面分四種 情況來進行討論,暫不涉及C++。
一般用的少,在ARM上編程經(jīng)常會用到 把求和1+2+3+、、、+100寫成一個C語言函數(shù),然后保存到頭文件里 在匯編包含C的頭文件文件,然后在匯編中需要的地方就可以調(diào)用函數(shù)了,調(diào)用方法跟調(diào)用 匯編函數(shù)一樣。
實在不會的話,先用C寫出來,然后再匯編調(diào)試界面看看匯編代碼,不是很難。
以下所說嵌入的匯編都是GUN 的C語言中嵌入ARM匯編。
C程序調(diào)用匯編程序 匯編程序的設(shè)計要遵守ATPCS(ARM—Thumb Procedure Call Standard),保證程序調(diào)用時參數(shù)的正確傳遞。在匯編程序中使用EXPORT 偽操作聲明本程序,使得本程序可以被別的程序調(diào)用。
在C程序和ARM匯編程序之間相互調(diào)用時必須遵守ATPCS(ARM-THUMB procedure call standard )規(guī)則。
為了建立調(diào)用與被調(diào)用模塊間的連接關(guān)系,被調(diào)用的匯編程序應(yīng)用global,說明其可被外部模塊調(diào)用;而調(diào)用程序則應(yīng)預(yù)先說明要引用的外部模塊名。下面通過我的例子進行說明,該例是C調(diào)用add0的匯編子程序。
你想搞清楚如果跨語言編程,最好徹底明白C語言的機制。也就是寫一段函數(shù)調(diào)用程序比如下面的 main(){ int i;} fu(int i){in j} 然后編譯成匯編語言,好好研究一下?;蛘咴購?fù)雜一點。
為什么不使用BL來調(diào)用C函數(shù)?因為bl 指令跳轉(zhuǎn)范圍有限(好像4M左右吧),但bl指令可以將返回地址保存在lr中,當然,如果你的跳轉(zhuǎn)范圍不大,也可使用BL,則不需要ldr lr, =int_return 。