²é¿´: 152  |  »Ø¸´: 0
µ±Ç°Ö÷ÌâÒѾ­´æµµ¡£

zsglly

ľ³æ (ÖøÃûдÊÖ)

[½»Á÷] MMXÖ¸ÁÔÚC++ÖеÄʹÓÃ

ÉÏ´ÎÔÚ¡¶¹ØÓÚÄÚÁª»ã±àµÄ¼¸¸ö¼¼ÇÉ¡·Ò»ÎÄÖÐÖ»ÊǼòµ¥µØ½éÉÜÁËÈçºÎÔÚC++ÖÐʹÓÃÄÚÁª»ã±à£¬ÕâÒ»´ÎÏȶÔÉÏÒ»´ÎµÄÎÄÕÂ×÷Ò»²¹³ä£¬È»ºó½éÉÜÈçºÎʹÓÃMMXÖ¸Áî¡£

Ò»¡¢ ÄÚÁª»ã±àµÄÒ»°ãÔ­Ôò£º

1¡¢ ×ÔÓÉʹÓÃͨÓüĴæÆ÷£»£¨EAX,EBX,ECXºÍEDX£©
2¡¢ ÆäËü¼Ä´æÆ÷ÀûÓöÑÕ»±£Áô£¬Ê¹Óã¬×îºó»Ö¸´£»
Ò»°ãµÄÏñÏÂÃæÕâÑù£º  

__asm{
push ebp
push esp
¡­¡­¡­.//ʹÓÃEBPºÍESP
pop esp
pop ebp
}

¶þ¡¢ ÄÚÁª»ã±à__asm¿ÉÒÔµ¥¶ÀʹÓãº
ÀýÈ磺__asm mov eax,anyval1
__asm mov ebx,anyval2

Èý¡¢ º¯Êý·µ»ØÖµ¿ÉÒÔÖ±½Ó·Åµ½eaxÖУ¬¿ÉÒÔ²»Àí»á¾¯¸æ
ÀýÈ磺 int anyfun(¡­¡­/*anyparm*/)
{
int irtn; //º¯Êý·µ»ØÖµ
¡­¡­        //º¯ÊýÓï¾ä
__asm mov eax,irtn    //´úÌæreturn irtn;µ«±àÒëÆ÷»á·¢³ö¾¯¸æ£¬¿ÉÒÔ²»ÀíËü
}

ËÄ¡¢ ÄÚÁª»ã±à²»Çø·Ö´óСд£¬Ó﷨ͬÆÕͨ»ã±à

ÀýÈ磺__asm{
mov eax,ebx
MOV EAX,EBX //ͬÉÏÒ»¾ä
}

×¢Ò⣺C++µÄ±äÁ¿»¹ÊÇÇø·Ö´óСдµÄ

Îå¡¢ ÄÚÁª»ã±à¾¡Á¿Ê¹ÓÃ__asm»ò_asm¹Ø¼ü×Ö£¬¶ø²»Óñê×¼C++µÄasm¹Ø¼ü×Ö(Õâ¸öÊÇ΢Èí˵µÄ)
ÒÔÉÏÖ»ÊÇһЩ¹ØÓÚÄÚÁª»ã±àµÄ²¹³ä£¬ÎÒ½«³öһϵÁÐÎ§ÈÆÄÚÁª»ã±àµÄÎÄÕ£¬ÏÂÃæ½Ó×ÅÉÏÒ»´ÎµÄ»°ÌâÏêϸһµãµØ½²Ò»ÏÂMMXÖ¸ÁîµÄµ÷ÓÃ

1¡¢ MMXÖ¸Á¼ò½é£º

[Êý¾Ý´«ÊäÖ¸Áî]
movq //´«Êä64λÕûÊý
movd //´«Êä32λÕûÊý

[Êý¾Ý´ò°üת»»Ö¸Áî]
PACKSSWB //Pack words into bytes with signed saturation.
PACKSSDW //Pack doublewords into words with signed saturation.
PACKUSWB //Pack words into bytes with unsigned saturation.
PUNPCKHBW //Unpack high-order bytes.
PUNPCKHWD //Unpack high-order words.
PUNPCKHDQ //Unpack high-order doublewords.
PUNPCKLBW //Unpack low-order bytes.
PUNPCKLWD //Unpack low-order words.
PUNPCKLDQ //Unpack low-order doublewords.
×¢£ºÕâÒ»×éÖ¸ÁîÎÒûÓоßÌåÓùý£¬²»ÖªµÀÊǸÉʲôµÄ£¬Çë¸ßÊִͽ̣¡Ð¡µÜÏÈлÁË£¡

