MMX暫存器有64位,可以同時進行8對位元組或4對字或2對雙字同時相同操作,還可以進行飽和運算,也就是運算結果有個頂點,
不會溢出,當然也可以進行普通運算.
MM表示64位MMX暫存器.
r32表示32位通用暫存器或esi,edi
m32表示32位記憶體變數
m64表示64位記憶體變數
m128表示128位記憶體變數
imm8表示8位立即數
左運算元為目的運算元,右運算元為源運算元
'|'字元表示每組數據之間的間隔分隔設定
movd MM,r32/m32
把 r32/m32 值賦給 MM 的低32位,高32位清零.
movd r32/m32,MM
把 MM 的低32位值賦給 r32/m32.
例:
當MM0 == 1234567887654321 h,eax == 0abc H時,執行movd MM0,eax,則MM0 == 0abc h
當MM0 == 1234567887654321 h,eax == 0abc h時,執行movd eax,MM0,則eax == 87654321 h
movq MM,MM/m64
把源MM/m64的值送入目的MM.
例:
當MM0 == 1234567887654321 h,MM1 == 3141592653 h時,執行movq MM0,MM1,則MM0 == 3141592653 h
movntq m64,MM
m64 <== MM ,MM內容送入m64,不經過cache.
pmovmskb r32,MM
r[0] <== MM[7]
r[1] <== MM[15]
r[2] <== MM[23]
r[3] <== MM[31]
r[4] <== MM[39]
r[5] <== MM[47]
r[6] <== MM[55]
r[7] <== MM[63]
r[31-8] <== 0
paddsb MM,MM/m64
按位元組對齊,飽和有符號數(補碼)相加(結果= -128~+127,80h~7fh),值送入目的MM.
當結果小於-128時,結果強制轉為80h,當結果大於+127時,結果強制轉為7fh.
例:
當MM0 == 00 c0 fe 7e 11 h,
MM1 == 12 a6 9c 10 02 h時,執行 paddsb MM0,MM1,
則MM0 == 12 80 9a 7f 13 h
0c0h = -64,0a6h = -90,-64 + (-90) = -154,-154 < -128,所以結果為80h
7eh=126,10h=16,126+16=142,142>127,所以結果為7fh
其餘的未飽和所以結果正常.
paddsw MM,MM/m64
按字對齊,飽和有符號數(補碼)相加(結果= -32768~+32767,8000h~7fffh),值送入目的MM.
運算與paddsb類似,當結果小於-32768時,結果強制轉為8000h,當結果大於,+32767時,結果強制轉為7fffh.
paddusb MM,MM/m64
按位元組對齊,飽和無符號數相加(結果= 0~255,0h~0ffh),值送入目的MM.
當結果大於255時,結果強制轉為0ffh.
例:
當MM0 == 23 11 h,MM1 == fc 22 h時,執行paddusb MM0,MM1,則MM0 == ff 33h
23h = 35,0fch = 253,35 + 253 = 288,288 > 255,所以結果為0ffh
paddusw MM,MM/m64
按字對齊,飽和無符號數相加(結果= 0~65535,0h~0ffffh),值送入目的MM.
運算與paddusb類似,當結果大於65535時,結果強制轉為0ffffh.
psubsb MM,MM/m64
按位元組對齊,飽和有符號數(補碼)相減(結果= -128~+127,80h~7fh),值送入目的MM.
運算與paddsb類似,當結果小於-128時,結果強制轉為80h,當結果大於,+127時,結果強制轉為7fh.
psubsw MM,MM/m64
按字對齊,飽和有符號數(補碼)相減(結果= -32768~+32767,8000h~7fffh),值送入目的MM.
運算與paddsw類似,當結果小於-32768時,結果強制轉為8000h,當結果大於,+32767時,結果強制轉為7fffh.
paddb MM,MM/m64
按位元組對齊,普通相加,與add指令類似.
例:
當MM0 = 12 34 56 78 ab cd ef feh,
MM1 = 87 69 86 54 3d ea cb 03h,執行paddb MM0,MM1,
則MM0 = 99 9d dc cc e8 b7 ba 01h
paddw MM,MM/m64
按字對齊,普通相加,與add指令類似.
paddd MM,MM/m64
按雙字對齊,普通相加.與add指令類似.
paddq MM,MM/m64
按四字對齊,普通相加.
例:
當MM0 == 0fffffffffffffffeh,MM1 == 3h,執行paddq MM0,MM1,則MM0 = 1h
psubb MM,MM/m64
按位元組對齊,普通相減,與sub指令類似.
psubw MM,MM/m64
按字對齊,普通相減,與sub指令類似.
psubd MM,MM/m64
按雙字對齊,普通相減.與add指令類似.
psubq MM,MM/m64
按四字對齊,普通相減.
例:
當MM0 == 1h,MM1 == 3 h,執行psubq MM0,MM1,則MM0 = 0fffffffffffffffeh
psllw MM,MM/m64 psllw MM,imm8
把目的暫存器按字由源存儲器(或imm8 立即數)指定位數邏輯左移,移出的位丟失.
低字移出的位不會移入高字.
例:
當MM0 = 0ffff ffff ffff ffffh,執行psllw MM0,1
則MM0 = 0fffe fffe fffe fffeh
psrlw MM,MM/m64 psrlw MM,imm8
把目的暫存器按字由源存儲器(或imm8 立即數)指定位數邏輯右移,移出的位丟失.
高字移出的位不會移入低字.
例:
當MM0 = 0ffff ffff ffff ffffh,執行psrlw MM0,1
則MM0 = 07fff 7fff 7fff 7fffh
pslld MM,MM/m64 pslld MM,MM imm8
把目的暫存器按雙字由源存儲器(或imm8 立即數)指定位數邏輯左移,移出的位丟失.
低雙字移出的位不會移入高雙字.
例:
當MM0 = 0ffffffff ffffffffh,執行pslld MM0,1
則MM0 = 0fffffffe fffffffeh
psrld MM,MM/m64 psrld MM,imm8
把目的暫存器按雙字由源存儲器(或imm8 立即數)指定位數邏輯右移,移出的位丟失.
高雙字移出的位不會移入低雙字.
例:
當MM0 = 0ffffffff ffffffffh,執行psrld MM0,1
則MM0 = 07fffffff 7fffffffh
pmullw MM,MM/m64
按字對齊,有符號(補碼)相乘,取結果低16位,放入目的暫存器的對應字.
例:
當MM0 == 2 acfeh,MM1 == 9 cef3h,執行 pmulhw,則MM0 = 0000 0000 0012 991ah
2 * 9 = 18,18 = 0000 0012h,取低16位 0012 為結果.
0acfeh == -21250,0cef3h == -12557,-21250*-12557 = 266836250 = 0fe7 991a h,取低16位 991a 為結果.
pmulhw MM,MM/m64
按字對齊,有符號(補碼)相乘,取結果高16位,放入目的暫存器的對應字.
例:
當MM0 == 2 acfeh,MM1 == 9 cef3h,執行 pmulhw,則MM0 = 0000 0000 0000 0fe7h
2 * 9 = 18,18 = 0000 0012h,取高16位 0000 為結果.
0acfeh == -21250,0cef3h == -12557,-21250*-12557 = 266836250 = 0fe7 991a h,取高16位 0fe7 為結果.
▲注:在MMX指令集中沒有除法指令.
﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
pand MM,MM/m64
64個位'與'操作,結果放入目的暫存器.
pandn MM,MM/m64
目的暫存器按位先取'非',再'與'源暫存器,結果放入目的暫存器.
por MM,MM/m64
64個位'或'操作,結果放入目的暫存器.
pxor MM,MM/m64
64個位'異或'操作,結果放入目的暫存器.
pmaddwd MM,MM/m64
按字對齊有符號(補碼)向量點乘.
高32位 | 低32位
目的暫存器: a0 | a1 | a2 | a3
源暫存器: b0 | b1 | b2 | b3
目的暫存器結果: a0*b0+a1*b1 | a2*b2+a3*b3
例:
當MM0 = 0006 8a11 1234 4321h,
MM1 = 0154 c239 ae39 2b35h,當執行pmaddwd MM0,MM1
則MM0 = 1c75a7c1 0583d669h 注意是有符號操作!
pcmpeqb MM,MM/m64
源暫存器與目的暫存器按位元組比較,相等就置目的暫存器對應位元組為0ffh,否則為00h
例:
當MM0 == 20 11h,MM1 == 21 11h,執行pcmpeqb MM0,MM1,則MM0 = ff ff ff ff ff ff 00 ff h
注:MM0與MM1的高48為0,因為0 == 0,所以置目的暫存器對應位元組為0ffh.
pcmpeqw MM,MM/64
源暫存器與目的暫存器按字比較,相等就置目的暫存器對應字為0ffffh,否則為0000h
pcmpeqd MM,MM/m64
源暫存器與目的暫存器按雙字比較,相等就置目的暫存器對應雙字為0ffffffffh,否則為00000000h
pcmpgtb MM,MM/m64
源暫存器與目的暫存器按位元組(有符號補碼)比較,
當目的暫存器對應位元組大於源暫存器就置目的暫存器對應位元組為0ffh,否則為00h
例:
當MM0 == 80 12 11 h,MM1 == 7f 12 10h,執行pcmpgtb MM0,MM1,則MM0 = 00 00 ffh
因為80h = -128,7fh = 127,-128<127,所以結果為00h
pcmpgtw MM,MM/m64
源暫存器與目的暫存器按字(有符號補碼)比較,
當目的暫存器對應字大於源暫存器就置目的暫存器對應字為0ffffh,否則為0000h
pcmpgtd MM,MM/m64
源暫存器與目的暫存器按雙字(有符號補碼)比較,
當目的暫存器對應雙字大於源暫存器就置目的暫存器對應雙字為0ffffffffh,否則為00000000h
packuswb MM,MM/m64
把目的暫存器按字有符號數壓縮為位元組無符號數放入目的暫存器低32位
把源暫存器按字有符號數壓縮為位元組無符號數放入目的暫存器高32位
壓縮時負數變為00h,大於255的正數變為0ffh.
高32位 | 低32位
目的暫存器: a0 | a1 | a2 | a3
源暫存器: b0 | b1 | b2 | b3
目的暫存器壓縮結果: b0|b1| b2|b3| a0|a1|a2|a3
例:
當MM0 == 7fff 8000 1234 00ae h,MM1 == 00ad 0123 80ff 0100 h,
執行packuswb MM0,MM1,則MM0 = ad ff 00 ff ff 00 ff ae h.
packsswb MM,MM/m64
把目的暫存器按字有符號數壓縮為位元組有符號數放入目的暫存器低32位
把源暫存器按字有符號數壓縮為位元組有符號數放入目的暫存器高32位
壓縮時小於-128負數變為80h,大於127的正數變為7fh.
高32位 | 低32位
目的暫存器: a0 | a1 | a2 | a3
源暫存器: b0 | b1 | b2 | b3
目的暫存器壓縮結果: b0|b1| b2|b3| a0|a1|a2|a3
例:
當MM0 == 0fff ff06 0080 0012 h,MM1 == 0001 8000 ffff 7fff h,
執行packsswb MM0,MM1,則MM0 = 01 80 ff 7f 7f 80 7f 12 h
packssdw MM,MM/m64
把目的暫存器按雙字有符號數壓縮為單字有符號數放入目的暫存器低32位
把源暫存器按雙字有符號數壓縮為單字有符號數放入目的暫存器高32位
壓縮時小於-32768負數變為8000h,大於32767的正數變為7fffh.
高32位 | 低32位
目的暫存器:a0 | a1
源暫存器: b0 | b1
目的暫存器壓縮結果: b0 | b1 | a0 | a1
punpcklbw MM,MM/m64
把目的暫存器與源暫存器的低32位按位元組交錯排列放入目的暫存器
高32位 | 低32位
目的暫存器: a0|a1|a2|a3|a4|a5|a6|a7
源暫存器: b0|b1|b2|b3|b4|b5|b6|b7
目的暫存器結果:b4|a4|b5|a5|b6|a6|b7|a7
例:
當MM0 == 01 02 03 04 05 06 07 08 h,MM1 == 09 0a 0b 0c 0d 0e 0f 00 h
執行punpcklbw MM0,MM1,則MM0 = 0d 05 0e 06 0f 07 00 08 h
punpcklwd MM,MM/m64
把目的暫存器與源暫存器的低32位按字交錯排列放入目的暫存器
高32位 | 低32位
目的暫存器: a0 | a1 | a2 | a3
源暫存器: b0 | b1 | b2 | b3
目的暫存器結果:b2 | a2 | b3 | a3
punpckldq MM,MM/m64
把目的暫存器與源暫存器的低32位按雙字交錯排列放入目的暫存器
高32位 | 低32位
目的暫存器:a0 | a1
源暫存器: b0 | b1
目的暫存器結果: b1 | a1
punpckhbw MM,MM/m64
把目的暫存器與源暫存器的高32位按位元組交錯排列放入目的暫存器
高32位 | 低32位
目的暫存器: a0|a1|a2|a3|a4|a5|a6|a7
源暫存器: b0|b1|b2|b3|b4|b5|b6|b7
目的暫存器結果:b0|a0|b1|a1|b2|a2|b3|a3
例:
當MM0 == 01 02 03 04 05 06 07 08 h,MM1 == 09 0a 0b 0c 0d 0e 0f 00 h
執行punpcklbw MM0,MM1,則MM0 = 09 01 0a 02 0b 03 0c 04 h
punpckhwd MM,MM/m64
把目的暫存器與源暫存器的高32位按字交錯排列放入目的暫存器
高32位 | 低32位
目的暫存器: a0 | a1 | a2 | a3
源暫存器: b0 | b1 | b2 | b3
目的暫存器結果:b0 | a0 | b1 | a1
punpckhdq MM,MM/m64
把目的暫存器與源暫存器的高32位按雙字交錯排列放入目的暫存器
高32位 | 低32位
目的暫存器:a0 | a1
源暫存器: b0 | b1
目的暫存器結果: b0 | a0
相關詞條
-
MMX
MMX 是MultiMedia eXtensions(多媒體擴展)的縮寫,是第六代CPU晶片的重要特點。MMX技術是在CPU中加入了特地為視頻信號(Vi...
簡介 特性 缺點 基本指令集 其他 -
MMX技術
MMX技術是Intel公司為增強 CPU 在音像、圖形和通信套用方面而採取的技術,MMX技術是繼Intel386(TM)處理器(將體系結構擴展至32位)...
簡介 內容 -
Pentium MMX
Pentium MMX為計算機的一款CPU。
Intel Pentium MMX 多能奔騰 -
多媒體指令
CPU依靠指令來計算和控制系統,每款CPU在設計時就規定了一系列與其硬體電路相配合的指令系統。指令的強弱也是CPU的重要指標,指令集是提高微處理器效率的...
精簡指令集的運用 CPU的擴展指令集 參考資料 -
MMX指令集
MMX(Multi Media eXtension,多媒體擴展指令集)指令集是Intel公司於1996年推出的一項多媒體指令增強技術。
MMX指令集 相關條目 -
奔騰MMX
奔騰MMX是英特爾於1996年發明的一項多媒體指令增強技術,包括57條多媒體指令,這些指令可以一次處理多個數據,MMX技術在軟體的配合下,就可以得到更好...
-
MMX指令集[MMX指令集]
MMX(Multi Media eXtension,多媒體擴展指令集)指令集是Intel公司於1996年推出的一項多媒體指令增強技術。MMX指令集中包括...
簡介 指令介紹 CPU支持 -
Intel Pentium MMX
Intel Pentium MMX的英文全稱可以譯為“多媒體擴展指令集”。
背景 頻率 -
SSE指令
SSE(Streaming SIMD Extensions,單指令多數據流擴展)指令集是Intel在Pentium III處理器中率先推出的。其實,早在...