前言
組合語言的核心優勢在於使用符號取代目標機器碼,將大量二進制指令轉為可讀、可維護的標識符。MASM 中所有變數名、標號、記錄名、指令助憶符、暫存器名統稱符號,可透過偽指令重新定義、賦予新屬性,極具彈性。本文系統整理符號分類、標號/變數的屬性與定義方式、屬性運算子用法。
符號分類
程式設計者定義的標識符,代表儲存單元、資料、運算式、名稱等,分五類:
- 暫存器符號:CPU 暫存器名稱(EAX, EBX...)
- 標號:指令位址的符號名稱
- 變數:資料區塊的符號名稱
- 數值符號:常數、運算式結果
- 名稱符號:段名、程序名、巨集名、結構名等
標號
定義
標號為一組機器指令的符號名稱,供轉移/迴圈指令控制流程使用。具有三屬性:
- 段屬性:段基址(必須在 CS 區段)
- 偏移屬性:相對段首的位元組距離(16 位無號整數)
- 類型/距離屬性:
SHORT:同段,距離 -128~+127
NEAR:同段,距離 -32768~+32767
FAR:跨段
三種定義方式
- 隱含定義(SHORT/NEAR):程式碼區中
標號: 置於指令前。
NEXT: MOV AX, BX ... LOOP NEXT
- LABEL 偽指令(NEAR/FAR):
標號 LABEL NEAR/FAR
- EQU 偽指令(NEAR/FAR):
標號 EQU THIS NEAR/FAR
標號使用場合
JMP 標號:無條件轉移,可 SHORT/NEAR/FAR
LOOP 標號:迴圈指令,僅 SHORT
Jcc 標號:條件轉移,僅 SHORT
屬性運算子
| 運算子 | 功能 | 範例 |
SEG | 取段地址 | MOV AX, SEG NEXT |
OFFSET | 取偏移量(有效位址) | MOV BX, OFFSET NEXT 等同 LEA BX, NEXT |
TYPE | 取類型值 | NEAR→FFFFh(-1), FAR→FFFEh(-2) |
變數
定義
變數代表儲存區中可修改的資料,同具段/偏移/類型三屬性。類型屬性指資料存取單位:BYTE, WORD, DWORD 等。主要區別:標號對應指令,變數對應資料。
三種定義方式
- DB/DW/DD 等資料定義偽指令
[名稱] 定義偽指令 運算式
運算式可為:常數、?(未初始化)、ASCII 字串(僅 DB)、位址運算式(非 DB)、DUP 重複值。
範例:
A DB 100
B DB 100, 23
C DB 'ABC'
D DB ?
E DB 23 DUP(0)
F DB 3 DUP(1, 2 DUP(0)) → 1,0,0,1,0,0,1,0,0
G DW 'AB','CD' → 4142h, 4344h
H DW 23 → 0017h (小端序)
- LABEL 定義變數
名稱 LABEL BYTE/WORD/DWORD 等同 名稱 DB/DW/DD ...
- EQU 定義變數
名稱 EQU THIS BYTE/WORD/DWORD
THIS 為任意類型運算子,段屬性為當前段,偏移為下一可用位址。
範例:堆疊段定義 100 字後,TOP EQU THIS WORD 即為 SP 初值。
雙重定義同一位址不同類型
AB EQU THIS BYTE
AW DW 50 DUP(0)
; 同一記憶體起始位址,AB 以 BYTE 存取,AW 以 WORD 存取
變數存取方式
- 直接定址:
MOV AH, AB / MOV AX, AW(類型需匹配)
- PTR 臨時改變類型:
MOV CX, WORD PTR AB / MOV CL, BYTE PTR AW
- 相對定址(索引/基址):
MOV AX, AB[SI] / MOV AX, AW[BX][SI](名稱代表偏移量)
屬性運算子
SEG / OFFSET:同標號
TYPE:回傳類型位元組數(BYTE→1, WORD→2, DWORD→4)
LENGTH:DUP 重複次數(陣列元素個數),無 DUP 時為 1
SIZE:配置總位元組數 = LENGTH * TYPE
注意:字串變數用 SIZE 只得 1,求字串長度用 COUNT EQU $ - STR($ 為定義後下一可用偏移)。
變數名僅對應第一個資料項
WORDARRAY DW 20 DUP(?)
MOV AX, WORDARRAY ; 第 1 元素
MOV AX, WORDARRAY+38 ; 第 20 元素 (19*2=38)
其他符號類型
| 類型 | 說明 | 範例 |
| 符號常數 | EQU 定義常值 | COUNT EQU 100 |
| 指令助憶符別名 | 重新命名指令 | MOVE EQU MOV |
| 暫存器別名 | 重新命名暫存器 | COUNTER EQU CX |
| 段名 | SEGMENT ... ENDS | DATA SEGMENT ... DATA ENDS |
| 程序名 | PROC ... ENDP | SUBR PROC NEAR ... SUBR ENDP |
| 巨集名 | MACRO ... ENDM | 呼叫時展開,實參取代形式參數 |
總結
符號系統是組合語言可讀性與抽象能力的基石。精通標號/變數的三屬性、多種定義方式、屬性運算子(SEG/OFFSET/TYPE/LENGTH/SIZE)、PTR 類型轉換、雙重定義,能讓程式設計者精確控制記憶體佈局、靈活存取資料、編寫可移植的模組化程式碼。
- 上一篇文章: Win32 組合語言系統托盤圖示與彈出式選單實作
- 下一篇文章: Win32 組合語言匿名管道實作:重導向子程式輸出到編輯控制項
Copyright ©
程式碼之家 All Rights Reserved