這是一段來自 DOS 時代的經典組合語言源碼——SHOWMEM,由 Ronald Nordberg 於 1997 年編寫。雖然 DOS 早已成為歷史,但這類底層工具的源碼對於學習 x86 組合語言、理解實模式記憶體管理以及 DOS 系統調用仍有極高的參考價值。程序功能簡單直接:讓用戶指定一個段地址與偏移量(或線性地址),即可以十六進制與 ASCII 碼雙重形式查看該記憶體區域的內容,按鍵翻頁,按 Q 退出。
程序啟動於 ORG 100h 的 .COM 格式入口。parse 例程負責從 PSP 的 80h 處讀取命令列字串,去除前導空白,以空白鍵為分隔符將參數以零結尾字串形式存入 inbuff 緩衝區。若無參數則跳轉至 usage 顯示幫助訊息。
hexbin 例程採用經典的「移位累加」演算法:逐字元讀取輸入緩衝區,先判斷是否為 '0'-'9' 或 'A'-'F'(不區分大小寫),合法字元將其高 4 位清零(數字直接 AND 0Fh,字母再加 9 再 AND 0Fh),再將 32 位暫存器 EDX 左移 4 位並加上新數值。遇到非法字元即刻返回,EDX 中即為解析出的 32 位線性地址。
主迴圈 dopage 每次處理 512 位元組(32 行 × 16 列)。showpage 例程將 ES:SI 指向的記憶體內容格式化為:
每行末尾附加 CR/LF 並以 write 例程透過 DOS 21h/40h 功能呼叫輸出至標準輸出。每 17 行暫停一次,提示「Any Key = Next 256 Bytes」,按 Q 退出,其它鍵繼續。
binhex:將 16 位二進制轉為 4 位十六進制 ASCII 字串,採用 DAA 與 ADC 技巧實現無分支十六進制轉換write:通用字串輸出,先掃描長度再呼叫 DOS 寫檔案控制代碼 1(標準輸出)DAA(十進制調整)輔助十六進制轉 ASCII,避免查表雖然現代作業系統已禁止使用者程式直接存取實體記憶體,但 SHOWMEM 所展示的「地址解析 → 記憶體讀取 → 格式化輸出 → 交互式分頁」流程,正是現代除錯器記憶體視窗的雛形。研讀此代碼有助於建立「位址空間、資料表示、I/O 抽象」三大核心觀念。