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

Digital Mars C/C++ 內嵌組合語言權威指南(英文版完整收錄)

     編輯:組合語言

Digital Mars C/C++ 編譯器內建強大的內嵌組譯器,支援 16/32 位元所有記憶體模型,語法相容 Borland asm 與 Microsoft _asm/__asm。本文完整收錄官方文件章節,涵蓋 ASM 區塊語法、C/C++ 符號存取、暫存器慣例、函數呼叫、巨集定義、暫存器清單與指令集支援表,為跨平台編譯器使用者提供權威參考。

核心語法:asm 語句與 ASM 區塊


; 單行
asm mov AH, 2
asm mov DL, 7
asm int 21H

; 區塊 (推薦)
asm {
    mov AH, 2
    mov DL, 7
    int 21H
}
  • asm 為語句分隔符,可同行多指令:asm mov AH,2 asm mov DL,7。
  • 區塊不影響 C/C++ 變數作用域,可巢狀。
  • 指令不可跨行;巨集展開後必須為單行。

ASM 區塊中可用的 C/C++ 元素

  • 符號:標號、變數、函數名(需在作用域內)。
  • 常數:含 const、enum 成員。
  • 巨集與前置處理器指令。
  • 註解:/* */, //, ; (Microsoft 相容模式)。
  • 型別名稱:含 struct/pointer 宣告、C 風格型別轉換。

關鍵操作符差異:括號 [] 與十六進位常數

  • C/C++ 中 arr[i] 自動乘元素大小;ASM 中 [base+index] 為位元組偏移,不縮放。
  • 支援 MASM 風格十六進位常數:0FFh, 1234H (若未用 -A ANSI 選項)。
  • C/C++ 專用操作符 (如 <<) 不可用;共用操作符 (如 *, []) 依組語語義解釋。

存取 C/C++ 資料與結構成員


asm mov AX, var                    ; 直接引用變數
asm mov [bx]first_type.common_name, 10  ; 非唯一成員需限定型別/變數名
asm mov [bx].unique_name, 10       ; 唯一成員可匿名引用

結構標籤僅能作為成員限定詞,不可獨立使用。

函數實作與 __LOCAL_SIZE


int expon2(int num, int power) {
    asm {
        mov AX, num
        mov CX, power
        shl AX, CL
    }
    ; 返回值於 AX (16-bit) / EAX (32-bit)
}
  • 編譯器自動生成函數序言/結語 (prolog/epilog)。
  • __declspec(naked) 可抑制序言/結語,配合 __LOCAL_SIZE 符號 (區域變數總位元組數) 手動管理堆疊框架。

暫存器使用慣例

模型易失性 (無需保存)非易失性 (必須保存)
16-bitAX, BX, CX, DX, SI, DI, ES, Flags (除 DF)CS, DS, SS, SP, BP
32-bitEAX, ECX, EDX, ESI, EDIEBX, EBP, ESP, SS, CS, DS, ES, GS
  • 方向旗標 (DF) 必須保持 forward (cld)。
  • 包含內嵌組語的函數,編譯器不使用暫存器變數優化。

函數返回值慣例

  • 16-bit:短整數/指標→AX;長整數→DX:AX;更大→記憶體+指標。
  • 32-bit:近指標/整數/字元→EAX;遠指標→EDX:EAX (段:偏移)。
  • C 連結:float→EAX, double→EDX:EAX。
  • C++ 連結:在堆疊建立暫存副本,返回指標。

呼叫 C/C++ 函數

  • C 函數:參數由右向左壓堆疊,呼叫後呼叫端清理 (add esp, N)。
  • C++ 全域非多載函數:同 C。
  • extern "C" 連結函數:可呼叫。
  • 不可呼叫多載函數、成員函數 (裝飾名稱/呼叫慣例不定)。

ASM 區塊定義為 C 巨集


#define findpage(page) asm \
{ \
    asm mov AH, 5 \
    asm mov AL, page \
    asm int 10h \
}
  • 巨集展開為單行,指令前必須加 asm,用 /* */ 註解避免 // 截斷。
  • 巨集可接受參數,但不可返回值。

支援暫存器完整清單

通用:AL/AH/AX/EAX, BL/BH/BX/EBX, CL/CH/CX/ECX, DL/DH/DX/EDX, BP/EBP, SP/ESP, DI/EDI, SI/ESI
段:ES, CS, SS, DS, GS, FS
控制/除錯/測試:CR0/CR2/CR3/CR4, DR0-DR3/DR6/DR7, TR3-TR7
FPU/MMX/SSE:ST(0)-ST(7), MM0-MM7, XMM0-XMM7

支援指令集完整表 (節錄)

涵蓋完整 x86 基礎指令、FPU、MMX、SSE/SSE2/SSE3、Pentium 4 (Prescott) 新增 (addsubpd, haddpd, monitor, mwait 等)、AMD 3DNow!/擴充 (pavgusb, pfadd, pmulhrw, pswapd 等)。完整列表見文件原文。

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