大二課程設計作品:純組合語言實現的圖形化下拉選單系統(光柵選單),支援鍵盤導航(方向鍵、Alt+熱鍵、Enter)、子選單彈出、視窗繪製、畫面保存/恢復。代碼模組化,巨集庫 mnmacro.asm 封裝底層視訊操作,主程式 menu.asm 邏輯清晰,易於擴充實際功能。
; 主選單項目
mainmenu1 db 'File'
mainmenu2 db 'Edit'
mainmenu3 db 'Run'
mainmenu4 db 'Debug'
mainmenu5 db 'Help'
; 子選單項目(每主選單 3 項)
submenu11 db 'Save' ; File
submenu12 db 'Open'
submenu13 db 'Exit'
; ... Edit/Run/Debug/Help 同理
; 狀態變數
mainnum db 1 ; 當前主選單索引 (1-5)
subnum db ? ; 當前子選單索引 (2-4)
subshow db 0 ; 子選單顯示旗標
mainindex db ? ; 主選單字串長度
scrmm db 100 dup(?) ; 畫面保存緩衝
mnmacro.asm)| 巨集 | 功能 | 關鍵 BIOS/INT |
|---|---|---|
setpos top,left | 設定光標位置 | INT 10h/02h |
changemenu top,left,width,attr | 修改指定區域屬性(反白/恢復) | INT 10h/08h 讀取, 09h 寫入屬性 |
drawwindow attr,top,left,bottom,right | 捲動視窗清除/繪製背景 | INT 10h/06h |
windowtandb l,m,r,top,left,width,attr | 繪製視窗上/下邊框 | INT 10h/09h 重複字元 |
windowlandr char,top,left,width,attr | 繪製視窗左/右邊框 | INT 10h/09h |
outputchar char,attr,num | 重複輸出單字元 | INT 10h/09h |
outputstr str,num,top,left,attr | 輸出字串 | INT 10h/13h |
submenu left,m1,n1,m2,n2,m3,n3,width | 繪製完整子選單框架與項目 | 組合上述巨集 |
readscr left,memory | 讀取螢幕區域到記憶體(50字元×10行) | INT 10h/08h 讀取字元/屬性 |
writescr left,memory | 從記憶體恢復螢幕區域 | INT 10h/09h 寫入 |
showcur show | 光標顯示/隱藏 (CH=0/1) | INT 10h/01h |
input: INT 16h/00h 讀取鍵盤掃描碼,分派處理:ESC (01h) → 退出確認視窗左/右鍵 (4Bh/4Dh):主選單切換 或 子選單開啟時切換主選單下鍵 (50h):主選單時展開子選單;子選單時向下選擇項目(循環)上鍵 (48h):子選單時向上選擇項目(循環)Alt+F/E/R/D/H (21h/12h/13h/20h/23h):直接展開對應子選單Enter (1Ch):主選單時展開子選單;子選單時確認選擇(顯示選中項訊息,Exit 項則退出程式)FALT/EALT/...):保存覆蓋區域畫面、繪製子選單框架、高亮第一項、設置 subshow=1PRSUP/PRSDOWN):修改高亮項、循環切換PRSENTER):根據 mainnum/subnum 顯示對應確認訊息、Exit 項調用 EXIT 程序EXIT):繪製感謝視窗、等待按鍵、恢復文字模式、DOS 退出在 PRSENTER 中各 entersubXX 標號處填入實際功能調用(如檔案操作、編輯功能、編譯運行、除錯命令、幫助顯示),即可轉化為實用工具選單。巨集庫可直接複用於其他文字模式 TUI 程式。
tasm menu.asm
tlink menu.obj
menu.exe
此專案展示了 DOS 時代組合語言開發文字介面應用的完整工程實踐,巨集化設計極大提升了代碼可讀性與復用性。