在 DOS 環境下編寫組合語言程式時,密碼輸入是一項基礎且實用的技能。本文將詳細解析兩個經典範例:基本版密碼輸入與進階版星號遮罩輸入,幫助您掌握鍵盤中斷、字串比對與子程式設計的核心概念。
此程式採用標準的 .MODEL SMALL 架構,分為資料段與程式碼段。資料段定義了輸入緩衝區、正確密碼('5201314')、提示訊息與錯誤訊息;程式碼段則包含主流程與三個子程式:顯示換行、顯示單一字元、顯示字串。
DS,索引暫存器 SI 歸零。dispchs 顯示「ENTER YOUR PASSWORD:」。INT 21h 功能 01h(帶回顯的鍵盤輸入),逐字元讀取並存入 input 緩衝區,直到偵測到 CR (0Dh) 回車鍵。$ (24h) 作為 DOS 字串結束標記。CX=8(含結束符)為計數器,逐位元組比對 input 與 cmpare,全符合則跳轉 right,否則跳 error。BEL (07h)。enter:輸出 CR (0Dh) + LF (0Ah) 實現換行。dispch:INT 21h 功能 02h 輸出單一字元(DL)。dispchs:INT 21h 功能 09h 輸出以 $ 結尾的字串(DX 為位移)。此版本最大的不同在於輸入階段:改用 INT 21h 功能 08h(無回顯輸入),讀取字元後立即輸出 * (2Ah) 達到遮罩效果,並妥善保護 AL 原始值以便存入緩衝區。
repeat_input:
mov ah, 08h ; 無回顯輸入
int 21h
mov dl, 2ah ; 準備輸出 '*'
push ax ; 保護原始輸入字元
call dispch ; 顯示 '*'
pop ax ; 恢復原始字元
cmp al, 0dh ; 是否為回車
je finished_input
mov input[si], al ; 存入緩衝區
inc si
jmp repeat_input
資料段 headmsg 使用多行 DB 定義,繪製出帶邊框的標題畫面,提升使用者體驗。
| 版本 | 原始檔 | 編譯 | 連結 | 執行 |
|---|---|---|---|---|
| 基本版 | password.asm | masm password.asm | link password.obj | password.exe |
| 進階版 | passwd2.asm | masm passwd2.asm | link passwd2.obj | passwd2.exe |
INT 21h 功能 01h/08h/02h/09h 的差異與適用場景。SI/DI 在字串操作中的角色。CMP、JE/JNE、LOOP 條件跳轉邏輯。PROC NEAR / ENDP、CALL/RET。這兩個範例雖然簡單,卻涵蓋了 DOS 組合語言程式設計的精髓:中斷呼叫、記憶體操作、流程控制與模組化結構。建議初學者逐行輸入、觀察除錯器中的暫存器與記憶體變化,方能真正內化這些知識。