Digital Mars C/C++ 編譯器內建強大的內嵌組譯器,支援 16/32 位元所有記憶體模型,語法相容 Borland asm 與 Microsoft _asm/__asm。本文完整收錄官方文件章節,涵蓋 ASM 區塊語法、C/C++ 符號存取、暫存器慣例、函數呼叫、巨集定義、暫存器清單與指令集支援表,為跨平台編譯器使用者提供權威參考。
; 單行
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。const、enum 成員。/* */, //, ; (Microsoft 相容模式)。struct/pointer 宣告、C 風格型別轉換。arr[i] 自動乘元素大小;ASM 中 [base+index] 為位元組偏移,不縮放。0FFh, 1234H (若未用 -A ANSI 選項)。<<) 不可用;共用操作符 (如 *, []) 依組語語義解釋。
asm mov AX, var ; 直接引用變數
asm mov [bx]first_type.common_name, 10 ; 非唯一成員需限定型別/變數名
asm mov [bx].unique_name, 10 ; 唯一成員可匿名引用
結構標籤僅能作為成員限定詞,不可獨立使用。
int expon2(int num, int power) {
asm {
mov AX, num
mov CX, power
shl AX, CL
}
; 返回值於 AX (16-bit) / EAX (32-bit)
}
__declspec(naked) 可抑制序言/結語,配合 __LOCAL_SIZE 符號 (區域變數總位元組數) 手動管理堆疊框架。| 模型 | 易失性 (無需保存) | 非易失性 (必須保存) |
|---|---|---|
| 16-bit | AX, BX, CX, DX, SI, DI, ES, Flags (除 DF) | CS, DS, SS, SP, BP |
| 32-bit | EAX, ECX, EDX, ESI, EDI | EBX, EBP, ESP, SS, CS, DS, ES, GS |
cld)。AX;長整數→DX:AX;更大→記憶體+指標。EAX;遠指標→EDX:EAX (段:偏移)。float→EAX, double→EDX:EAX。add esp, N)。extern "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 等)。完整列表見文件原文。