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

組合語言符號、標號與變數符號完整解析

     編輯:組合語言

前言

組合語言的核心優勢在於使用符號取代目標機器碼,將大量二進制指令轉為可讀、可維護的標識符。MASM 中所有變數名、標號、記錄名、指令助憶符、暫存器名統稱符號,可透過偽指令重新定義、賦予新屬性,極具彈性。本文系統整理符號分類、標號/變數的屬性與定義方式、屬性運算子用法。

符號分類

程式設計者定義的標識符,代表儲存單元、資料、運算式、名稱等,分五類:

  1. 暫存器符號:CPU 暫存器名稱(EAX, EBX...)
  2. 標號:指令位址的符號名稱
  3. 變數:資料區塊的符號名稱
  4. 數值符號:常數、運算式結果
  5. 名稱符號:段名、程序名、巨集名、結構名等

標號

定義

標號為一組機器指令的符號名稱,供轉移/迴圈指令控制流程使用。具有三屬性:

  • 段屬性:段基址(必須在 CS 區段)
  • 偏移屬性:相對段首的位元組距離(16 位無號整數)
  • 類型/距離屬性:
    • SHORT:同段,距離 -128~+127
    • NEAR:同段,距離 -32768~+32767
    • FAR:跨段

三種定義方式

  1. 隱含定義(SHORT/NEAR):程式碼區中 標號: 置於指令前。
    NEXT: MOV AX, BX ... LOOP NEXT
  2. LABEL 偽指令(NEAR/FAR):標號 LABEL NEAR/FAR
  3. EQU 偽指令(NEAR/FAR):標號 EQU THIS NEAR/FAR

標號使用場合

  • JMP 標號:無條件轉移,可 SHORT/NEAR/FAR
  • LOOP 標號:迴圈指令,僅 SHORT
  • Jcc 標號:條件轉移,僅 SHORT

屬性運算子

變數

定義

變數代表儲存區中可修改的資料,同具段/偏移/類型三屬性。類型屬性指資料存取單位:BYTE, WORD, DWORD 等。主要區別:標號對應指令,變數對應資料。

三種定義方式

  1. 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 (小端序)
  2. LABEL 定義變數
    名稱 LABEL BYTE/WORD/DWORD 等同 名稱 DB/DW/DD ...
  3. 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 存取

變數存取方式

  1. 直接定址:MOV AH, AB / MOV AX, AW(類型需匹配)
  2. PTR 臨時改變類型:MOV CX, WORD PTR AB / MOV CL, BYTE PTR AW
  3. 相對定址(索引/基址):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)

其他符號類型

運算子功能範例
SEG取段地址MOV AX, SEG NEXT
OFFSET取偏移量(有效位址)MOV BX, OFFSET NEXT 等同 LEA BX, NEXT
TYPE取類型值NEAR→FFFFh(-1), FAR→FFFEh(-2)
類型說明範例
符號常數EQU 定義常值COUNT EQU 100
指令助憶符別名重新命名指令MOVE EQU MOV
暫存器別名重新命名暫存器COUNTER EQU CX
段名SEGMENT ... ENDSDATA SEGMENT ... DATA ENDS
程序名PROC ... ENDPSUBR PROC NEAR ... SUBR ENDP
巨集名MACRO ... ENDM呼叫時展開,實參取代形式參數

總結

符號系統是組合語言可讀性與抽象能力的基石。精通標號/變數的三屬性、多種定義方式、屬性運算子(SEG/OFFSET/TYPE/LENGTH/SIZE)、PTR 類型轉換、雙重定義,能讓程式設計者精確控制記憶體佈局、靈活存取資料、編寫可移植的模組化程式碼。

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