Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
CÓïÑÔº¯Êýµ÷ÓÃÕ»(¶þ)
 
×÷Õߣºclover_toeic À´Ô´£º²©¿ÍÔ°  ·¢²¼ÓÚ£º2015-01-06
  4156  次浏览      28
 

5 º¯Êýµ÷ÓÃÔ¼¶¨

´´½¨Ò»¸öÕ»Ö¡µÄ×îÖØÒª²½ÖèÊÇÖ÷µ÷º¯ÊýÈçºÎÏòÕ»Öд«µÝº¯Êý²ÎÊý¡£Ö÷µ÷º¯Êý±ØÐ뾫ȷ´æ´¢ÕâЩ²ÎÊý£¬ÒԱ㱻µ÷º¯ÊýÄܹ»·ÃÎʵ½ËüÃÇ¡£º¯Êýͨ¹ýÑ¡ÔñÌØ¶¨µÄµ÷ÓÃÔ¼¶¨£¬À´±íÃ÷ÆäÏ£ÍûÒÔÌØ¶¨·½Ê½½ÓÊÕ²ÎÊý¡£´ËÍ⣬µ±±»µ÷º¯ÊýÍê³ÉÈÎÎñºó£¬µ÷ÓÃÔ¼¶¨¹æ¶¨ÏÈǰÈëÕ»µÄ²ÎÊýÓÉÖ÷µ÷º¯Êý»¹ÊDZ»µ÷º¯Êý¸ºÔðÇå³ý£¬ÒÔ±£Ö¤³ÌÐòµÄÕ»¶¥Ö¸ÕëÍêÕûÐÔ¡£

º¯Êýµ÷ÓÃÔ¼¶¨Í¨³£¹æ¶¨Èçϼ¸·½ÃæÄÚÈÝ£º

1) º¯Êý²ÎÊýµÄ´«µÝ˳ÐòºÍ·½Ê½

×î³£¼ûµÄ²ÎÊý´«µÝ·½Ê½ÊÇͨ¹ý¶ÑÕ»´«µÝ¡£Ö÷µ÷º¯Êý½«²ÎÊýѹÈëÕ»ÖУ¬±»µ÷º¯ÊýÒÔÏà¶ÔÓÚÖ¡»ùÖ¸ÕëµÄÕýÆ«ÒÆÁ¿À´·ÃÎÊÕ»ÖеIJÎÊý¡£¶ÔÓÚÓжà¸ö²ÎÊýµÄº¯Êý£¬µ÷ÓÃÔ¼¶¨Ðè¹æ¶¨Ö÷µ÷º¯Êý½«²ÎÊýѹջµÄ˳Ðò(´Ó×óÖÁÓÒ»¹ÊÇ´ÓÓÒÖÁ×ó)¡£Ä³Ð©µ÷ÓÃÔ¼¶¨ÔÊÐíʹÓüĴæÆ÷´«²ÎÒÔÌá¸ßÐÔÄÜ¡£

2) Õ»µÄά»¤·½Ê½

Ö÷µ÷º¯Êý½«²ÎÊýѹջºóµ÷Óñ»µ÷º¯ÊýÌ壬·µ»ØÊ±Ð轫±»Ñ¹Õ»µÄ²ÎÊýÈ«²¿µ¯³ö£¬ÒԱ㽫ջ»Ö¸´µ½µ÷ÓÃǰµÄ״̬¡£¸ÃÇåÕ»¹ý³Ì¿ÉÓÉÖ÷µ÷º¯Êý¸ºÔðÍê³É£¬Ò²¿ÉÓɱ»µ÷º¯Êý¸ºÔðÍê³É¡£

3) Ãû×ÖÐÞÊÎ(Name-mangling)²ßÂÔ

Óֳƺ¯ÊýÃûÐÞÊÎ(Decorated Name)¹æÔò¡£±àÒëÆ÷ÔÚÁ´½ÓÊ±ÎªÇø·Ö²»Í¬º¯Êý£¬¶Ôº¯ÊýÃû×÷²»Í¬ÐÞÊΡ£

Èôº¯ÊýÖ®¼äµÄµ÷ÓÃÔ¼¶¨²»Æ¥Å䣬¿ÉÄÜ»á²úÉú¶ÑÕ»Òì³£»òÁ´½Ó´íÎóµÈÎÊÌâ¡£Òò´Ë£¬ÎªÁ˱£Ö¤³ÌÐòÄÜÕýÈ·Ö´ÐУ¬ËùÓеĺ¯Êýµ÷ÓþùÓ¦×ñÊØÒ»Öµĵ÷ÓÃÔ¼¶¨¡£

5.1 ³£¼ûµ÷ÓÃÔ¼¶¨

ÏÂÃæ·Ö±ð½éÉܳ£¼ûµÄ¼¸ÖÖº¯Êýµ÷ÓÃÔ¼¶¨¡£

1. cdeclµ÷ÓÃÔ¼¶¨

ÓÖ³ÆCµ÷ÓÃÔ¼¶¨£¬ÊÇC/C++±àÒëÆ÷ĬÈϵĺ¯Êýµ÷ÓÃÔ¼¶¨¡£ËùÓзÇC++³ÉÔ±º¯ÊýºÍδʹÓÃstdcall»òfastcallÉùÃ÷µÄº¯Êý¶¼Ä¬ÈÏÊÇcdecl·½Ê½¡£º¯Êý²ÎÊý°´ÕÕ´ÓÓÒµ½×óµÄ˳ÐòÈëÕ»£¬º¯Êýµ÷ÓÃÕ߸ºÔðÇå³ýÕ»ÖеIJÎÊý£¬·µ»ØÖµÔÚEAXÖС£ÓÉÓÚÿ´Îº¯Êýµ÷Óö¼Òª²úÉúÇå³ý(»¹Ô­)¶ÑÕ»µÄ´úÂ룬¹ÊʹÓÃcdecl·½Ê½±àÒëµÄ³ÌÐò±ÈʹÓÃstdcall·½Ê½±àÒëµÄ³ÌÐò´ó(ºóÕß½öÐèÔÚ±»µ÷º¯ÊýÄÚ²úÉúÒ»·ÝÇåÕ»´úÂë)¡£µ«cdeclµ÷Ó÷½Ê½Ö§³Ö¿É±ä²ÎÊýº¯Êý(¼´º¯Êý´øÓпɱäÊýÄ¿µÄ²ÎÊý£¬Èçprintf)£¬ÇÒµ÷ÓÃʱ¼´Ê¹Êµ²ÎºÍÐβÎÊýÄ¿²»·ûÒ²²»»áµ¼Ö¶ÑÕ»´íÎó¡£¶ÔÓÚCº¯Êý£¬cdecl·½Ê½µÄÃû×ÖÐÞÊÎÔ¼¶¨ÊÇÔÚº¯ÊýÃûǰÌí¼ÓÒ»¸öÏ»®Ïߣ»¶ÔÓÚC++º¯Êý£¬³ý·ÇÌØ±ðʹÓÃextern "C"£¬C++º¯ÊýʹÓò»Í¬µÄÃû×ÖÐÞÊη½Ê½¡£

¡¾À©Õ¹ÔĶÁ¡¿¿É±ä²ÎÊýº¯ÊýÖ§³ÖÌõ¼þ

ÈôÒªÖ§³Ö¿É±ä²ÎÊýµÄº¯Êý£¬Ôò²ÎÊýÓ¦×ÔÓÒÏò×ó½øÕ»£¬²¢ÇÒÓÉÖ÷µ÷º¯Êý¸ºÔðÇå³ýÕ»ÖеIJÎÊý(²ÎÊý³öÕ»)¡£

Ê×ÏÈ£¬²ÎÊý°´ÕÕ´ÓÓÒÏò×óµÄ˳Ðòѹջ£¬Ôò²ÎÊýÁбí×î×ó±ß(µÚÒ»¸ö)µÄ²ÎÊý×î½Ó½üÕ»¶¥Î»Öá£ËùÓвÎÊý¾àÀëÖ¡»ùÖ¸ÕëµÄÆ«ÒÆÁ¿¶¼Êdz£Êý£¬¶ø²»±Ø¹ØÐÄÒÑÈëÕ»µÄ²ÎÊýÊýÄ¿¡£Ö»Òª²»¶¨µÄ²ÎÊýµÄÊýÄ¿Äܸù¾ÝµÚÒ»¸öÒÑÃ÷È·µÄ²ÎÊýÈ·¶¨£¬¾Í¿ÉʹÓò»¶¨²ÎÊý¡£ÀýÈçprintfº¯Êý£¬µÚÒ»¸ö²ÎÊý¼´¸ñʽ»¯×Ö·û´®¿É×÷Ϊºó¼Ì²ÎÊýָʾ·û¡£Í¨¹ýËüÃǾͿɵõ½ºóÐø²ÎÊýµÄÀàÐͺ͸öÊý£¬½ø¶øÖªµÀËùÓвÎÊýµÄ³ß´ç¡£µ±´«µÝµÄ²ÎÊý¹ý¶àʱ£¬ÒÔÖ¡»ùÖ¸ÕëΪ»ù×¼£¬»ñÈ¡Êʵ±ÊýÄ¿µÄ²ÎÊý£¬ÆäËûºöÂÔ¼´¿É¡£Èôº¯Êý²ÎÊý×Ô×óÏòÓÒ½øÕ»£¬ÔòµÚÒ»¸ö²ÎÊý¾àÀëÕ»Ö¡Ö¸ÕëµÄÆ«ÒÆÁ¿ÓëÒÑÈëÕ»µÄ²ÎÊýÊýÄ¿Óйأ¬ÐèÒª¼ÆËãËùÓвÎÊýÕ¼ÓõĿռäºó²ÅÄܾ«È·¶¨Î»¡£µ±Êµ¼Ê´«ÈëµÄ²ÎÊýÊýÄ¿Ó뺯ÊýÆÚÍû½ÓÊܵIJÎÊýÊýÄ¿²»Í¬Ê±£¬Æ«ÒÆÁ¿¼ÆËã»á³ö´í£¡

Æä´Î£¬µ÷Óú¯Êý½«²ÎÊýѹջ£¬Ö»ÓÐËü²ÅÖªµÀÕ»ÖеIJÎÊýÊýÄ¿ºÍ³ß´ç£¬Òò´Ëµ÷Óú¯Êý¿É°²È«µØÇåÕ»¡£¶ø±»µ÷º¯ÊýÓÀÔ¶Ò²²»ÄÜÊÂÏÈÖªµÀ½«Òª´«È뺯ÊýµÄ²ÎÊýÐÅÏ¢£¬ÄÑÒÔ¶ÔÕ»¶¥Ö¸Õë½øÐе÷Õû¡£

C++Ϊ¼æÈÝC£¬ÈÔȻ֧³Öº¯Êý´øÓпɱäµÄ²ÎÊý¡£µ«ÔÚC++ÖиüºÃµÄÑ¡Ôñ³£³£ÊǺ¯Êý¶à̬¡£

2. stdcallµ÷ÓÃÔ¼¶¨(΢ÈíÃüÃû)

