第三章 記憶體操作基礎
暫存器容量有限,程式必須存取記憶體保存大量資料。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:D678 | 0x3C1F8 |
| 26CF:8D5F | 0x2FA5F |
| 453A:CFAD | 0x5234D |
| 2933:31A6 | 0x2C4D6 |
| 5924:DCCF | 0x66F0F |
經典 .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 保護模式:線性位址與描述符表
核心差異
| 特性 | 實模式 | 保護模式 |
| 位址寬度 | 20 位元 (1MB) | 32 位元 (4GB) |
| 定址方式 | 段:位移 | 選擇子 + 位移 → 線性位址 |
| 段暫存器 | 16 位元段基址/16 | 32 位元選擇子 (索引 GDT/LDT) |
| 記憶體保護 | 無 | 分頁 + 特權級 (CPL/DPL/RPL) |
描述符表機制
- 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 記憶體操作指令語法
運算元大小指定
| 前綴 | 大小 | 範例 |
BYTE PTR | 8 位元 | mov byte ptr [100h], 12h |
WORD PTR | 16 位元 | mov word ptr [100h], 1234h |
DWORD PTR | 32 位元 | mov dword ptr [100h], 12345678h |
定址模式
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 線性位址空間與硬體記憶體保護。理解兩者差異是編寫系統級程式的基礎。下章將介紹字串操作與堆疊。
- 上一篇文章: 簡明 x86 組合語言教程 (5):記憶體操作、字串指令與堆疊詳解
- 下一篇文章: 簡明 x86 組合語言教程 (3):暫存器操作與指令集基礎
Copyright ©
程式碼之家 All Rights Reserved