請閱讀【嵌入式開發(fā)學(xué)習(xí)必備專欄 】
ARM RET 與 ERET
在 ARMv8 架構(gòu)中,RET
指令用于從函數(shù)或者過程返回。它主要負(fù)責(zé)從當(dāng)前過程跳轉(zhuǎn)回調(diào)用者,并恢復(fù)調(diào)用者的程序計數(shù)器 (PC) 的值。
語法:
RET {Xn}
Xn
是一個可選的寄存器,通常為 X30
(也稱為 LR
,鏈接寄存器),其中包含返回地址。如果沒有指定寄存器,則默認(rèn)為 X30
。
工作原理:文章來源:http://www.zghlxwxcb.cn/news/detail-846087.html
- 將
Xn
(通常是LR
)寄存器中的值加載到程序計數(shù)器PC
中,從而跳回到調(diào)用過程之后的地址。 - 根據(jù)需要更新程序狀態(tài),如堆棧指針
SP
和其他調(diào)用約定相關(guān)的寄存器。
示例:文章來源地址http://www.zghlxwxcb.cn/news/detail-846087.html
func:
// 函數(shù)內(nèi)容
RET // 返回到調(diào)用者,等同于 RET X30
another_func:
// 另一個函數(shù)內(nèi)容
RET X29 // 如果X29寄存器中存放了返回地址,則使用它返回
ARMv8 ERET 指令
ERET
指令用于從異常返回,特別是從中斷或陷阱處理程序返回到之前的執(zhí)行上下文。ERET
還原 Exception Level (EL) 發(fā)生變化前的程序狀態(tài),它通常在處理操作系統(tǒng)級別的代碼中使用。
語法:
ERET
ERET
指令沒有操作數(shù)。
工作原理:
- 從
ELR_ELx
(Exception Link Register)恢復(fù)程序計數(shù)器PC
。 - 從
SPSR_ELx
(Saved Program Status Register)恢復(fù)程序狀態(tài)寄存器CPSR
(Current Program Status Register),包括標(biāo)志位和執(zhí)行狀態(tài)(例如 ARM 或 Thumb 模式)。
示例:
// 假設(shè)處于異常處理程序內(nèi)部
// 執(zhí)行 ERET 會返回到觸發(fā)異常的指令之后的程序地址
ERET
RET 與 ERET 的區(qū)別
-
RET
用于標(biāo)準(zhǔn)的函數(shù)返回,而ERET
用于從異常或中斷處理程序返回。 -
RET
只是簡單地將鏈接寄存器LR
的值加載到程序計數(shù)器PC
中,不會改變當(dāng)前的執(zhí)行級別或恢復(fù)程序狀態(tài)。 -
ERET
會加載ELR_ELx
中的值到PC
,并從SPSR_ELx
恢復(fù)狀態(tài)寄存器。它會改變處理器的執(zhí)行級別,通常是從更高的異常級別(EL1, EL2, EL3)返回到較低的應(yīng)用級別(EL0)。 -
ERET
是一個更復(fù)雜的指令,它用于在更嚴(yán)格和受控的環(huán)境中切換上下文,如操作系統(tǒng)的中斷處理。
到了這里,關(guān)于【ARM64 常見匯編指令學(xué)習(xí) 21 -- ARM RET 與 ERET】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!