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

簡明 x86 組合語言教程 (5):記憶體操作、字串指令與堆疊詳解

     編輯:組合語言

3.4 字串操作指令:高效區塊資料處理

x86 提供專用字串指令配合 REP 前綴,由硬體自動完成重複記憶體操作,效率遠超手工迴圈。

核心字串指令

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 不會清除記憶體內容,舊值仍殘留

堆疊設計原則

  1. 確保足夠空間(含中斷、例外處理所需)
  2. 嚴格配對 PUSH/POP、CALL/RET
  3. 勿手動修改 ESP 除非極度確定(如執行緒切換、例外處理)
  4. 啟用編譯器 堆疊檢查 (/RTCs) 偵測不平衡

本章小結

掌握 字串指令 + REP 前綴 是組合語言高效資料處理的關鍵;理解 DF 旗標 與 緩衝區安全 避免嚴重漏洞;善用 系統堆疊 簡化暫存器保存與參數傳遞。下章將進入子程式與中斷機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
指令功能隱含暫存器方向旗標 DF 影響
MOVSB複製 1 位元組DS:SI → ES:DISI±1, DI±1
MOVSW複製 1 字 (2 位元組)DS:SI → ES:DISI±2, DI±2
MOVSD複製 1 雙字 (4 位元組)DS:SI → ES:DISI±4, DI±4
STOSB/W/D將 AL/AX/EAX 存入 ES:DIES:DIDI±1/2/4
LODSB/W/D從 DS:SI 載入 AL/AX/EAXDS:SISI±1/2/4
SCASB/W/D比較 AL/AX/EAX 與 ES:DIES:DIDI±1/2/4
CMPSB/W/D比較 DS:SI 與 ES:DIDS:SI, ES:DISI±1/2/4, DI±1/2/4