首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

x86 保護模式下同特權級遠轉移:JMP、CALL、RETF 指令機制與棧操作詳解

     編輯:程式設計疑難解答

x86 保護模式下同特權級遠轉移:JMP、CALL、RETF 指令機制與棧操作詳解

在 x86 保護模式下,段間轉移(遠轉移)涉及段選擇子加載、特權檢查、棧切換。當源與目標代碼段特權級 (CPL) 相同時,屬於「同特權級遠轉移」。

指令行為對比

指令操作棧變化典型用途
JMP far ptr無條件段間跳轉無棧操作任務內模塊跳轉、中斷返回
CALL far ptr段間調用壓入 CS:EIP (6/10 字節)跨段函數調用
RETF段間返回彈出 CS:EIP,可選加常數釋放參數遠調用返回

同特權級 CALL/RETF 詳細流程

  1. CALL far selector:offset:
    • 檢查目標代碼段描述符:類型為代碼段、DPL = CPL、P=1。
    • 將當前 CS:EIP 壓入當前棧(同特權級不切換棧)。
    • 加載新 CS (selector) 和 EIP (offset),開始執行目標代碼。
  2. 目標代碼執行:可訪問調用者棧上的參數(若調用約定約定)。
  3. RETF [imm16]:
    • 從棧彈出 EIP、CS。
    • 若有立即數 imm16,ESP += imm16(清理參數,Pascal 約定)。
    • 恢復執行調用點下一條指令。

代碼示例 (NASM 語法)

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              ; 遠返回

關鍵提示

  • 同特權級遠調用不切換棧,參數傳遞同近調用,但返回地址佔 6 字節 (16 位) 或 10 字節 (32 位)。
  • 調用門提供更安全的跨特權級轉移,同特權級通常直接用遠 CALL。
  • 32 位保護模式下,遠指針為 48 位 (16:32),棧壓入 10 字節。

掌握棧幀結構與段描述符檢查,是編寫可靠底層代碼的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved