子程序(也叫過程、函數、方法)是一個能被調用和執行并返回到調用點那條指令的代碼
段。
兩個問題:如何將參數傳遞給子程序或從子程序中傳遞出來?怎么從子程序返回到調用點?
指令BSR Proc_A調用子程序Proc_A。
處理器將調用代碼中要執行的下一條指令的地址保存到一個安全的地方,然后把目標地址
Proc_A,子程序的第一條指令,加載到程序計數器中。
把一個非順序地址加載到PC就強制跳轉到子程序中。
在子程序末尾,從子程序中返回指令RTS,使處理器返回到子程序調用點的下一條指令。
ARM對子程序的支持
ARM沒有像CISC處理器那樣提供全自動的子程序調用與返回機制。
ARM的分支并鏈接指令BL,自動將返回地址保存在寄存器r14中。
分支指令的格式中帶有一個8位操作碼和24位有符號的相對程序計數器的偏移量。由于分
支目標地址是一個字地址,分支地址按32位字邊界對齊,因此將24位偏移量左移兩位,把
字偏移地址轉換成字節地址,然后26位字節地址被符號擴展成32位,并被加到PC上,由于
分支地址偏移量為26位(24+2),因此條件分支的尋址范圍為PC-32M~PC+32M字節:
分支并鏈接指令與對應的分支指令基本相同,但它會返回地址(即調用指令后的下一條執
行指令的地址)復制到鏈接寄存器r14中,如:
BL Sub_A ;帶鏈接跳轉到Sub_A,保存返回地址到r14
ARM執行了分支指令,將跳轉到標號Sub_A目標地址處,還會將寄存器r15中的值復制到
r14中,以保存返回地址。子程序的末尾通過把r14中保存的返回地址傳送到PC中,其返回
到主程序。ARM無需特殊的返回指令,僅需簡單的寫成:
MOV pc,lr ; 也可寫成MOV r15,r14