Pascal³ÌÐòȱʡµ÷Ó÷½Ê½£¬WinAPIÒ²¶à²ÉÓøõ÷ÓÃÔ¼¶¨¡£stdcallµ÷ÓÃÔ¼¶¨Ö÷µ÷º¯Êý²ÎÊý´ÓÓÒÏò×óÈëÕ»£¬³ýÖ¸Õë»òÒýÓÃÀàÐͲÎÊýÍâËùÓвÎÊý²ÉÓô«Öµ·½Ê½´«µÝ£¬Óɱ»µ÷º¯Êý¸ºÔðÇå³ýÕ»ÖеIJÎÊý£¬·µ»ØÖµÔÚEAXÖС£stdcallµ÷ÓÃÔ¼¶¨½öÊÊÓÃÓÚ²ÎÊý¸öÊý¹Ì¶¨µÄº¯Êý£¬ÒòΪ±»µ÷º¯ÊýÇåջʱÎÞ·¨¾«È·»ñÖªÕ»ÉÏÓжàÉÙº¯Êý²ÎÊý£»¶øÇÒÈç¹ûµ÷ÓÃʱʵ²ÎºÍÐβÎÊýÄ¿²»·û»áµ¼Ö¶ÑÕ»´íÎó¡£¶ÔÓÚCº¯Êý£¬stdcallÃû³ÆÐÞÊη½Ê½ÊÇÔÚº¯ÊýÃû×ÖǰÌí¼ÓÏ»®Ïߣ¬ÔÚº¯ÊýÃû×ÖºóÌí¼Ó@ºÍº¯Êý²ÎÊýµÄ´óС£¬Èç_functionname@number¡£

3. fastcallµ÷ÓÃÔ¼¶¨

stdcallµ÷ÓÃÔ¼¶¨µÄ±äÐΣ¬Í¨³£Ê¹ÓÃECXºÍEDX¼Ä´æÆ÷´«µÝǰÁ½¸öDWORD(ËÄ×Ö½ÚË«×Ö)ÀàÐÍ»ò¸üÉÙ×ֽڵĺ¯Êý²ÎÊý£¬ÆäÓà²ÎÊý°´ÕÕ´ÓÓÒÏò×óµÄ˳ÐòÈëÕ»£¬±»µ÷º¯ÊýÔÚ·µ»ØÇ°¸ºÔðÇå³ýÕ»ÖеIJÎÊý£¬·µ»ØÖµÔÚ EAX ÖС£ÒòΪ²¢²»ÊÇËùÓеIJÎÊý¶¼ÓÐѹջ²Ù×÷£¬ËùÒÔ±ÈstdcallºÍcdecl¿ìЩ¡£±àÒëÆ÷ʹÓÃÁ½¸ö@ÐÞÊκ¯ÊýÃû×Ö£¬ºó¸úÊ®½øÖÆÊý±íʾµÄº¯Êý²ÎÊýÁбí´óС(×Ö½ÚÊý)£¬Èç@function_name@number¡£Ðè×¢Òâfastcallº¯Êýµ÷ÓÃÔ¼¶¨ÔÚ²»Í¬±àÒëÆ÷ÉÏ¿ÉÄÜÓв»Í¬µÄʵÏÖ£¬±ÈÈç16λ±àÒëÆ÷ºÍ32λ±àÒëÆ÷¡£ÁíÍ⣬ÔÚʹÓÃÄÚǶ»ã±à´úÂëʱ£¬»¹Ó¦×¢Òâ²»ÄܺͱàÒëÆ÷ʹÓõļĴæÆ÷ÓгåÍ»¡£

4. thiscallµ÷ÓÃÔ¼¶¨

C++ÀàÖеķǾ²Ì¬º¯Êý±ØÐë½ÓÊÕÒ»¸öÖ¸ÏòÖ÷µ÷¶ÔÏóµÄÀàÖ¸Õë(thisÖ¸Õë)£¬²¢¿ÉÄÜ½ÏÆµ·±µÄʹÓøÃÖ¸Õë¡£Ö÷µ÷º¯ÊýµÄ¶ÔÏóµØÖ·±ØÐëÓɵ÷ÓÃÕßÌṩ£¬²¢ÔÚµ÷ÓöÔÏó·Ç¾²Ì¬³ÉÔ±º¯Êýʱ½«¶ÔÏóÖ¸ÕëÒÔ²ÎÊýÐÎʽ´«µÝ¸ø±»µ÷º¯Êý¡£±àÒëÆ÷ĬÈÏʹÓÃthiscallµ÷ÓÃÔ¼¶¨ÒÔ¸ßЧ´«µÝºÍ´æ´¢C++ÀàµÄ·Ç¾²Ì¬³ÉÔ±º¯ÊýµÄthisÖ¸Õë²ÎÊý¡£

thiscallµ÷ÓÃÔ¼¶¨º¯Êý²ÎÊý°´ÕÕ´ÓÓÒÏò×óµÄ˳ÐòÈëÕ»¡£Èô²ÎÊýÊýÄ¿¹Ì¶¨£¬ÔòÀàʵÀýµÄthisÖ¸Õëͨ¹ýECX¼Ä´æÆ÷´«µÝ¸ø±»µ÷º¯Êý£¬±»µ÷º¯Êý×ÔÉíÇåÀí¶ÑÕ»£»Èô²ÎÊýÊýÄ¿²»¶¨£¬ÔòthisÖ¸ÕëÔÚËùÓвÎÊýÈëÕ»ºóÔÙÈëÕ»£¬Ö÷µ÷º¯ÊýÇåÀí¶ÑÕ»¡£thiscall²»ÊÇC++¹Ø¼ü×Ö£¬¹Ê²»ÄÜʹÓÃthiscallÉùÃ÷º¯Êý£¬ËüÖ»ÄÜÓɱàÒëÆ÷ʹÓá£

×¢Ò⣬¸Ãµ÷ÓÃÔ¼¶¨ÌصãËæ±àÒëÆ÷²»Í¬¶ø²»Í¬£¬g++ÖÐthiscallÓëcdecl»ù±¾Ïàͬ£¬Ö»ÊÇÒþʽµØ½«thisÖ¸Õëµ±×÷·Ç¾²Ì¬³ÉÔ±º¯ÊýµÄµÚ1¸ö²ÎÊý£¬Ö÷µ÷º¯ÊýÔÚµ÷Ó÷µ»Øºó¸ºÔðÇåÀíÕ»ÉϲÎÊý£»¶øÔÚVCÖУ¬thisÖ¸Õë´æ·ÅÔÚ%ecx¼Ä´æÆ÷ÖУ¬²ÎÊý´ÓÓÒÖÁ×óѹջ£¬·Ç¾²Ì¬³ÉÔ±º¯Êý¸ºÔðÇåÀíÕ»ÉϲÎÊý¡£

