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

組合語言上機實戰指南:從源碼到調試的完整流程

     編輯:組合語言

開發環境準備

  • MS-DOS 6.22 / 7.0
  • 文本編輯器:EDIT.COM、Turbo C、TC.EXE等
  • 匯編器:MASM.EXE / ASM.EXE
  • 鏈接器:LINK.EXE
  • 調試器:DEBUG.EXE

標準構建流程圖

a.建立源程序(.asm)
   ↓
b.編譯目標文件(.obj/.lst/.crf) ──錯誤→ c.修改源碼 → 回b
   ↓ 成功
d.鏈接可執行文件(.exe/.com)
   ↓
e.運行測試 ──邏輯錯誤→ f.DEBUG調試 → 回a
   ↓ 正確
g.完成

各階段詳解

a. 建立源程序

DOS下輸入 EDIT 進入全屏編輯器,輸入代碼,存為 filename.asm(1-8字符主文件名)。無EDIT可用其他編輯器,最終存為.asm。

b. 編譯目標文件

MASM filename

三次回車接受默認輸出(.obj/.lst/.crf)。屏幕顯示錯誤數與行號。錯誤過多可重定向:MASM filename > err.txt 便於查看。

c. 語法錯誤修正

僅檢測語法/用法錯誤,不檢測邏輯。記錄行號,重新EDIT修改,循環至零錯誤。

常見錯誤代碼速查

代碼含義
A2105期望指令或偽指令(拼寫錯誤)
A2049寄存器非法使用
A4016保留字作符號名
A4085缺少 END 指令
Syntax error語法不匹配

d. 鏈接可執行文件

LINK filename

三次回車,生成 .EXE。若提示 no stack segment 屬COM程序正常現象。

e-f. 運行與邏輯調試

運行觀察結果,測試邊界條件。異常時啟動DEBUG:

DEBUG filename.EXE

DEBUG核心命令

命令用途示例
D顯示內存(DS段)D 100
E修改內存E DS:200 'ABC' FF 00
G運行至斷點G 001A
T單步執行T =100 5
P過程執行(跨中斷/CALL)P 執行 INT 21H 不進入內部
R查看/修改寄存器R AX
U反組合U 100 120

完整調試案例:修復 error.asm

原始錯誤代碼

1  DATA SEGMENT
2  OUT1 DB 'Hello world'
3  AX   DB 'My name is DJX'   ; AX為保留字
4  DATA ENS                   ; 拼寫錯誤
5
6  CODE SEGMENT
7  ASSUME CS:CODE;DS:DATA
8  LEA DX,OUT1
9  MOV AH,2                   ; 功能號錯誤
10 INT 21H
...
16 MOO AH,2                   ; 拼寫錯誤
...
19 LEA DX,AX                 ; 非法使用寄存器
20 MOV AH,                    ; 缺操作數
21 INT 21H
22 CODE ENDS
23                            ; 缺 END START

MASM報錯輸出

error.ASM(3): warning A4016: Reserved word used as symbol: AX
error.ASM(4): error A2105: Expected: instruction or directive
error.ASM(16): error A2105: Expected: instruction or directive
error.ASM(19): error A2049: Illegal use of register
error.ASM(23): warning A4085: End of file, no END directive

逐步修正

  1. 第3行:AX → OUT2;第19行同步修改 LEA DX,OUT2
  2. 第4行:ENS → ENDS
  3. 第16行:MOO → MOV
  4. 第20行:MOV AH,9(字符串輸出功能)
  5. 添加 START: 標號,末尾 END START
  6. 數據段字符串補 $ 結尾
  7. 啟動代碼添加 MOV AX,DATA / MOV DS,AX 修正段地址(MASM默認數據偏移100H)
  8. 退出前添加 MOV AH,4CH / INT 21H 正確返回DOS

最終正確源碼

DATA SEGMENT
OUT1 DB 'Hello world$'
OUT2 DB 'My name is DJX$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA DX, OUT1
MOV AH, 9
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H
MOV DL, 0DH
MOV AH, 2
INT 21H
LEA DX, OUT2
MOV AH, 9
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END START

重新編譯/鏈接/運行 → 完美輸出並返回DOS提示符。

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