[ ËãÊõÖ¸Áî]
PADDB
PADDW  
PADDD  
PADDSB
PADDSW
PADDUSB
PADDUSW  
PSUBB  
PSUBW  
PSUBD  
PSUBSB  
PSUBSW  
PSUBUSB  
PSUBUSW
PMULHW  
PMULLW  
PMADDWD  

[ ±È½ÏÖ¸Áî]
PCMPEQB Compare packed bytes for equal.
PCMPEQW Compare packed words for equal.
PCMPEQD Compare packed doublewords for equal.
PCMPGTB Compare packed signed byte integers for greater than.
PCMPGTW Compare packed signed word integers for greater than.
PCMPGTD Compare packed signed doubleword integers for greater than.
Õâ×éÖ¸ÁîÓÃÓÚ³É×é±È½ÏÊý¾Ý

[ λÂß¼­Ö¸Áî]
PAND Bitwise logical AND.
PANDN Bitwise logical AND NOT.
POR Bitwise logical OR.
PXOR Bitwise logical exclusive OR.
Õâ×éÖ¸ÁîÓëAND,XOR»ù±¾Ïàͬ£¬¶¼Êǰ´Î»½øÐÐÂß¼­ÔËËã¡£

[ ÒÆÎ»ºÍÑ­»·ÒÆÎ»Ö¸Áî]
PSLLW //Shift packed words left logical.
PSLLD //Shift packed doublewords left logical.
PSLLQ //Shift packed quadword left logical.
PSRLW //Shift packed words right logical.
PSRLD //Shift packed doublewords right logical.
PSRLQ //Shift packed quadword right logical.
PSRAW //Shift packed words right arithmetic.
PSRAD //Shift packed doublewords right arithmetic.

[ ״̬¹ÜÀíÖ¸Áî]
EMMS //Empty MMX state.
ÔÚVCÖÐÒªÇóËùÓеÄMMXÖ¸Áîµ÷ÓÃÍê±Ïºó¶¼Òªµ÷ÓÃÕâ¸öÖ¸ÁîÇå¿Õ
ÀýÈ磺__asm{
¡­..MMX Óï¾ä
EMMS //Çå¿Õ״̬
}

ÒÔÉÏÊÇËùÓеÄMMXÖ¸ÁÄã¿ÉÒÔ²âÊÔʹÓÃÆäÖеÄÖ¸ÁËûµÄ¹¤×÷Ô­Àí¾ÍÊǵ¥Ö¸Á¶àÊý¾Ý  
2¡¢ ʹÓÃMMXÖ¸ÁµÄ×¢ÒâÊÂÏî

ÓÉÓÚÔÚCPUÄÚ²¿£¬FPU¼Ä´æÆ÷ºÍMMX¼Ä´æÆ÷ÊÇͬһ×é¼Ä´æÆ÷£¬ËùÒÔÔÚͬʱÒýÓÃÉÏÃæ¼Ä´æÆ÷ʱҪעÒâÕýÈ·µÄ״̬ת»»£¬¾ßÌå×ö·¨ÒÔºóÔÚ̽ÌÖ¡£ÄãÖ»ÒªÏȼÇס²»Äܼòµ¥µÄ»ìºÏÒÔÉÏÁ½ÖÖÖ¸Á¼´¿É¡£
ÿ´Îµ÷ÓÃ֮ǰҪÏȼì²âcpuÊÇ·ñÖ§³ÖMMXÖ¸Á£¬ÒÔÃâ·¢ÉúÒì³£¡£¾ßÌå×ö·¨¿´ÏÂÁÐʾÀý£º


mov EAX, 1 ; request for feature flags
CPUID ; 0Fh, 0A2h CPUID instruction
test EDX, 00800000h ; Is IA MMX technology bit (Bit 23 of EDX)
; in feature flags set?
jnz MMX_Technology_Found

Õâ¶Î´úÂëÀ´×ÔIntelµÄ²Î¿¼ÊֲᣬËùÒÔÄã¿ÉÒÔ·ÅÐĵÄʹÓá£