5. naked callµ÷ÓÃÔ¼¶¨

¶ÔÓÚʹÓÃnaked call·½Ê½ÉùÃ÷µÄº¯Êý£¬±àÒëÆ÷²»²úÉú±£´æ(prologue)ºÍ»Ö¸´(epilogue)¼Ä´æÆ÷µÄ´úÂ룬ÇÒ²»ÄÜÓÃreturn·µ»Ø·µ»ØÖµ(Ö»ÄÜÓÃÄÚǶ»ã±à·µ»Ø½á¹û)£¬¹Ê³Ænaked call¡£¸Ãµ÷ÓÃÔ¼¶¨ÓÃÓÚÒ»Ð©ÌØÊⳡºÏ£¬ÈçÉùÃ÷´¦ÓÚ·ÇC/C++ÉÏÏÂÎÄÖеĺ¯Êý£¬²¢ÓɳÌÐòÔ±×ÔÐбàд³õʼ»¯ºÍÇåÕ»µÄÄÚǶ»ã±àÖ¸Áî¡£×¢Ò⣬naked call²¢·ÇÀàÐÍÐÞÊηû£¬¹Ê¸Ãµ÷ÓÃÔ¼¶¨±ØÐëÓë__declspecͬʱʹÓã¬ÈçVC϶¨ÒåÇóºÍº¯Êý£º

´úÂëʾÀýÈçÏÂ(Windows²ÉÓÃIntel»ã±àÓï·¨£¬×¢ÊÍ·ûΪ;)£º

 __declspec(naked) int __stdcall function(int a, int b) {
2 ;mov DestRegister, SrcImmediate(Intel) vs. movl $SrcImmediate, %DestRegister(AT&T)
3 __asm mov eax, a
4 __asm add eax, b
5 __asm ret 8
6 }

×¢Ò⣬__declspecÊÇ΢Èí¹Ø¼ü×Ö£¬ÆäËûϵͳÉÏ¿ÉÄÜûÓС£

6. pascalµ÷ÓÃÔ¼¶¨

PascalÓïÑÔµ÷ÓÃÔ¼¶¨£¬²ÎÊý°´ÕÕ´Ó×óÖÁÓÒµÄ˳ÐòÈëÕ»¡£PascalÓïÑÔÖ»Ö§³Ö¹Ì¶¨²ÎÊýµÄº¯Êý£¬²ÎÊýµÄÀàÐͺÍÊýÁ¿ÍêÈ«¿ÉÖª£¬¹ÊÓɱ»µ÷º¯Êý×ÔÉíÇåÀí¶ÑÕ»¡£pascalµ÷ÓÃÔ¼¶¨Êä³öµÄº¯ÊýÃû³ÆÎÞÈκÎÐÞÊÎÇÒÈ«²¿´óд¡£

Win3.X(16λ)ʱ֧³ÖÕæÕýµÄpascalµ÷ÓÃÔ¼¶¨£»¶øWin9.X(32λ)ÒÔºópascalÔ¼¶¨ÓÉstdcallÔ¼¶¨´úÌæ(ÒÔCÔ¼¶¨Ñ¹Õ»ÒÔPascalÔ¼¶¨ÇåÕ»)¡£

ÉÏÊöµ÷ÓÃÔ¼¶¨µÄÖ÷ÒªÌØµãÈçϱíËùʾ£º

WindowsÏ¿ÉÖ±½ÓÔÚº¯ÊýÉùÃ÷ǰÌí¼Ó¹Ø¼ü×Ö__stdcall¡¢__cdecl»ò__fastcallµÈ±êʶȷ¶¨º¯ÊýµÄµ÷Ó÷½Ê½£¬Èçint __stdcall func()¡£LinuxÏ¿ɽèÓú¯Êýattribute »úÖÆ£¬Èçint __attribute__((__stdcall__)) func()¡£

´úÂëʾÀýÈçÏ£º

int __attribute__((__cdecl__)) CalleeFunc(int i, int j, int k){
// int __attribute__((__stdcall__)) CalleeFunc(int i, int j, int k){
//int __attribute__((__fastcall__)) CalleeFunc(int i, int j, int k){
return i+j+k;
}
void CallerFunc(void){
CalleeFunc(0x11, 0x22, 0x33);
}
int main(void){
CallerFunc();
return 0;
}

±»µ÷º¯ÊýCalleeFunc·Ö±ðÉùÃ÷Ϊcdecl¡¢stdcallºÍfastcallÔ¼¶¨Ê±£¬Æä»ã±à´úÂë±È½ÏÈçϱíËùʾ£º

5.2 µ÷ÓÃÔ¼¶¨Ó°Ïì

µ±º¯Êýµ¼³ö±»ÆäËû³ÌÐòÔ±ËùʹÓÃ(Èç¿âº¯Êý)ʱ£¬¸Ãº¯ÊýÓ¦×ñÑ­Ö÷ÒªµÄµ÷ÓÃÔ¼¶¨£¬ÒÔ±ãÓÚ³ÌÐòԱʹÓá£Èôº¯Êý½ö¹©ÄÚ²¿Ê¹Óã¬ÔòÆäµ÷ÓÃÔ¼¶¨¿ÉÖ»±»Ê¹Óøú¯ÊýµÄ³ÌÐòËùÁ˽⡣

