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

組合語言實作:簡單密碼輸入與星號遮罩版本完整教學

     編輯:組合語言

前言

在 DOS 環境下編寫組合語言程式時,密碼輸入是一項基礎且實用的技能。本文將詳細解析兩個經典範例:基本版密碼輸入與進階版星號遮罩輸入,幫助您掌握鍵盤中斷、字串比對與子程式設計的核心概念。

範例一:基本密碼輸入程式

程式架構概覽

此程式採用標準的 .MODEL SMALL 架構,分為資料段與程式碼段。資料段定義了輸入緩衝區、正確密碼('5201314')、提示訊息與錯誤訊息;程式碼段則包含主流程與三個子程式:顯示換行、顯示單一字元、顯示字串。

核心邏輯解析

  1. 初始化:設定資料段暫存器 DS,索引暫存器 SI 歸零。
  2. 提示輸入:呼叫 dispchs 顯示「ENTER YOUR PASSWORD:」。
  3. 迴圈輸入:使用 INT 21h 功能 01h(帶回顯的鍵盤輸入),逐字元讀取並存入 input 緩衝區,直到偵測到 CR (0Dh) 回車鍵。
  4. 字串終止:在輸入字串末尾附加 $ (24h) 作為 DOS 字串結束標記。
  5. 密碼比對:以 CX=8(含結束符)為計數器,逐位元組比對 input 與 cmpare,全符合則跳轉 right,否則跳 error。
  6. 結果處理:正確顯示「PASSWORD RIGHT!」,錯誤顯示「PASSWORD 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.asmmasm password.asmlink password.objpassword.exe
進階版passwd2.asmmasm passwd2.asmlink passwd2.objpasswd2.exe

學習重點總結

  • 掌握 INT 21h 功能 01h/08h/02h/09h 的差異與適用場景。
  • 理解索引暫存器 SI/DI 在字串操作中的角色。
  • 熟悉 CMP、JE/JNE、LOOP 條件跳轉邏輯。
  • 子程式模組化設計:PROC NEAR / ENDP、CALL/RET。

這兩個範例雖然簡單,卻涵蓋了 DOS 組合語言程式設計的精髓:中斷呼叫、記憶體操作、流程控制與模組化結構。建議初學者逐行輸入、觀察除錯器中的暫存器與記憶體變化,方能真正內化這些知識。

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