3¡¢ ÏÂÃæÓÃÒ»¶ÎʾÀý´úÂëÀ´ËµÃ÷Ò»ÏÂÔõÑùÓÃMMXÖ¸Áî __int8 i8_a[2][16]; //×Ö½Ú²Ù×÷Êý£¬Á½×飬ÿ×é16¸ö
__int16 i16_a[8]; //×Ö²Ù×÷Êý
__int32 i32_a[4];
__int64 i64_a[2];

i64_a[0]=0;
i64_a[1]=0;

i32_a[0]=1000;
i32_a[1]=1000;
i32_a[2]=3;
i32_a[3]=4;

i16_a[0]=10;
i16_a[1]=20;
i16_a[2]=30;
i16_a[3]=40;
i16_a[4]=50;
i16_a[5]=60;
i16_a[6]=70;
i16_a[7]=80;

i8_a[0][0]=1;
i8_a[0][1]=1;
i8_a[0][2]=1;
i8_a[0][3]=1;
i8_a[0][4]=1;
i8_a[0][5]=1;
i8_a[0][6]=1;
i8_a[0][7]=1;
i8_a[0][8]=1;
i8_a[0][9]=1;
i8_a[0][10]=1;
i8_a[0][11]=1;
i8_a[0][12]=1;
i8_a[0][13]=1;
i8_a[0][14]=1;
i8_a[0][15]=1;

i8_a[1][0]=2;
i8_a[1][1]=2;
i8_a[1][2]=2;
i8_a[1][3]=2;
i8_a[1][4]=2;
i8_a[1][5]=2;
i8_a[1][6]=2;
i8_a[1][7]=2;
i8_a[1][8]=2;
i8_a[1][9]=2;
i8_a[1][10]=2;
i8_a[1][11]=2;
i8_a[1][12]=2;
i8_a[1][13]=2;
i8_a[1][14]=2;
i8_a[1][15]=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 //×îºóÇå³ýMMX״̬¼Ä´æÆ÷£¬ÕýÈ··µ»Ø¸øÏµÍ³
}


Äã¿ÉÒÔͨ¹ýÉèÖöϵ㣬ºÍwatchµÄ·½·¨À´¹Û²ì¼Ä´æÆ÷ÒÔ¼°±äÁ¿µÄ±ä»¯Çé¿ö£¬ÕâÀïÖ»ÊÇÒýÓÃÁËÒ»²¿·ÖµÄÖ¸ÁÄÇô×îÒýÈË×¢ÒâµÄÊǶÔi16_a¡¢i8_a¡¢ÒÔ¼°i32_aÊý×éµÄ²Ù×÷£¬ÎÒÊÇËæ±ã¶ÔËûÃǽøÐÐÁËËãÊõÔËË㣬´ó¼Ò¿ÉÒÔ¿´µ½ÎÒ¼ÓÁ½×é×Ö½ÚÊý×éÊý¾ÝʱֻÓÃÁËÁ½Ìõ¼ÓÖ¸ÁÕâÊÇÆÕͨµÄÖ¸ÁÍû³¾Äª¼°µÄ¡£Õâ¾ÍÊǵ¥Ö¸Á¶àÊý¾ÝµÄ÷ÈÁ¦¡£Í¬Ê±ÄãÒ²¿ÉÒÔ¿´µ½¶Ô64λÕûÊýµÄ²Ù×÷Ò²¼òµ¥¶àÁË¡£µ«ÊÇҪעÒâµÄÊÇ£¬MMXÖ¸ÁÀïºÃÏñûÓÐÌṩ³ý·¨²Ù×÷¡£ËùÒÔÄãÐè½èÖúËã·¨À´ÊµÏÖ¡£ÁíÍâÒª²¹³äµÄÊÇMMX¼Ä´æÆ÷ÊÇ´ÓMM0-MM7ÃüÃûµÄÒ»×é64λ¼Ä´æÆ÷¡£

[ Last edited by »ÃÓ°ÎÞºÛ on 2006-11-29 at 07:47 ]
»Ø¸´´ËÂ¥

» ²ÂÄãϲ»¶

