| 指令 | 功能 | 隱含暫存器 | 方向旗標 DF 影響 |
MOVSB | 複製 1 位元組 | DS:SI → ES:DI | SI±1, DI±1 |
MOVSW | 複製 1 字 (2 位元組) | DS:SI → ES:DI | SI±2, DI±2 |
MOVSD | 複製 1 雙字 (4 位元組) | DS:SI → ES:DI | SI±4, DI±4 |
STOSB/W/D | 將 AL/AX/EAX 存入 ES:DI | ES:DI | DI±1/2/4 |
LODSB/W/D | 從 DS:SI 載入 AL/AX/EAX | DS:SI | SI±1/2/4 |
SCASB/W/D | 比較 AL/AX/EAX 與 ES:DI | ES:DI | DI±1/2/4 |
CMPSB/W/D | 比較 DS:SI 與 ES:DI | DS:SI, ES:DI | SI±1/2/4, DI±1/2/4 |
REP 前綴家族
REP / REPE / REPZ:CX/ECX ≠ 0 且 ZF=1 時重複
REPNE / REPNZ:CX/ECX ≠ 0 且 ZF=0 時重複
高效複製 512 位元組範例
; 手工迴圈 (慢)
mov cx, 512
next: mov al, ds:[si]
mov es:[di], al
inc si; inc di
loop next
; 字串指令 (快)
cld ; DF=0,遞增模式
mov cx, 128 ; 512/4 = 128 個雙字
rep movsd ; 硬體自動完成
方向旗標 (DF) 陷阱
CLD 清除 DF (遞增)、**STD 設定 DF (遞減)**
- 錯誤的 DF 會導致緩衝區溢位:向錯誤方向讀寫記憶體
- 緩衝區溢位是資安漏洞主要來源(CERT 公告 60%+ 相關)
- 防禦:嚴格檢查緩衝區邊界、使用安全函式、啟用 /GS 編譯選項
3.5 保護模式記憶體操作補充
- 32 位元線性位址,直接存取 4GB 記憶體
- 段選擇子指向 GDT/LDT 描述符,含基址、限界、屬性
- 選擇子載入需謹慎,錯誤值導致
#GP 或 #PF
- 範例:
mov edi, 0A0000h; mov byte ptr [edi], 0Fh 直接操作 VGA 顯存
3.6 堆疊:系統管理的 FILO 結構
特性
- 先進後出 (FILO),由 CPU 自動管理指標
ESP/RSP
PUSH:ESP -= 4 → 寫入記憶體
POP:讀取記憶體 → ESP += 4
- 隱式使用堆疊的指令:
CALL/RET、INT/IRET、ENTER/LEAVE、PUSHA/POPA
堆疊操作視覺化
執行前: ESP → [空]
mov ax, 1234h
mov bx, 10
push ax ; ESP-4, [ESP]=1234h
push bx ; ESP-4, [ESP]=0010h
執行後堆疊 (低位址在上):
ESP → 0010h
1234h
...舊資料...
pop dx ; dx=0010h, ESP+4
pop cx ; cx=1234h, ESP+4
注意:POP 不會清除記憶體內容,舊值仍殘留
堆疊設計原則
- 確保足夠空間(含中斷、例外處理所需)
- 嚴格配對
PUSH/POP、CALL/RET
- 勿手動修改
ESP 除非極度確定(如執行緒切換、例外處理)
- 啟用編譯器 堆疊檢查 (/RTCs) 偵測不平衡
本章小結
掌握 字串指令 + REP 前綴 是組合語言高效資料處理的關鍵;理解 DF 旗標 與 緩衝區安全 避免嚴重漏洞;善用 系統堆疊 簡化暫存器保存與參數傳遞。下章將進入子程式與中斷機制。
- 上一篇文章: 簡明 x86 組合語言教程 (6):子程式與中斷機制全解析
- 下一篇文章: 簡明 x86 組合語言教程 (4):實模式與保護模式記憶體架構全解析
Copyright ©
程式碼之家 All Rights Reserved