ÔÚ¶àÓïÑÔ»ìºÏ±à³Ì(°üÀ¨AÓïÑÔÖÐʹÓÃBÓïÑÔ¿ª·¢µÄµÚÈý·½¿â)ʱ£¬Èôº¯ÊýµÄÔ­ÐÍÉùÃ÷ºÍº¯ÊýÌ嶨Òå²»Ò»Ö»òµ÷Óú¯ÊýʱÉùÃ÷Á˲»Í¬µÄº¯ÊýÔ¼¶¨£¬½«¿ÉÄܵ¼ÖÂÑÏÖØÎÊÌâ(Èç¶ÑÕ»±»ÆÆ»µ)¡£

ÒÔDelphiµ÷ÓÃCº¯ÊýΪÀý¡£Delphiº¯Êýȱʡ²ÉÓÃstdcallµ÷ÓÃÔ¼¶¨£¬¶øCº¯Êýȱʡ²ÉÓÃcdeclµ÷ÓÃÔ¼¶¨¡£Ò»°ã½«Cº¯ÊýÉùÃ÷ΪstdcallÔ¼¶¨£¬È磺int __stdcall add(int a, int b);

ÔÚDelphiÖе÷Óøú¯ÊýʱҲӦÉùÃ÷ΪstdcallÔ¼¶¨£º

 function add(a: Integer; b: Integer): Integer; stdcall; 
//²ÎÊýÀàÐÍÓ¦ÓëDLLÖеĺ¯Êý»ò¹ý³Ì²ÎÊýÀàÐÍÒ»Ö£¬ÇÒÒýÓÃʱʹÓÃstdcall²ÎÊý
2 external 'a.dll'; //Ö¸¶¨±»µ÷DLLÎļþµÄ·¾¶ºÍÃû³Æ

²»Í¬±àÒëÆ÷²úÉúÕ»Ö¡µÄ·½Ê½²»¾¡Ïàͬ£¬Ö÷µ÷º¯Êý²»Ò»¶¨ÄÜÕý³£Íê³ÉÇåÕ»¹¤×÷£»¶ø±»µ÷º¯Êý±ØÈ»ÄÜ×Ô¼ºÍê³ÉÕý³£ÇåÕ»£¬Òò´Ë£¬ÔÚ¿ç(¿ª·¢)ƽ̨µ÷ÓÃÖУ¬Í¨³£Ê¹ÓÃstdcallµ÷ÓÃÔ¼¶¨(²»ÉÙWinApi¾ù²ÉÓøÃÔ¼¶¨)¡£

´ËÍ⣬Ö÷µ÷º¯ÊýºÍ±»µ÷º¯ÊýËùÔÚÄ£¿é²ÉÓÃÏàͬµÄµ÷ÓÃÔ¼¶¨£¬µ«·Ö±ðʹÓÃC++ºÍCÓï·¨±àÒëʱ£¬»á³öÏÖÁ´½Ó´íÎó(±¨¸æ±»µ÷º¯Êý䶨Òå)¡£ÕâÊÇÒòΪÁ½ÖÖÓïÑԵĺ¯ÊýÃû×ÖÐÞÊιæÔò²»Í¬£¬½â¾ö·½Ê½ÊÇʹÓÃextern "C"¸æÖªÖ÷µ÷º¯ÊýËùÔÚÄ£¿é£º±»µ÷º¯ÊýÊÇCÓïÑÔ±àÒëµÄ¡£²ÉÓÃCÓïÑÔ±àÒëµÄ¿âÓ¦¿¼Âǵ½Ê¹ÓøÿâµÄ³ÌÐò¿ÉÄÜÊÇC++³ÌÐò(ʹÓÃC++±àÒëÆ÷)£¬Í¨³£Ó¦ÕâÑùÉùÃ÷Í·Îļþ£º

#ifdef _cplusplus
extern "C" {
#endif
type Func(type para);
#ifdef _cplusplus
}
#endif

ÕâÑùC++±àÒëÆ÷¾Í»á°´ÕÕCÓïÑÔÐÞÊβßÂÔÁ´½ÓFuncº¯ÊýÃû£¬¶ø²»»á³öÏÖÕÒ²»µ½º¯ÊýµÄÁ´½Ó´íÎó¡£

5.3 x86º¯Êý²ÎÊý´«µÝ·½·¨

x86´¦ÀíÆ÷ABI¹æ·¶Öй涨£¬ËùÓд«µÝ¸ø±»µ÷º¯ÊýµÄ²ÎÊý¶¼Í¨¹ý¶ÑÕ»À´Íê³É£¬Æäѹջ˳ÐòÊÇÒÔº¯Êý²ÎÊý´ÓÓÒµ½×óµÄ˳Ðò¡£µ±Ïò±»µ÷º¯Êý´«µÝ²ÎÊýʱ£¬ËùÓвÎÊý×îºóÐγÉÒ»¸öÊý×é¡£ÓÉÓÚ²ÉÓôÓÓÒµ½×óµÄѹջ˳Ðò£¬Êý×éÖвÎÊýµÄ˳Ðò(ϱê0~N-1)Ó뺯Êý²ÎÊýÉùÃ÷˳Ðò(Para1~N)Ò»Ö¡£Òò´Ë£¬ÔÚº¯ÊýÖÐÈôÖªµÀµÚÒ»¸ö²ÎÊýµØÖ·ºÍ¸÷²ÎÊýÕ¼ÓÃ×Ö½ÚÊý£¬¾Í¿Éͨ¹ý·ÃÎÊÊý×éµÄ·½Ê½È¥·ÃÎÊÿ¸ö²ÎÊý¡£

5.3.1 ÕûÐͺÍÖ¸Õë²ÎÊýµÄ´«µÝ

ÕûÐͲÎÊýÓëÖ¸Õë²ÎÊýµÄ´«µÝ·½Ê½Ïàͬ£¬ÒòΪÔÚ32λx86´¦ÀíÆ÷ÉÏÕûÐÍÓëÖ¸Õë´óСÏàͬ(¾ùΪËÄ×Ö½Ú)¡£ÏÂ±í¸ø³öÕâÁ½ÖÖÀàÐ͵IJÎÊýÔÚÕ»Ö¡ÖеÄλÖùØÏµ¡£×¢Ò⣬¸Ã±í»ùÓÚtailº¯ÊýµÄÕ»Ö¡¡£