×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
Ïà¹Ø°æ¿éÌø×ª ÎÒÒª¶©ÔÄÂ¥Ö÷ zsglly µÄÖ÷Ìâ¸üÐÂ
×î¾ßÈËÆøÈÈÌûÍÆ¼ö [²é¿´È«²¿] ×÷Õß »Ø/¿´ ×îºó·¢±í
[¿¼ÑÐ] Çóµ÷¼Á323²ÄÁÏÓ뻯¹¤ +3 1124361 2026-03-24 3/150 2026-03-24 20:24 by peike
[¿¼ÑÐ] µ÷¼Á +4 13853210211 2026-03-24 4/200 2026-03-24 19:44 by ms629
[¿¼ÑÐ] ²ÄÁÏר˶ÕÒµ÷¼Á +5 ¹þ¹þ¹þºðºðºð¹þ 2026-03-23 5/250 2026-03-24 19:07 by ÁËÁËÁËÁË¡£¡£
[¿¼ÑÐ] 292Çóµ÷¼Á +4 ¶ì¶ì¶ì¶î¶î¶î¶î¶ 2026-03-24 4/200 2026-03-24 16:41 by peike
[¿¼ÑÐ] 080500Çóµ÷¼Á +3 zzzzfan 2026-03-24 3/150 2026-03-24 16:38 by barlinike
[¿¼ÑÐ] 307Çóµ÷¼Á +5 ³¬¼¶ÒÁ°º´óÍõ 2026-03-24 5/250 2026-03-24 15:46 by ÐÇ¿ÕÐÇÔÂ
[¿¼ÑÐ] 321Çóµ÷¼Á +4 Ymlll 2026-03-24 4/200 2026-03-24 14:44 by sprinining
[¿¼ÑÐ] 279·ÖÇóµ÷¼Á Ò»Ö¾Ô¸211 +18 chaojifeixia 2026-03-19 20/1000 2026-03-24 10:34 by dolphin_ycj
[¿¼ÑÐ] 085600²ÄÁÏÓ뻯¹¤µ÷¼Á +7 A-¶ßÀ²ZÃÎ 2026-03-23 12/600 2026-03-23 23:16 by ÐÇ¿ÕÐÇÔÂ
[¿¼ÑÐ] ²ÄÁÏר˶ӢһÊý¶þ306 +8 z1z2z3879 2026-03-18 8/400 2026-03-23 20:49 by baobaoye
[¿¼ÑÐ] 336»¯¹¤µ÷¼Á +4 Íõ´ó̹1 2026-03-23 5/250 2026-03-23 18:32 by allen-yin
[¿¼ÑÐ] ¹¤¿Æ0856Çóµ÷¼Á +5 ãåÎö͡͡ 2026-03-21 5/250 2026-03-23 17:56 by º£ÉªÞ±-
[¿¼ÑÐ] 316Çóµ÷¼Á +7 ÁºÜçö© 2026-03-19 7/350 2026-03-23 16:21 by lingjue
[¿¼ÑÐ] 298Çóµ÷¼Á +8 Éϰ¶6666@ 2026-03-20 8/400 2026-03-23 11:02 by laoshidan
[¿¼ÑÐ] 308Çóµ÷¼Á +3 īīĮ 2026-03-21 3/150 2026-03-22 16:54 by i_cooler
[¿¼ÑÐ] Çóµ÷¼Á +5 Zhangbod 2026-03-21 7/350 2026-03-22 13:13 by Zhangbod
[¿¼ÑÐ] Ò»Ö¾Ô¸ÖØÇì´óѧ085700×ÊÔ´Óë»·¾³×Ü·Ö308Çóµ÷¼Á +7 īīĮ 2026-03-20 7/350 2026-03-21 16:36 by barlinike
[¿¼ÑÐ] ²ÄÁÏѧ˶297ÒѹýËÄÁù¼¶Çóµ÷¼ÁÍÆ¼ö +11 adaie 2026-03-19 11/550 2026-03-20 21:30 by laoshidan
[¿¼ÑÐ] Ò»Ö¾Ô¸ÄÏÀí¹¤085701»·¾³302Çóµ÷¼ÁԺУ +3 ¿ûè÷ÎÀ¶Ó 2026-03-20 3/150 2026-03-20 19:28 by zhukairuo
[¿¼ÑÐ] Ò»Ö¾Ô¸¸£´ó288Óлú»¯Ñ§£¬Çóµ÷¼Á +3 Сľ³æ200408204 2026-03-18 3/150 2026-03-19 13:31 by houyaoxu
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û