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

組合語言學習指南(二):32 位保護模式記憶體定址完整指南

     編輯:組合語言

前言:從實模式到線性位址空間

Intel CPU 支援實模式與保護模式。Windows 採用 32 位保護模式,程式運行於 4 GB 線性位址空間(0 ~ FFFFFFFFh)。本文專注 32 位線性空間的定址機制,助你精準掌握記憶體存取。

線性位址與段選擇子

線性位址可視為連續位元組陣列。記憶體位址形式為 段選擇子:有效位址。段選擇子存放於段暫存器,透過段描述符表(GDT/LDT)確定段基址、長度、粒度、權限等屬性。有效位址相對於段基址計算。

例如:選擇子 1A7h 對應資料段基址 400000h,載入 DS 後:

  • DS:0 → 線性位址 400000h
  • DS:1F5278h → 線性位址 5E5278h

32 位系統中,單一段即可涵蓋 4 GB 空間,多段存在意義在於存取權限控制(保護模式核心)。

有效位址計算公式

有效位址 = 基址 + 索引 × 比例因子 + 位移量

  • 基址:任一 32 位通用暫存器
  • 索引:除 ESP 外任一通用暫存器
  • 比例因子:1、2、4、8
  • 位移量:立即數

範例:[EBP + EDX*8 + 200h]。各項均可省略。

資料寬度與 Small Endian 格式

  • 位元組 (BYTE):8 bits,最大值 0xFF
  • 字 (WORD):2 位元組
  • 雙字 (DWORD):4 位元組

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 段
  • 其他情況 → DS 段

需打破規則時使用段超越前綴:MOV EBX, ES:[EDX]。

堆疊:硬體支援的 LIFO 結構

  • 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 存儲、段選擇規則與堆疊操作,是編寫高效組合程式、分析反組譯碼的基石。牢記硬體不支援的操作,避免無效嘗試。

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