5.3.2 ¸¡µã²ÎÊýµÄ´«µÝ

¸¡µã²ÎÊýµÄ´«µÝÓëÕûÐÍÀàËÆ£¬Çø±ðÔÚÓÚ²ÎÊý´óС¡£x86´¦ÀíÆ÷Öи¡µãÀàÐÍÕ¼8¸ö×Ö½Ú£¬Òò´ËÔÚÕ»ÖÐÒ²ÐèÒªÕ¼ÓÃ8¸ö×Ö½Ú¡£ÏÂ±í¸ø³ö¸¡µã²ÎÊýÔÚÕ»Ö¡ÖеÄλÖùØÏµ¡£Í¼ÖУ¬µ÷ÓÃtailº¯ÊýµÄµÚÒ»¸öºÍµÚÈý¸ö²ÎÊý¾ùΪ¸¡µãÀàÐÍ£¬Òò´ËÐè¸÷Õ¼ÓÃ8¸ö×Ö½Ú£¬Èý¸ö²ÎÊý¹²Õ¼ÓÃ20¸ö×Ö½Ú¡£±íÖÐwordÀàÐ͵ĴóСÊÇ4×Ö½Ú¡£

5.3.3 ½á¹¹ÌåºÍÁªºÏÌå²ÎÊýµÄ´«µÝ

½á¹¹ÌåºÍÁªºÏÌå²ÎÊýµÄ´«µÝÓëÕûÐÍ¡¢¸¡µã²ÎÊýÀàËÆ£¬Ö»ÊÇÆäÕ¼ÓÃ×Ö½Ú´óСÊÓÊý¾Ý½á¹¹µÄ¶¨Ò岻ͬ¶øÒì¡£x86´¦ÀíÆ÷ÉÏÕ»¿íÊÇ4×Ö½Ú£¬¹Ê½á¹¹ÌåÔÚÕ»ÉÏËùÕ¼ÓõÄ×Ö½ÚÊýΪ4µÄ±¶Êý¡£±àÒëÆ÷»á¶Ô½á¹¹Ìå½øÐÐÊʵ±µÄÌî³äÒÔʹµÃ½á¹¹Ìå´óСÂú×ã4×Ö½Ú¶ÔÆëµÄÒªÇó¡£

¶ÔÓÚһЩRISC´¦ÀíÆ÷(ÈçPowerPC)£¬Æä²ÎÊý´«µÝ²¢²»ÊÇÈ«²¿Í¨¹ýÕ»À´ÊµÏÖ¡£PowerPC´¦ÀíÆ÷¼Ä´æÆ÷ÖУ¬R3¡«R10¹²8¸ö¼Ä´æÆ÷ÓÃÓÚ´«µÝÕûÐÍ»òÖ¸Õë²ÎÊý£¬F1¡«F8¹²8¸ö¼Ä´æÆ÷ÓÃÓÚ´«µÝ¸¡µã²ÎÊý¡£µ±ËùÐè´«µÝµÄ²ÎÊýÉÙÓÚ8¸öʱ£¬²»ÐèÒªÓõ½Õ»¡£½á¹¹ÌåºÍlong double²ÎÊýµÄ´«µÝͨ¹ýÖ¸ÕëÀ´Íê³É£¬ÕâÓëx86´¦ÀíÆ÷ÍêÈ«²»Í¬¡£PowerPCµÄABI¹æ·¶Öй涨£¬½á¹¹ÌåµÄ´«µÝ²ÉÓÃÖ¸Õ뷽ʽ£¬¶ø²»ÊÇÏñx86´¦ÀíÆ÷ÄÇÑù½«½á¹¹´ÓÒ»¸öº¯ÊýÕ»Ö¡Öп½±´µ½ÁíÒ»¸öº¯ÊýÕ»Ö¡ÖУ¬ÏÔÈ»x86´¦ÀíÆ÷µÄ·½Ê½¸üµÍЧ¡£¿É¼û£¬PowerPC³ÌÐòÖУ¬º¯Êý²ÎÊý²ÉÓÃÖ¸Ïò½á¹¹ÌåµÄÖ¸Õë(¶ø·Ç½á¹¹Ìå)²¢²»ÄÜÌá¸ßЧÂÊ£¬²»¹ýͨ³£ÕâÊÇÁ¼ºÃµÄ±à³Ìϰ¹ß¡£

5.4 x86º¯Êý·µ»ØÖµ´«µÝ·½·¨

º¯Êý·µ»ØÖµ¿Éͨ¹ý¼Ä´æÆ÷´«µÝ¡£µ±±»µ÷Óú¯ÊýÐèÒª·µ»Ø½á¹û¸øµ÷Óú¯Êýʱ£º

1) Èô·µ»ØÖµ²»³¬¹ý4×Ö½Ú(Èçint¡¢short¡¢char¡¢Ö¸ÕëµÈÀàÐÍ)£¬Í¨³£½«Æä±£´æÔÚEAX¼Ä´æÆ÷ÖУ¬µ÷Ó÷½Í¨¹ý¶ÁÈ¡EAX»ñÈ¡·µ»ØÖµ¡£

2) Èô·µ»ØÖµ´óÓÚ4×Ö½Ú¶øÐ¡ÓÚ8×Ö½Ú(Èçlong long»ò_int64ÀàÐÍ)£¬Ôòͨ¹ýEAX+EDX¼Ä´æÆ÷ÁªºÏ·µ»Ø£¬ÆäÖÐEDX±£´æ·µ»ØÖµ¸ß4×Ö½Ú£¬EAX±£´æ·µ»ØÖµµÍ4×Ö½Ú¡£

