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

經典 DOS 組合語言源碼賞析:SHOWMEM 記憶體檢視工具

     編輯:組合語言

前言

這是一段來自 DOS 時代的經典組合語言源碼——SHOWMEM,由 Ronald Nordberg 於 1997 年編寫。雖然 DOS 早已成為歷史,但這類底層工具的源碼對於學習 x86 組合語言、理解實模式記憶體管理以及 DOS 系統調用仍有極高的參考價值。程序功能簡單直接:讓用戶指定一個段地址與偏移量(或線性地址),即可以十六進制與 ASCII 碼雙重形式查看該記憶體區域的內容,按鍵翻頁,按 Q 退出。

核心功能解析

命令列參數解析

程序啟動於 ORG 100h 的 .COM 格式入口。parse 例程負責從 PSP 的 80h 處讀取命令列字串,去除前導空白,以空白鍵為分隔符將參數以零結尾字串形式存入 inbuff 緩衝區。若無參數則跳轉至 usage 顯示幫助訊息。

十六進制 ASCII 轉二進制

hexbin 例程採用經典的「移位累加」演算法:逐字元讀取輸入緩衝區,先判斷是否為 '0'-'9' 或 'A'-'F'(不區分大小寫),合法字元將其高 4 位清零(數字直接 AND 0Fh,字母再加 9 再 AND 0Fh),再將 32 位暫存器 EDX 左移 4 位並加上新數值。遇到非法字元即刻返回,EDX 中即為解析出的 32 位線性地址。

記憶體分頁顯示

主迴圈 dopage 每次處理 512 位元組(32 行 × 16 列)。showpage 例程將 ES:SI 指向的記憶體內容格式化為:

  • 左側:16 組兩位十六進制數,每組間隔一空格
  • 中間:兩空格分隔
  • 右側:對應 16 個 ASCII 字元,不可列印字元以 '.' 代替

每行末尾附加 CR/LF 並以 write 例程透過 DOS 21h/40h 功能呼叫輸出至標準輸出。每 17 行暫停一次,提示「Any Key = Next 256 Bytes」,按 Q 退出,其它鍵繼續。

輔助例程

  • binhex:將 16 位二進制轉為 4 位十六進制 ASCII 字串,採用 DAA 與 ADC 技巧實現無分支十六進制轉換
  • write:通用字串輸出,先掃描長度再呼叫 DOS 寫檔案控制代碼 1(標準輸出)

技術亮點

  • 完整展示實模式下段:偏移與線性地址互換
  • 善用 DAA(十進制調整)輔助十六進制轉 ASCII,避免查表
  • 鍵盤輪詢採用 BIOS 16h/00h 非阻塞讀取,配合大小寫轉換判斷退出鍵
  • 代碼結構清晰,模組化程度高,適合作為教學範例

現代視角的啟示

雖然現代作業系統已禁止使用者程式直接存取實體記憶體,但 SHOWMEM 所展示的「地址解析 → 記憶體讀取 → 格式化輸出 → 交互式分頁」流程,正是現代除錯器記憶體視窗的雛形。研讀此代碼有助於建立「位址空間、資料表示、I/O 抽象」三大核心觀念。

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