在 x86 保護模式下,段間轉移(遠轉移)涉及段選擇子加載、特權檢查、棧切換。當源與目標代碼段特權級 (CPL) 相同時,屬於「同特權級遠轉移」。
| 指令 | 操作 | 棧變化 | 典型用途 |
|---|---|---|---|
JMP far ptr | 無條件段間跳轉 | 無棧操作 | 任務內模塊跳轉、中斷返回 |
CALL far ptr | 段間調用 | 壓入 CS:EIP (6/10 字節) | 跨段函數調用 |
RETF | 段間返回 | 彈出 CS:EIP,可選加常數釋放參數 | 遠調用返回 |
imm16,ESP += imm16(清理參數,Pascal 約定)。section .text
global _start
_start:
; 設置 GDT、加載段寄存器略
call far [cs:far_func_ptr] ; 遠調用
; 返回後繼續
hlt
far_func_ptr:
dw func_offset ; offset
dw code_seg_sel ; selector
section .text
func_offset:
; 遠函數體
retf ; 遠返回
掌握棧幀結構與段描述符檢查,是編寫可靠底層代碼的基礎。