3) Èô·µ»ØÖµÎª¸¡µãÀàÐÍ(ÈçfloatºÍdouble)£¬Ôòͨ¹ýרÓõÄЭ´¦ÀíÆ÷¸¡µãÊý¼Ä´æÆ÷Õ»µÄÕ»¶¥·µ»Ø¡£

4) Èô·µ»ØÖµÎª½á¹¹Ìå»òÁªºÏÌ壬ÔòÖ÷µ÷º¯ÊýÏò±»µ÷º¯Êý´«µÝÒ»¸ö¶îÍâ²ÎÊý£¬¸Ã²ÎÊýÖ¸Ïò½«Òª±£´æ·µ»ØÖµµÄµØÖ·¡£¼´º¯Êýµ÷ÓÃfoo(p1, p2)±»×ª»¯Îªfoo(&p0, p1, p2)£¬ÒÔÒýÓÃÐͲÎÊýÐÎʽ´«»Ø·µ»ØÖµ¡£¾ßÌå²½Öè¿ÉÄÜΪ£ºa.Ö÷µ÷º¯Êý½«ÏÔʽµÄʵ²ÎÄæÐòÈëÕ»£»b.½«½ÓÊÕ·µ»ØÖµµÄ½á¹¹Ìå±äÁ¿µØÖ·×÷ΪÒþ²Ø²ÎÊýÈëÕ»(Èô䶨Òå¸Ã½ÓÊÕ±äÁ¿£¬ÔòÔÚÕ»É϶îÍ⿪±Ù¿Õ¼ä×÷Ϊ½ÓÊÕ·µ»ØÖµµÄÁÙʱ±äÁ¿)£»c. ±»µ÷º¯Êý½«´ý·µ»ØÊý¾Ý¿½±´µ½Òþ²Ø²ÎÊýËùÖ¸ÏòµÄÄÚ´æµØÖ·£¬²¢½«¸ÃµØÖ·´æÈë%eax¼Ä´æÆ÷¡£Òò´Ë£¬ÔÚ±»µ÷º¯ÊýÖÐÍê³É·µ»ØÖµµÄ¸³Öµ¹¤×÷¡£

×¢Ò⣬º¯ÊýÈçºÎ´«µÝ½á¹¹Ìå»òÁªºÏÌå·µ»ØÖµÒÀÀµÓÚ¾ßÌåʵÏÖ¡£²»Í¬±àÒëÆ÷¡¢Æ½Ì¨¡¢µ÷ÓÃÔ¼¶¨ÉõÖÁ±àÒë²ÎÊýÏ¿ÉÄܲÉÓò»Í¬µÄʵÏÖ·½·¨¡£ÈçVC6±àÒëÆ÷¶ÔÓÚ²»³¬¹ý8×Ö½ÚµÄС½á¹¹Ì壬»áͨ¹ýEAX+EDX¼Ä´æÆ÷·µ»Ø¡£¶ø¶ÔÓÚ³¬¹ý8×ֽڵĴó½á¹¹Ì壬Ö÷µ÷º¯ÊýÔÚÕ»ÉÏ·ÖÅäÓÃÓÚ½ÓÊÕ·µ»ØÖµµÄÁÙʱ½á¹¹Ì壬²¢½«µØÖ·Í¨¹ýÕ»´«µÝ¸ø±»µ÷º¯Êý£»±»µ÷º¯Êý¸ù¾Ý·µ»ØÖµµØÖ·ÉèÖ÷µ»ØÖµ(¿½±´²Ù×÷)£»µ÷Ó÷µ»ØºóÖ÷µ÷º¯Êý¸ù¾ÝÐèÒª£¬ÔÙ½«·µ»ØÖµ¸³Öµ¸øÐèÒªµÄÁÙʱ±äÁ¿(¶þ´Î¿½±´)¡£Êµ¼ÊʹÓÃÖÐΪÌá¸ßЧÂÊ£¬Í¨³£½«½á¹¹ÌåÖ¸Õë×÷Ϊʵ²Î´«µÝ¸ø±»µ÷º¯ÊýÒÔ½ÓÊÕ·µ»ØÖµ¡£

5) ²»Òª·µ»ØÖ¸ÏòÕ»ÄÚ´æµÄÖ¸Õ룬Èç·µ»Ø±»µ÷º¯ÊýÄÚ¾Ö²¿±äÁ¿µØÖ·(°üÀ¨¾Ö²¿Êý×éÃû)¡£ÒòΪº¯Êý·µ»Øºó£¬ÆäÕ»Ö¡¿Õ¼ä±»¡°ÊÍ·Å¡±£¬Ô­Õ»Ö¡ÄÚ·ÖÅäµÄ¾Ö²¿±äÁ¿¿Õ¼äµÄÄÚÈÝÊDz»Îȶ¨ºÍ²»±»±£Ö¤µÄ¡£

º¯Êý·µ»ØÖµÍ¨¹ý¼Ä´æÆ÷´«µÝ£¬ÎÞÐè¿Õ¼ä·ÖÅäµÈ²Ù×÷£¬¹Ê·µ»ØÖµµÄ´ú¼ÛºÜµÍ¡£»ùÓÚ´ËÔ­Òò£¬C89¹æ·¶ÖÐÔ¼¶¨£¬²»Ð´Ã÷·µ»ØÖµÀàÐ͵ĺ¯Êý£¬·µ»ØÖµÀàÐÍĬÈÏΪint¡£µ«Õâ»á´øÀ´ÀàÐͰ²È«Òþ»¼£¬È纯Êý¶¨Òåʱ·µ»ØÖµÎª¸¡µãÊý£¬¶øº¯ÊýδÉùÃ÷»òÉùÃ÷ʱδָÃ÷·µ»ØÖµÀàÐÍ£¬Ôòµ÷ÓÃʱĬÈϴӼĴæÆ÷EAX(¶ø²»ÊǸ¡µãÊý¼Ä´æÆ÷)ÖлñÈ¡·µ»ØÖµ£¬µ¼Ö´íÎó£¡Òò´ËÔÚC++ÖУ¬²»Ð´Ã÷·µ»ØÖµÀàÐ͵ĺ¯Êý·µ»ØÖµÀàÐÍΪvoid£¬±íʾ²»·µ»ØÖµ¡£

