Intel CPU 支援實模式與保護模式。Windows 採用 32 位保護模式,程式運行於 4 GB 線性位址空間(0 ~ FFFFFFFFh)。本文專注 32 位線性空間的定址機制,助你精準掌握記憶體存取。
線性位址可視為連續位元組陣列。記憶體位址形式為 段選擇子:有效位址。段選擇子存放於段暫存器,透過段描述符表(GDT/LDT)確定段基址、長度、粒度、權限等屬性。有效位址相對於段基址計算。
例如:選擇子 1A7h 對應資料段基址 400000h,載入 DS 後:
DS:0 → 線性位址 400000hDS:1F5278h → 線性位址 5E5278h32 位系統中,單一段即可涵蓋 4 GB 空間,多段存在意義在於存取權限控制(保護模式核心)。
有效位址 = 基址 + 索引 × 比例因子 + 位移量
ESP 外任一通用暫存器範例:[EBP + EDX*8 + 200h]。各項均可省略。
Intel 採 Small Endian:低位元組存低位址。例:803E7D0Ch 記憶體中為 0C 7D 3E 80。暫存器中仍為正常順序 803E7D0Ch。
mov al, byte ptr ds:[edx] ; 讀 0C
mov ax, word ptr ds:[edx] ; 讀 7D0C
mov eax, dword ptr ds:[edx] ; 讀 803E7D0C
若段預設寬度為雙字,存取位元組/字需顯式指定 BYTE PTR/WORD PTR。
EBP/ESP → SS 段需打破規則時使用段超越前綴:MOV EBX, ES:[EDX]。
SS 指定堆疊段ESP 指向堆疊頂PUSH xxx:ESP -= 4,SS:[ESP] = xxx
POP yyy:yyy = SS:[ESP],ESP += 4
ESP 以下記憶體內容視為未定義(下次 PUSH 會覆蓋)。
組合語言直映射機器碼,受硬體限制:
MOV [mem], [mem] —— 記憶體間不可直接傳送MOV DS, 1A7h —— 段暫存器不可直接載入立即數MOV EIP, 3D4E7h —— 指令指標不可直接操作32 位保護模式下的記憶體定址靈活強大,掌握 基址+索引*比例+位移 公式、Small Endian 存儲、段選擇規則與堆疊操作,是編寫高效組合程式、分析反組譯碼的基石。牢記硬體不支援的操作,避免無效嘗試。