初學者提交的這段 8086 汇编代碼包含多個模塊:主程序顯示菜單、日期/時間子程序、BCD 轉 ASCII、中斷向量重定向實現時鐘駐留程序。代碼存在標號重複、指令拼寫錯誤、邏輯跳轉缺失、棧平衡問題等典型錯誤。本文不直接給出修正版,而是教你如何用 Turbo Debugger (TD) / DOSBox + DEBUG 逐步定位問題,培養獨立調試能力。
| 現象 | 可能原因 | 排查手段 |
|---|---|---|
| 編譯報錯 "Undefined symbol" | 標號拼寫不一致(如 REPEA vs REPEAT)、大小寫敏感設置 | TD 中 F3 查看符號表,對比源碼標號 |
| 運行後死循環/無輸出 | JNE START 導致主循環無退出、子程序缺 RET 或棧不平衡 | TD 設置斷點於 INT 21H/INT 10H,單步觀察 IP/SP 變化 |
| 顯示亂碼/位置錯誤 | INT 10H AH=13H 參數設置錯誤(BP/DX/CX/BX)、視頻模式未正確設置 | 查看 RBX 顏色屬性、RDX 游標位置是否符合預期 |
| 駐留程序不工作 | INT 21H AH=31H 駐留參數計算錯誤(DX=段落數)、舊中斷向量保存/恢復順序錯 | TD 載入後 G 運行,再 INT 1CH 手動觸發觀察 NEWINT1C 是否被調用 |
tasm main.asm、tlink main.obj,確保無語法錯誤。td main.exe,進入源碼級調試界面。START:CMP AL, 44HDATE/TIME 首指令NEWINT1C:AX/BX/CX/DX/SI/DI/BP/SP/IP/FLAGSDBUFFER/DBUFFER1 是否正確寫入 ASCII 碼ZF/CF/OF 決定條件跳轉走向REPEA: 標號定義後隨即用 REPEAT: 跳轉,標號不匹配導致組裝錯誤或邏輯錯誤。DATE 子程序中 MOV AX,CX 後未保護 CX,隨後 DIV BL 破壞 AX/DX,導致後續 MOV AL,DH 取值錯誤。TIME 子程序 DISPLAY1: 開頭 DIV BL 但此時 AX 內容未定義(應先 MOV AH,2CH; INT 21H 取時間)。BCDASC/BCDASC1 使用 CBW 擴展符號位,但輸入為無符號 BCD,可能導致負數誤判。GO: 中 SUB DX, OFFSET START; SHR DX, CL; ADD DX, 11H 計算駐留段落數邏輯存疑,需根據實際代碼大小驗證。建議:先跑通最小骨架(只顯示菜單、讀鍵、退出),再增量添加日期/時間/駐留功能,每加一步必在 TD 驗證。這比盯著幾百行代碼找錯誤高效得多。