¡¾À©Õ¹ÔĶÁ¡¿GCC·µ»Ø½á¹¹ÌåºÍÁªºÏÌå

ͨ³£GCC±»ÅäÖÃΪʹÓÃÓëÄ¿±êϵͳһÖµĺ¯Êýµ÷ÓÃÔ¼¶¨¡£Õâͨ¹ý»úÆ÷ÃèÊöºêÀ´ÊµÏÖ¡£µ«ÊÇ£¬ÔÚһЩĿ±ê»úÉϲÉÓò»Í¬·½Ê½·µ»Ø½á¹¹ÌåºÍÁªºÏÌåµÄÖµ¡£Òò´Ë£¬Ê¹ÓÃPCC±àÒëµÄ·µ»ØÕâЩÀàÐ͵ĺ¯Êý²»Äܱ»Ê¹ÓÃGCC±àÒëµÄ´úÂëµ÷Ó㬷´Ö®ÒàÈ»¡£µ«ÕⲢδÔì³ÉÂé·³£¬ÒòΪºÜÉÙÓÐUnix¿âº¯Êý·µ»Ø½á¹¹Ìå»òÁªºÏÌå¡£

GCC´úÂëʹÓôæ·Åint»òdoubleÀàÐÍ·µ»ØÖµµÄ¼Ä´æÆ÷À´·µ»Ø1¡¢2¡¢4»ò8¸ö×ֽڵĽṹÌåºÍÁªºÏÌå(GCCͨ³£»¹½«´ËÀà±äÁ¿·ÖÅäÔڼĴæÆ÷ÖÐ)¡£ÆäËü´óСµÄ½á¹¹ÌåºÍÁªºÏÌåÔÚ·µ»ØÊ±£¬½«Æä´æ·ÅÔÚÒ»¸öÓɵ÷ÓÃÕß´«µÝµÄµØÖ·ÖÐ(ͨ³£ÔڼĴæÆ÷ÖÐ)¡£

Ïà±È֮ϣ¬PCCÔÚ´ó¶àÄ¿±ê»úÉÏ·µ»ØÈκδóСµÄ½á¹¹ÌåºÍÁªºÏÌåʱ£¬¶¼½«Êý¾Ý¸´ÖƵ½Ò»¸ö¾²Ì¬´æ´¢ÇøÓò£¬ÔÙ½«¸ÃµØÖ·µ±×÷Ö¸ÕëÖµ·µ»Ø¡£µ÷ÓÃÕß±ØÐ뽫Êý¾Ý´ÓÄǸöÄÚ´æÇøÓò¸´ÖƵ½ÐèÒªµÄµØ·½¡£Õâ±ÈGCCʹÓõķ½·¨ÒªÂý£¬¶øÇÒ²»¿ÉÖØÈë¡£

ÔÚһЩĿ±ê»úÉÏ(ÈçRISC»úÆ÷ºÍ80386)£¬±ê×¼µÄϵͳԼ¶¨Êǽ«·µ»ØÖµµÄµØÖ·´«¸ø×Ó³ÌÐò¡£ÔÚÕâЩ»úÆ÷ÉÏ£¬µ±Ê¹ÓÃÕâÖÖÔ¼¶¨·½·¨Ê±£¬GCC±»ÅäÖÃΪÓë±ê×¼±àÒëÆ÷¼æÈÝ¡£Õâ¿ÉÄÜ»á¶ÔÓÚ1£¬2£¬4»ò8×ֽڵĽṹÌå²»¼æÈÝ¡£

GCCʹÓÃϵͳµÄ±ê×¼Ô¼¶¨À´´«µÝ²ÎÊý¡£ÔÚһЩ»úÆ÷ÉÏ£¬Ç°¼¸¸ö²ÎÊýͨ¹ý¼Ä´æÆ÷´«µÝ£»ÔÚÁíһЩ»úÆ÷ÉÏ£¬ËùÓеIJÎÊý¶¼Í¨¹ýÕ»´«µÝ¡£Ô­±¾¿ÉÔÚËùÓлúÆ÷É϶¼Ê¹ÓüĴæÆ÷À´´«µÝ²ÎÊý£¬¶øÇÒ´Ë·¨»¹¿ÉÄÜÏÔÖøÌá¸ßÐÔÄÜ¡£µ«ÕâÑù¾ÍÓëʹÓñê×¼Ô¼¶¨µÄ´úÂëÍêÈ«²»¼æÈÝ¡£ËùÒÔÕâÖָıäÖ»ÔÚ½«GCC×÷ΪϵͳΨһµÄC±àÒëÆ÷ʱ²ÅʵÓᣵ±ÓµÓÐÒ»Ì×ÍêÕûµÄGNU ϵͳ£¬Äܹ»ÓÃGCCÀ´±àÒë¿âʱ£¬¿ÉÔÚÌØ¶¨»úÆ÷ÉÏʵÏּĴæÆ÷²ÎÊý´«µÝ¡£

ÔÚһЩ»úÆ÷ÉÏ(ÌØ±ðÊÇSPARC)£¬Ò»Ð©ÀàÐ͵IJÎÊýͨ¹ý¡°ÒþÄäÒýÓá±(invisible reference)À´´«µÝ¡£ÕâÒâζ×ÅÖµ´æ´¢ÔÚÄÚ´æÖУ¬½«ÖµµÄÄÚ´æµØÖ·´«¸ø×Ó³ÌÐò¡£

   
4156 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼ÆÄ£Ê½
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