push/pop 保護__asm 可單行使用:__asm mov eax, valeax,忽略編譯器警告__asm/_asm,避免標準 asmmovq 64 位傳輸movd 32 位傳輸PACKSSWB/DW 有符號飽和打包PACKUSWB 無符號飽和打包PUNPCKHBW/HWD/HDQ 高位解包PUNPCKLBW/LWD/LDQ 低位解包PADDB/W/D 加法、PADDSB/SW 有符號飽和加、PADDUSB/USW 無符號飽和加PSUBB/W/D 減法、飽和減變體PMULHW 高字乘積、PMULLW 低字乘積、PMADDWD 乘加PCMPEQB/W/D 等於比較PCMPGTB/W/D 有符號大於比較PAND、PANDN、POR、PXORPSLLW/D/Q 左移、PSRLW/D/Q 邏輯右移、PSRAW/D 算術右移EMMS 清空 MMX 狀態(VC 要求每次 MMX 代碼塊結束必須調用)CPUID 指令檢查 EDX 第 23 位mov eax, 1; cpuid; test edx, 0x00800000; jnz MMX_Supported
__int8 i8_a[2][16]; // 兩組字節數據
__int16 i16_a[8];
__int32 i32_a[4];
__int64 i64_a[2];
// 初始化數據...
__asm {
movq mm1, [i64_a]
movq mm2, [i64_a]
movq mm2, [i32_a+8]
psubd mm2, [i32_a] // 雙字減法
movq [i32_a], mm2
movq mm1, [i16_a]
paddsw mm1, [i16_a+8] // 字飽和加
movq [i16_a], mm1
movq mm1, [i8_a]
movq mm2, [i8_a+8]
paddb mm1, [i8_a+16] // 字節加
paddb mm2, [i8_a+24]
movq [i8_a], mm1
movq [i8_a+8], mm2
emms // 必須清理狀態
}
觀察要點:兩條 paddb 處理 16 字節(並行 8 字節×2),單指令多数據(SIMD)顯著提升吞吐。注意 MMX 無除法指令,需轉算法實現。MMX 寄存器為 MM0–MM7(64 位)。