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

320×200 螢幕擷圖工具:組合語言源碼解析

     編輯:組合語言

程式功能

這是一個 TSR 螢幕擷圖程式,安裝後常駐記憶體,攔截鍵盤中斷(INT 09h),偵測 F1 鍵(掃描碼 3Bh,程式碼中為 59 可能為擴充鍵盤集),觸發將 VGA 320×200×256 模式(模式 13h)顯示記憶體 A000:0000 完整存檔為 PIC000~PIC999 序列檔案。

核心流程解析

安裝與檔名生成(INIT)

  1. INT 21h/1Ah 設定 DTA → 4Eh/4Fh 搜尋現有 PIC*. 檔案,找出最大序號
  2. 序號以 ASCII 兩位元組儲存於 DTA+35/36(十位/個位),支援 00-99 共 100 張
  3. 安裝 INT 09h 鉤子 → INT 27h 常駐

新 INT 09h 處理器(NEW_INT)

IN AL, 60h             ; 讀掃描碼
TEST AL, 80h           ; 釋放碼忽略
JNZ EXIT1
TEST BYTE PTR ES:[417h], 4 ; Ctrl 鍵按下?
JZ EXIT1
CMP AL, 59             ; F1 掃描碼 (擴充集)
JNZ EXIT1
; 執行擷圖序列
CALL SAVESCR
...
JMP CS:INT9            ; 轉交原處理器

擷圖核心(SAVESCR)

  1. 調色盤保存:INT 10h/AX=1017h 讀取 256 色調色盤 → BUFFER (768 位元組) → 寫入檔案開頭
  2. 建立檔案:INT 21h/3Ch 建立 PICnnn(依 DTA 序號)
  3. 寫入調色盤:INT 21h/40h 寫 768 位元組
  4. 分塊寫入顯示記憶體:
    • 外層迴圈 5 次(REWRITE),每次寫 65535 位元組
    • 內層 WRITE:INT 10h/AX=4F05h 設定顯示開始位置(分頁切換)→ DS=A000h → INT 21h/40h 寫入 64KB
    • 總計 5×64KB = 320KB = 320×200×1 位元組/像素
  5. 關閉檔案:INT 21h/3Eh
  6. 更新序號:DTA 中 ASCII 序號遞增(個位 9→0 進位十位)

技術亮點與限制

  • 分頁式讀取 A000h:VGA 模式 13h 顯示記憶體僅映射 64KB 窗口(A000:0000-A000:FFFF),需透過 INT 10h/4F05h (VESA 設定顯示開始) 切換分頁讀取完整 320KB
  • 調色盤優先存檔:確保檔案自包含,無需外部調色盤檔即可還原真實色彩
  • 檔名自動遞增:利用 DTA 內建緩衝區直接修改 ASCII 序號,無額外變數
  • 限制:僅支援標準模式 13h (320×200×8bit);不支援 VESA 高解析度、True Color 模式

現代對應

現代螢幕擷圖透過 DirectX GetFrontBufferData、GDI BitBlt、Linux DRM drmModeGetFB 等 API 直接讀取桌面緩衝區,無需分頁切換。但「熱鍵觸發 → 影像緩衝區讀取 → 編碼存檔 → 序號管理」完整管線邏輯完全一致。本程式可視為「最小系統螢幕擷圖服務」的教學原型。

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