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

8086 汇编程序調試指南:從語法錯誤到邏輯缺陷的全流程排查

     編輯:程式設計綜合問答

初學者提交的這段 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 是否被調用

調試實戰步驟(以 Turbo Debugger 為例)

  1. 編譯鏈接生成 .exe:tasm main.asm、tlink main.obj,確保無語法錯誤。
  2. TD 載入:td main.exe,進入源碼級調試界面。
  3. 設置關鍵斷點:
    • 主循環入口 START:
    • 鍵盤輸入後 CMP AL, 44H
    • 子程序 DATE/TIME 首指令
    • 中斷處理程序 NEWINT1C:
  4. 單步執行 (F7) 觀察:
    • 寄存器窗口:重點監控 AX/BX/CX/DX/SI/DI/BP/SP/IP/FLAGS
    • 內存窗口:查看 DBUFFER/DBUFFER1 是否正確寫入 ASCII 碼
    • 標誌寄存器:ZF/CF/OF 決定條件跳轉走向
  5. 修正後重新編譯驗證,直到所有功能點(菜單顯示、鍵盤響應、日期/時間顯示、時鐘駐留更新)均正常。

代碼中已發現的具體問題(供對照)

  • 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 計算駐留段落數邏輯存疑,需根據實際代碼大小驗證。

工具鏈推薦

  • DOSBox + MASM/TASM + TD:經典環境,適合教學代碼。
  • NASM + LD + GDB (遠程調試):現代工具鏈,支持 32/64 位保護模式。
  • 在線模擬器:Asm86 可直接在瀏覽器運行簡單 .asm,適合片段驗證。

建議:先跑通最小骨架(只顯示菜單、讀鍵、退出),再增量添加日期/時間/駐留功能,每加一步必在 TD 驗證。這比盯著幾百行代碼找錯誤高效得多。

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