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

組合語言偽操作全攻略:從數據定義到模組連結的實戰指南

     編輯:組合語言

前言:偽操作與指令的本質區別

組合語言源程式除機器指令外,大量使用偽操作(Pseudo-operations,舊稱偽指令)。關鍵差異在於:指令由 CPU 在執行期執行;偽操作由組譯器在組譯期處理,不產生機器碼,完成數據定義、記憶體配置、程式結構控制、符號管理等輔助功能。熟練掌握偽操作是編寫可維護、可移植組合程式的基礎。

一、數據定義與儲存區配置偽操作

通用格式

[Variable] Mnemonic Operand,...,Operand [;Comments]
  • Variable:可選符號名稱,代表首字節偏移,不加冒號。
  • Mnemonic:資料類型關鍵字。
  • Operand:常數、運算式、字串或 DUP 重複計數。

核心資料類型

偽操作定義單位佔用位元組典型用途
DBByte1位元組陣列、ASCII 字串、位元組常數
DWWord216 位整數、位移、選擇子
DDDouble Word432 位指標、線性地址、雙字整數
DQQuad Word864 整數、雙精度浮點
DTTen Bytes1080 位擴展精度浮點、壓縮 BCD

進階用法

  • 重複運算子:ARRAY DB 20 DUP (0,1,2,?) 產生 80 位元組模式。
  • 類型覆蓋:MOV AX, WORD PTR OPER1 強制視為字操作。
  • 別名標籤:BYTE_ARRAY LABEL BYTE / WORD_ARRAY DW 50 DUP(?) 同一地址雙重類型視圖。

二、符號賦值偽操作 EQU 與 =

CONST   EQU   256
DATA    EQU   HEIGHT+12
B       EQU   [BP+8]       ; 記憶體運算式
P8      EQU   DS:[BP+8]    ; 含段暫存器
EMP = 7
EMP = EMP+1        ; = 允許重複定義,EQU 不允許

EQU 為靜態常數等價,= 為組譯期可變符號,適合計數器、版本號等需遞增場景。

三、段定義與段暫存器關聯

段框架

segname SEGMENT [align_type] [combine_type] ['class']
        ...
segname ENDS
  • 對齊類型:PARA(16B)、BYTE(任意)、WORD(2B)、PAGE(256B)。
  • 組合類型:PUBLIC(連接器串接同名段)、COMMON(覆蓋同名段、取最長)、STACK(堆疊段)、MEMORY(高位址優先)、AT expr(固定段基址)。
  • 類別名:連接器按類別分組排序(如 'CODE'、'DATA')。

ASSUME 指令與段暫存器載入

ASSUME CS:CODE_SEG, DS:DATA_SEG, ES:DATA_SEG, SS:STACK_SEG
; 程式碼中仍需顯式載入:
MOV AX, DATA_SEG
MOV DS, AX
MOV ES, AX
MOV SS, AX
MOV SP, OFFSET STACK_TOP

ASSUME 僅告知組譯器預設段暫存器關聯,用於計算位移與生成段超越前綴;不會自動載入暫存器。CS 初始化由載入器完成。

四、模組命名、程式入口與結束

  • NAME module_name:指定目標模組名(連接器使用)。
  • TITLE "text":列表標題;無 NAME 時前 6 字元作模組名。
  • END [start_label]:結束組譯;主模組需指定起始標號,子模組僅 END。

五、位址對齊與位置計數器控制

  • EVEN:下一位址對齊至偶數(字存取效能)。
  • ORG expr:設定位置計數器 $ 為 expr。
    例:ORG $+8 跳過 8 位元組;JMP $+2 產生 2 位元組 NOP 延遲。

六、基數控制與字串常數

.RADIX 16 將預設基數改為 16,此後十進制必加 D,十六進制尾數為 D 者需加 H 避免歧義。字串常數用單/雙引號括起,值為 ASCII 碼序列。

七、程序定義偽操作 PROC/ENDP

MyProc PROC NEAR   ; 段內呼叫
       ...
       RET
MyProc ENDP

FarProc PROC FAR    ; 段間呼叫
        ...
        RETF
FarProc ENDP

NEAR 省略段地址,FAR 含段地址。屬性影響連接器生成的呼叫指令類型與返回指令(RET/RETF)。

結語

偽操作是組合語言的「元編程」層,掌握其語義與組譯期行為,能讓程式結構清晰、數據佈局精確、模組連結順暢。實戰中建議:善用結構化段定義、統一基數規範、利用 EQU/= 集中管理常數、配合 PROC 實現模組化,將大幅降低維護成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
基數後綴範例備註
二進制B00101100B
十進制D 或無178D預設
十六進制H0FFH首字必為 0~9
八進制O/Q1777Q