子程式返回地址是指子程式開始執行前的程式計數器(PC)的值,用於在子程式執行完畢後返回到調用點。在ARM架構中,返回地址通常保存在暫存器R14(也稱為連結暫存器LR)中。以下是子程式返回地址的處理過程:
保存返回地址:
在子程式開始執行時,通常會將當前的程式計數器(PC)值減去一個指令的長度(通常是因為PC指向的是即將執行的指令),然後將這個值保存到R14中。這是因為PC通常指向的是下一條要執行的指令,而子程式的執行會改變這個指針。
跳轉到子程式:
使用BL(Branch with Link)指令跳轉到子程式的入口點。這條指令會將返回地址(即R14中的值)保存到堆疊中,並更新PC以指向子程式的開始。
執行子程式:
子程式執行其代碼。
返回:
子程式執行完畢後,使用STMFD指令將R14(即保存的返回地址)和其他暫存器(如果有的話)存入堆疊。
然後使用LDMFD指令從堆疊中彈出R14和其他暫存器,恢復它們的狀態。
最後,PC將從R14中獲取新的值,返回到調用點繼續執行。
總結來說,子程式返回地址的處理涉及到保存當前PC值到R14,然後在子程式結束時使用堆疊操作恢復R14和其他暫存器的值,以便正確返回到調用點。