關鍵詞:
匯編語言
ARM的狀態寄存器CPSR中的狀態控制位T決定了當前處理器的運行狀態,因此,可通過MSR和MRS指令來直接修改CPSR的狀態位,也能夠改變處理器運行狀態。但由于ARM采用多級流水線的結構,這樣做會造成流水線上預取指令的執行錯誤,而如果用BX指令,則不會出現這樣的問題。
在同一狀態下的子程序調用,由于它不需要狀態的切換,所以其過程相對比較簡單,通常只需一條指令實現調用:
BL function
實現返回也只需從LR恢復PC即可:
MOV PC,LR
在不同狀態下的子程序調用中,就需要進行狀態之間的切換,所以其過程相對復雜一些,需要考慮到以下幾點:
需要由BX來切換狀態,因為BL不能完全成狀態切換。
需要在BX之前先保存好LR,BX不能自動保存返回地址到LR。
需要用“BX LR”來返回,不能使用“MOV PC,LR”,返回時要仔細考慮保存在LR中最低位的內容是否正確。
在這里需要注意的是:
函數func1()和func2()位于2個不同的源文件中。
在圖中,func1()使用BL指令調用func2(),而返回時直接使用“BX LR”。這是因為當執行BL指令對LR進行保存時,其最低位會被自動設置,以滿足返回時狀態切換的需要。
編譯時必須告訴編譯器和鏈接器足夠的信息,一方面讓編譯器能夠使用正確的指令碼進行編譯;另一方面,當在不同的狀態之間發生函數調用時,鏈接器插入一段鏈接代碼來實現狀態轉換。
本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。