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

簡明 x86 組合語言教程 (4):實模式與保護模式記憶體架構全解析

     編輯:組合語言

第三章 記憶體操作基礎

暫存器容量有限,程式必須存取記憶體保存大量資料。x86 歷經實模式 → 保護模式 → 長模式演進,記憶體定址機制發生根本變化。

3.1 實模式:段:位移 20 位元定址

歷史緣起

  • 8086 只有 16 位元暫存器,但位址匯流排 20 位元 (1MB)
  • 折衷方案:段暫存器 × 16 + 位移 = 實體位址
  • 段大小固定 64KB (16 位元位移)

位址計算

實體位址 = (段暫存器 << 4) + 位移
範例: 0000:0010 = 0x00010
      0001:0000 = 0x00010  (同一實體位址)
      0123:0004 = 0x1234
      0120:0034 = 0x1234

段粒度 = 16 位元組:段值 +1 相當於位移 +16。

練習:段:位移轉 20 位元位址

段:位移實體位址
2EA8:D6780x3C1F8
26CF:8D5F0x2FA5F
453A:CFAD0x5234D
2933:31A60x2C4D6
5924:DCCF0x66F0F

經典 .COM 程式:Hello World

.MODEL TINY
.CODE
CR equ 13
LF equ 10
TERMINATOR equ '$'
ORG 100h
Main PROC
  mov dx, offset sMessage
  mov ah, 9
  int 21h           ; DOS 顯示字串
  mov ax, 4c00h
  int 21h           ; 終止程式
Main ENDP
sMessage:
  DB 'Hello, World!', CR, LF, TERMINATOR
END Main
  • .COM 限制 <64KB,CS=DS=SS,ORG 100h 留 256 位元組 PSP
  • DB 定義資料與指令同樣編碼,可用 DB 機器碼 繞過組譯器限制
  • DOS 載入時自動初始化段暫存器

.EXE 程式:分段架構

.MODEL SMALL
.STACK 200h
.DATA
Message DB 'Hello, World !', 13, 10, '$'
.CODE
Main PROC
  mov ax, DGROUP
  mov ds, ax        ; 載入資料段
  mov dx, offset Message
  mov ah, 9
  int 21h
  mov ax, 4c00h
  int 21h
Main ENDP
END Main
  • 擁有獨立 .STACK、.DATA、.CODE 段
  • 支援重新定位,入口點不固定
  • 512 位元組堆疊佔主要體積

3.2 保護模式:線性位址與描述符表

核心差異

描述符表機制

  • GDT (Global Descriptor Table):系統級段描述符
  • LDT (Local Descriptor Table):每程序私有段描述符
  • 選擇子結構:Index (13 bits) | TI (1 bit) | RPL (2 bits)
  • 描述符含:基址 32 位元、限界 20 位元、屬性 (型別、DPL、P、AVL 等)

為什麼叫「保護」模式?

  • 進程間記憶體隔離:非法存取觸發 #GP/#PF 例外
  • OS 捕獲例外 → 終止違規進程,系統其餘進程不受影響
  • 對比實模式:空指標解參考會覆寫中斷向量表 → 死機

3.3 記憶體操作指令語法

運算元大小指定

特性實模式保護模式
位址寬度20 位元 (1MB)32 位元 (4GB)
定址方式段:位移選擇子 + 位移 → 線性位址
段暫存器16 位元段基址/1632 位元選擇子 (索引 GDT/LDT)
記憶體保護無分頁 + 特權級 (CPL/DPL/RPL)

定址模式

mov ax, [0]           ; 直接定址 DS:0
mov bx, 0
mov ax, [bx]          ; 暫存器間接 DS:BX
mov ax, [bx+10]       ; 基址+位移
mov ax, [bx+si]       ; 基址+變址
mov ax, es:[di+bp]    ; 段覆寫 + 基址+變址

MOV 指令完整形式

mov reg, reg/mem/imm
mov mem, reg/imm
; 注意:mem-to-mem 不允許,需經暫存器

小結

實模式段:位移機制雖簡單但受限 1MB 且無保護;保護模式引入選擇子/描述符/分頁,實現 4GB 線性位址空間與硬體記憶體保護。理解兩者差異是編寫系統級程式的基礎。下章將介紹字串操作與堆疊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
前綴大小範例
BYTE PTR8 位元mov byte ptr [100h], 12h
WORD PTR16 位元mov word ptr [100h], 1234h
DWORD PTR32 位元mov dword ptr [100h], 12345678h