2.È£Ãâ ±Ô¾à

1.½ºÅÃ

È£Ãâ ±Ô¾à(Calling Convention)Àº ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¹æ½Ä¿¡ ´ëÇÑ ¾à¼ÓÀÌ´Ù. Àμö´Â ¾î¶»°Ô Àü´ÞÇÏ°í ¸®ÅÏ°ªÀº ¾î¶»°Ô ¹ÝȯÇϸç ÇÔ¼ö È£ÃâÀ» À§ÇØ »ç¿ëÇÑ ¸Þ¸ð¸®´Â ´©°¡ Á¤¸®ÇÒ °ÍÀΰ¡¸¦ ±ÔÁ¤ÇÑ´Ù. ÀÏÁ¾ÀÇ ¾à¼ÓÀ̹ǷΠ¾çÂÊÀÌ Á¤ÇØÁø ±ÔÄ¢´ë·Î º¸Á¶¸¦ ¸ÂÃß¾î¾ß Á¤»ó µ¿ÀÛÇÑ´Ù.

È£Ãâ ±Ô¾àÀº ÄÄÆÄÀÏ·¯ ³»ºÎÀÇ ÀÏÀ̶ó ÇÔ¼ö¸¦ »ç¿ëÇϱ⸸ ÇÑ´Ù¸é ¸ô¶óµµ Å« ÁöÀåÀÌ ¾ø´Ù. ÇÏÁö¸¸ ÀÌ °úÁ¤À» ÀÌÇØÇÏ¸é ¹®¹ý¿¡ ´ëÇÑ ÀڽۨÀÌ »ý±â°í ¹Î°¨ÇÑ ¿¡·¯ »óȲ¿¡µµ Àß ´ëóÇÒ ¼ö ÀÖÀ¸¸ç ¾ð¾î°£ÀÇ È¥ÇÕ °³¹ßµµ °¡´ÉÇØÁø´Ù.

³»ºÎ¸¦ µé¿©´Ù º¸·Á¸é ½ºÅÃÀ» ¾Ë¾Æ¾ß ÇÏ°í ¾î¼Àºí¸®µµ °³³äÀº ÀÖ¾î¾ß ÇÏ´Ï ³­À̵µ°¡ ²Ï ³ô´Ù. ½ºÅÃÀº CPU°¡ ÀÓ½ÃÀûÀÎ Á¤º¸¸¦ ÀúÀåÇÏ´Â ¸Þ¸ð¸® ¿µ¿ªÀÌ´Ù. ¸Þ¸ð¸®¸¦ °ü¸®ÇÏ´Â ¹æ½ÄÀº ¿î¿µÃ¼Á¦¿¡ µû¶ó ´Ù¸£Áö¸¸ °¡Àå ÀϹÝÀûÀÎ °æ¿ì¸¦ ¿¬±¸ÇØ º¸ÀÚ.

³·Àº ¹øÁö¿¡ ÇÁ·Î±×·¥ÀÇ ÄÚµå¿Í µ¥ÀÌÅÍ°¡ ÀÖ´Ù. µÎ ¿µ¿ªÀº ÇÁ·Î±×·¥ ·Îµå½Ã¿¡ ÇÒ´çµÇ°í ±× µÚÂÊÀº ½ÇÇà½Ã¿¡ ÇÒ´çµÇ´Â ÀÚÀ¯ ¿µ¿ªÀÌ´Ù. µ¿Àû ÇÒ´çµÇ´Â ¸Þ¸ð¸®´Â ÈüÀ» »ç¿ëÇÏ¸ç ¾Æ·¡ÂÊÀÇ ÀÚÀ¯ ¿µ¿ªÀ¸·Î È®ÀåµÈ´Ù. ½ºÅÃÀº ¸Þ¸ð¸®ÀÇ ³ôÀº ¹øÁö¿¡ À§Ä¡ÇÏ¿© °ªÀ» ³ÖÀ¸¸é À§·Î À̵¿ÇÑ´Ù. ÈüÀº ¾Æ·¡·Î, ½ºÅÃÀº À§·Î È®ÀåµÇ¸ç ÀÚÀ¯ ¿µ¿ªÀ» »ç¿ëÇ쵂 µÎ ¿µ¿ªÀÌ ¸¸³ª¸é ¸Þ¸ð¸®°¡ ºÎÁ·ÇÑ »óÅÂÀÌ´Ù.

½ºÅÿ¡ °ªÀ» ÀúÀåÇÏ´Â µ¿ÀÛÀ» push(¹Î´Ù)¶ó°í Çϸç ÀúÀåµÈ °ªÀ» »©³»´Â µ¿ÀÛÀ» pop(´ç±ä´Ù)À̶ó°í ÇÑ´Ù. ½ºÅÃÀÇ ÇöÀç À§Ä¡´Â esp·¹Áö½ºÅÍ¿¡ ±â¾ïµÇ¸ç pushÇϸé esp°¡ °¨¼ÒÇϸ鼭 °ªÀÌ ½ºÅÃÀ¸·Î µé¾î°¡°í popÇϸé esp¿¡ ÀúÀåµÈ °ªÀ» »©³»°í esp°¡ Áõ°¡ÇÑ´Ù. push A´Â esp -= 4, mov [esp], A¿Í °°À¸¸ç pop A´Â mov A, [esp], esp += 4¿Í °°´Ù. 32ºñÆ® ½Ã½ºÅÛ¿¡¼­´Â ½ºÅà ÇÑÄ­ÀÌ 4¹ÙÀÌÆ®ÀÌ´Ù.

½ºÅÿ¡ ÀúÀåµÈ °ªÀº LIFO(Last In First Out)ÀÇ ¿øÄ¢¿¡ µû¶ó ÃÖÈÄ¿¡ µé¾î°£ °ªÀÌ ¸ÕÀú ³ª¿Â´Ù. ¿¹¸¦ µé¾î A, B, C ¼øÀ¸·Î pushÇß´Ù¸é popÇÒ ¶§´Â C, B, A ¼øÀ¸·Î ÀÐÇôÁø´Ù. µ¿Àü ÄÉÀ̽º¿Í À¯»çÇѵ¥ ¾Æ·¡ÂÊ¿¡ ¹Ð¾î ³ÖÀº µ¿ÀüÀ» »© ³»·Á¸é À§ÂÊÀÇ µ¿ÀüÀ» ¸ÕÀú »©¾ß ÇÑ´Ù.

CPUÀÇ ¹ü¿ë ·¹Áö½ºÅÍ´Â °³¼ö°¡ ¸¹Áö ¾Ê±â ¶§¹®¿¡ ÇÊ¿äÇÑ ·¹Áö½ºÅÍ°¡ ÀÌ¹Ì »ç¿ëÁßÀÌ¸é ½ºÅÿ¡ ·¹Áö½ºÅÍ°ªÀ» Àá½Ã ´ëÇÇÇØ ³õ°í »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î eax, ecx¸¦ Àá½Ã ´Ù¸¥ ¿ëµµ·Î »ç¿ëÇÏ°í ½Í´Ù¸é µÎ ·¹Áö½ºÅÍÀÇ °ªÀ» ½ºÅÿ¡ pushÇØ ³õ°í »ç¿ëÇÏ´Ù°¡ popÇؼ­ º¹±¸ÇÑ´Ù.

 

push ecx                                 // ecx ÀúÀå

push eax                                 // eax ÀúÀå

eax, ecx ·¹Áö½ºÅÍ »ç¿ë

pop eax                              // eax º¹±¸

pop ecx                              // ecx º¹±¸

 

ÀúÀåµÈ °ªÀ» º¹±¸ÇÒ ¶§´Â Ǫ½ÃÇÑ ¹Ý´ë ¼ø¼­´ë·Î ÆËÇÑ´Ù. esp´Â Ǫ½ÃÇÒ ¶§ °¨¼ÒÇϸç ÆËÇÒ ¶§ ´Ù½Ã Áõ°¡ÇÏ¿© Ç×»ó ´ÙÀ½ ¾×¼¼½º À§Ä¡¸¦ °¡¸®Å²´Ù.

Ǫ½ÃÇÑ ÈÄ ÆËÇÏ¸é ½ºÅÃÀº ¿ø·¡ »óÅ·Πµ¹¾Æ°£´Ù. ±×·¡¼­ Ǫ½Ã, ÆË È¸¼ö¸¸ ¸ÂÃß¸é ¾ó¸¶µçÁö ¸¹Àº °ªÀ» ÀúÀåÇÒ ¼ö ÀÖÀ¸¸ç ³ÖÀº ¼ø¼­ÀÇ ¿ª¼øÀ¸·Î ²¨³»±â¸¸ ÇÏ¸é µÈ´Ù. Ǫ½ÃÇÑ ´ë»ó°ú ÆËÇÏ´Â ´ë»óÀÌ ¹Ýµå½Ã ÀÏÄ¡ÇÒ ÇÊ¿ä´Â ¾ø¾î ½ºÅÃÀ» ÅëÇØ ·¹Áö½ºÅͳ¢¸® °ªÀ» ´ëÀÔÇϰųª ±³È¯ÇÑ´Ù.

 

push ecx

pop eax

push ecx

push eax

pop ecx

pop eax

eax¿¡ ecx ´ëÀÔ

eax¿Í ecxÀÇ ±³È¯

 

½ºÅÿ¡ ´ëÇØ ´õ »ó¼¼ÇÑ ³»¿ëÀ» ¾Ë°í ½Í´Ù¸é ¾î¼Àºí·¯ °³·Ð¼­¸¦ ÂüÁ¶ÇÏÀÚ. C¾ð¾î´Â ½ºÅÃÀ» Á÷Á¢ Á¶ÀÛÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù.

2.½ºÅà ÇÁ·¹ÀÓ

ÇÔ¼ö È£Ãâ½Ã Àμö, º¹±Í ¹øÁö, Áö¿ªº¯¼ö µîÀÌ ½ºÅÿ¡ ÀúÀåµÇ´Âµ¥ ÇÔ¼ö Çϳª´ç »ý¼ºµÇ´Â ÀÏ·ÃÀÇ Á¤º¸¸¦ ½ºÅà ÇÁ·¹ÀÓ(Stack Frame)À̶ó°í ÇÑ´Ù. ÇÔ¼ö ½ÇÇàÁß¿¡µµ Àӽà Á¤º¸¸¦ ½ºÅÿ¡ ÀúÀåÇÏÁö¸¸ Ǫ½Ã, ÆË È¸¼ö°¡ Ç×»ó ÀÏÄ¡ÇÏ¿© ½ºÅÃÀº ¾ðÁ¦³ª Ç×»ó¼ºÀ» À¯ÁöÇÑ´Ù.

ÇÔ¼ö°¡ È£ÃâµÉ ¶§ ½ºÅà ÇÁ·¹ÀÓÀÌ ¾î¶»°Ô »ý¼ºµÇ°í ¾î¶² Á¤º¸°¡ ÀúÀåµÇ´ÂÁö »ìÆ캸ÀÚ. ¾î¼Àºí¸® Äڵ带 º¸¸é È£Ãâ¿ø¿¡¼­ Àμö¸¦ Àü´ÞÇÏ´Â ¹æ½Ä°ú ÇÔ¼ö°¡ °ªÀ» ¸®ÅÏÇÏ´Â ¹æ½Ä, Áö¿ªº¯¼ö°¡ »ý¼ºµÇ´Â ¿µ¿ªÀ» µé¿©´Ù º¼ ¼ö ÀÖ´Ù.

 

StackFrame

#include <stdio.h>

 

int Add(int a, int b)

{

     int c, d, e;

     c = a + b;

     return c;

}

 

int main()

{

     int result;

     result = Add(1, 2);

     printf("result = %d\n", result);

}

½ÇÇà°á°ú

result = 3

 

Add ÇÔ¼ö´Â µÎ ¼öÀÇ ÇÕÀ» ±¸ÇØ ¸®ÅÏÇÑ´Ù. Àμö, Áö¿ªº¯¼ö, ¸®ÅÏ°ªÀ» ÀûÀýÈ÷ °¡Áö°í ÀÖ¾î ½ºÅà ÇÁ·¹ÀÓÀ» »ìÆ캸±â ÀûÀýÇÏ´Ù. Add ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ºÎºÐ¿¡ Áß´ÜÁ¡À» ¼³Á¤ÇØ ³õ°í ½ÇÇàÇÑ ÈÄ ¸Þ´º¿¡¼­ µð¹ö±×/â/µð½º¾î¼Àºí¸® Ç׸ñÀ» ¼±ÅÃÇÏ¸é ¾î¼Àºí¸® Äڵ带 º¸¿©ÁØ´Ù. ´ÙÀ½Àº main ÇÔ¼ö¿¡¼­ Add(1,2);¸¦ È£ÃâÇÏ´Â ÄÚµåÀÌµÇ °£·«ÇÏ°Ô ¿ä¾àÇß´Ù.

 

push 2

push 1

call Add

add esp,8

result = eax

 

ÇÔ¼ö·Î Àü´ÞÇÒ Àμö¸¦ ½ºÅÿ¡ Ǫ½ÃÇÑ´Ù. µÚÂÊ ÀμöºÎÅÍ ¼ø¼­´ë·Î Ǫ½ÃÇÑ ÈÄ call ¸í·ÉÀ¸·Î Add ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. call ¸í·ÉÀº º¹±ÍÇÒ ¹øÁö¸¦ Ǫ½ÃÇÑ ÈÄ ÇÔ¼öÀÇ ¹øÁö·Î Á¡ÇÁÇÏ´Â °Í(push ´ÙÀ½¹øÁö, jmp Add)ÀÌ´Ù. ½ºÅÿ¡´Â Àμö 2, 1¿Í º¹±Í ¹øÁö°¡ ÀúÀåµÇ¾î ÀÖ´Ù. ´ÙÀ½Àº Add ÇÔ¼öÀÇ Äڵ带 º¸ÀÚ.

 

push ebp

mov ebp,esp

sub esp,0ch

mov eax,[ebp+8]

add eax,[ebp+0ch]

mov [ebp-4],eax

mov eax,[ebp-4]

mov esp,ebp

pop ebp

ret

 

Add ÇÔ¼ö´Â È£Ãâ¿ø¿¡¼­ »ç¿ëÇÏ´ø ebp¸¦ ½ºÅÿ¡ Ǫ½ÃÇÑ ÈÄ ebp¿¡ ½ºÅÃÀÇ ÇöÀç À§Ä¡¸¦ ´ëÀÔÇÑ´Ù. ebp´Â Àμö¿Í Áö¿ªº¯¼ö¸¦ ¾×¼¼½ºÇϱâ À§ÇÑ ±âÁØ ¹øÁö(Base Pointer)·Î »ç¿ëµÇ¸ç ÇÔ¼ö º»Ã¼¿¡¼­´Â °è¼Ó À¯ÁöµÈ´Ù. Add¸¦ È£ÃâÇÑ ÇÔ¼ö(ÀÌ °æ¿ì main)µµ ebp¸¦ ±âÁØ ¹øÁö·Î »ç¿ëÇϹǷΠAdd´Â ÀÚ½ÅÀÇ ebp¸¦ ¼³Á¤Çϱâ Àü¿¡ È£Ãâ¿øÀÇ ebp¸¦ ÀúÀåÇØ¾ß ÇÑ´Ù.

´ÙÀ½À¸·Î esp¸¦ 0ch(½ÊÁø¼ö 12)¸¸Å­ °¨¼Ò½ÃÄÑ Á¤¼öÇüÀÇ Áö¿ªº¯¼ö 3°³¸¦ ÀúÀåÇÒ °ø°£À» ¸¸µç´Ù. º°µµÀÇ ÃʱâÈ­´Â ÇÏÁö ¾Ê´Â´Ù. ¿©±â±îÁöÀÇ Äڵ带 Á¢µÎ(prolog)¶ó°í Çϸç ÇÔ¼öÀÇ ½ÇÇàÀ» ÁغñÇÏ´Â °úÁ¤À̸ç À̶§ÀÇ ½ºÅà ¸ð¾çÀº ´ÙÀ½°ú °°´Ù. ÀÌ ±×¸²¿¡¼­ °¢ °ÝÀÚ´Â 4¹ÙÀÌÆ®ÀÌ´Ù.

ebp´Â ÀÚ½ÅÀÌ ÀúÀåµÈ ½ºÅà À§Ä¡¸¦ °¡¸®Å°°í esp´Â Áö¿ªº¯¼ö ¿µ¿ªÀÇ »ó´ÜÀ» °¡¸®Å²´Ù. esp´Â ÇÊ¿ä¿¡ µû¶ó ¿À¸£¶ô ³»¸®¶ô°Å¸®Áö¸¸ ebp´Â °è¼Ó ±âÁØ ¹øÁö¸¦ °¡¸®Å²´Ù. ebp¸¦ ±âÁØÀ¸·Î ¾Æ·¡ÂÊ¿¡´Â Àμö°¡ ÀÖ°í À§ÂÊ¿¡´Â Áö¿ªº¯¼ö°¡ ÀÖ¾î ebp¿¡ ´ëÇÑ »ó´ëÀûÀÎ ¿ÀÇÁ¼ÂÀ¸·Î ÂüÁ¶ÇÑ´Ù.

ebp°¡ °¡¸®Å°´Â °÷ ¹Ù·Î ¾Æ·¡(ebp+4)¿¡ º¹±Í ¹øÁö°¡ ÀúÀåµÇ¾î ÀÖÀ¸¸ç ±× ¾Æ·¡(ebp+8)¿¡ ù ¹ø° Àμö a°¡ ÀÖ´Ù. º»Ã¼´Â [ebp+8] Ç¥Çö½ÄÀ¸·Î a¸¦ ¾×¼¼½ºÇÏ°í µÎ ¹ø° ÀÌÈÄÀÇ Àμöµµ ¿ÀÇÁ¼Â¸¸ ¹Ù²Ù¸é µÈ´Ù. ebp ¹Ù·Î À§(ebp-4)¿¡´Â ù ¹ø° Áö¿ªº¯¼öÀÎ c°¡ ÀÖ°í n¹ø° Áö¿ªº¯¼ö´Â ebp-n*4¿¡ ÀÖ´Ù. 4¹ÙÀÌÆ®º¸´Ù ´õ Å« º¯¼ö´Â µÎ Ä­ ÀÌ»óÀ» Â÷ÁöÇÑ´Ù.

½ÇÇà Áغñ°¡ ¿Ï·áµÇ¸é º»Ã¼ Äڵ尡 ½ÇÇàµÇ´Âµ¥ c = a + b ÄÚµå´Â ´ÙÀ½ ¼¼ ÁÙ·Î ÄÄÆÄÀϵȴÙ. ±â°è¾î´Â ¸Þ¸ð¸®°£ÀÇ µ¡¼ÀÀ» Á÷Á¢ Áö¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ ·¹Áö½ºÅÍ·Î °ªÀ» ÀÐÀº ÈÄ ·¹Áö½ºÅÍ¿Í ¿¬»êÇÑ´Ù.

 

mov eax,[ebp+8]                // eax=a

add eax,[ebp+0ch]            // eax=eax+b

mov [ebp-4],eax                // c=eax

mov eax,[ebp-4]                // return c

 

¸ÕÀú eax¿¡ ebp+8¿¡ ÀÖ´Â a¸¦ Àд´Ù. ¿©±â¿¡ ebp+0ch¿¡ ÀÖ´Â bÀÇ °ªÀ» ´õÇØ ebp-4¿¡ ÀÖ´Â Áö¿ªº¯¼ö c¿¡ ´ëÀÔÇÑ´Ù. ¿¬»ê °á°ú´Â ¸®ÅÏ°ªÀ» ÀúÀåÇÏ´Â eax¿¡ ´ëÀԵȴÙ. ½ÇÇàÀ» ¸¶Ä£ ÈÄ ³²Àº Á¤¸® ÀÛ¾÷À» ¼öÇàÇϴµ¥ ÀÌ Äڵ带 Á¢¹Ì(epilog)¶ó°í ÇÑ´Ù.

 

mov esp,ebp

pop ebp

ret

 

esp¿¡ ebp¸¦ ´ëÀÔÇÏ¿© Áö¿ªº¯¼ö¿¡ ÇÒ´çÇÑ ½ºÅÃÀ» ȸ¼öÇÑ´Ù. Áö¿ªº¯¼öÀÇ »ý¸íÀº ÀÌ ½ÃÁ¡¿¡¼­ ³¡³­´Ù. ebp¸¦ ÆËÇϸé È£Ãâ¿øÀÇ ¿ø·¡ ebp°¡ º¹±¸µÇ¸ç ret ¸í·ÉÀº º¹±Í ¹øÁö¸¦ ²¨³» ¸®ÅÏÇÑ´Ù. º¹±Í ¹øÁö´Â main ÇÔ¼öÀÇ AddÈ£Ãâ¹® ¹Ù·Î ´ÙÀ½ÀÌ´Ù.

 

add esp,8

result = eax

 

esp¿¡ 8À» ´õÇØ 2°³ÀÇ Àμö Àü´Þ¿¡ »ç¿ëÇÑ ¸Þ¸ð¸®¸¦ ȸ¼öÇÑ´Ù. Àμö Àü´Þ ¿µ¿ª±îÁö ÇØÁ¦ÇÏ¸é ½ºÅÃÀº ÇÔ¼ö°¡ È£ÃâµÇ±â ÀüÀÇ »óÅ·Π±ôÂÊ°°ÀÌ º¹±¸µÇ¸ç esp, ebp µîÀÇ ÁÖ¿ä ·¹Áö½ºÅ͵µ º¹±¸µÈ´Ù. ¸¶Áö¸·À¸·Î eax¿¡ ÀúÀåµÇ¾î ÀÖ´Â ¸®ÅÏ°ªÀ» result¿¡ ´ëÀÔÇÑ´Ù.

Add ÇÔ¼ö Çϳª°¡ È£ÃâµÉ ¶§ÀÇ ½ºÅà ÇÁ·¹ÀÓÀÌ ¾î¶»°Ô ÀÛ¼ºµÇ´ÂÁö º¸¾Ò´Âµ¥ ³»ºÎ µ¿ÀÛÀ̶ó ´ÙºÐÈ÷ º¹ÀâÇÏ´Ù. À̹ø¿¡´Â ÇÔ¼ö°¡ ¿¬¼ÓÀûÀ¸·Î µÎ ¹ø È£ÃâµÉ ¶§ ¾î¶² ÀÏÀÌ ¹ú¾îÁö´ÂÁö ¿¬±¸ÇØ º¸ÀÚ. ´ÙÀ½°ú °°ÀÌ Add¸¦ È£ÃâÇÏ´Â ÇÔ¼ö°¡ ÀÖ´Ù°í ÇÏÀÚ.

 

void Dog(int v)

{

     int n,m;

     n=Add(1,2);

     ....

}

 

Dog ÇÔ¼ö´Â Á¤¼öÇü Àμö Çϳª¸¦ ÃëÇÏ°í µÎ °³ÀÇ Á¤¼öÇü Áö¿ªº¯¼ö¸¦ »ç¿ëÇÑ´Ù. main¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ½ºÅà ÇÁ·¹ÀÓÀº ´ÙÀ½°ú °°ÀÌ »ý¼ºµÈ´Ù.

ÃÖÃÊ main¸¸ ½ÇÇàÁßÀÌ´Ù°¡ Dog°¡ È£ÃâµÇ¸é ±× À§¿¡ DogÀÇ ½ºÅà ÇÁ·¹ÀÓÀÌ »ý¼ºµÈ´Ù. Dog´Â mainÀÌ »ç¿ëÇÏ´ø ebp¸¦ ÀúÀåÇÏ°í »õ·Î ¼³Á¤ÇÑ ebp¸¦ ±âÁØÀ¸·Î ÀÚ½ÅÀÇ Àμö¿Í Áö¿ªº¯¼ö¸¦ ¾×¼¼½ºÇÑ´Ù. Add°¡ È£ÃâµÇ¸é AddÀÇ ½ºÅà ÇÁ·¹ÀÓÀÌ »ý¼ºµÇ¾î Àμö¸¦ Àü´ÞÇÏ°í Áö¿ªº¯¼ö ¿µ¿ªÀ» »ý¼ºÇÑ´Ù.

Add°¡ ´Ù¸¥ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö Àִµ¥ °¡·É gotoxy(10,20)À» È£ÃâÇÑ´Ù¸é AddÀÇ ½ºÅà ÇÁ·¹ÀÓ À§¿¡ gotoxyÀÇ ½ºÅà ÇÁ·¹ÀÓÀÌ ´õ »ý¼ºµÈ´Ù. ÀÌ·± ½ÄÀ¸·Î ÇÔ¼ö°¡ È£ÃâµÉ ¶§¸¶´Ù À§ÂÊÀ¸·Î ½ºÅà ÇÁ·¹ÀÓÀÌ °è¼Ó ½×ÀδÙ. ÇÔ¼ö°¡ ¾Æ¹«¸® ÁßøµÇ¾îµµ ½ºÅÃÀÇ ¾Æ·¡ÂÊ¿¡´Â Dog¿Í Add ±×¸®°í mainÀÇ Áö¿ªº¯¼ö°¡ ¿ÂÀüÈ÷ º¸°üµÇ¾î ÀÖ´Ù.

Add´Â ¸®ÅÏ Á÷Àü¿¡ Áö¿ªº¯¼ö ¿µ¿ªÀ» ÇØÁ¦ÇÏ°í DogÀÇ ebp¸¦ º¹±¸ÇÑ´Ù. ÇÔ¼öº°·Î ±âÁØ ¹øÁö°¡ ´Þ¶ó ¸®ÅÏÇϱâ Àü¿¡ È£Ãâ¿øÀÇ ebp¸¦ º¹±¸ÇØ¾ß ÇÑ´Ù. Dog´Â Add°¡ ¸®ÅÏµÈ Á÷ÈÄ¿¡ Àμö ¿µ¿ªÀ» ÇØÁ¦ÇÏ¿© Add°¡ È£ÃâµÇ±â ÀüÀÇ »óÅ·Π½ºÅÃÀ» µ¹·Á ³õ´Â´Ù. ¸¶Âù°¡Áö·Î mainÀº Dog°¡ ¸®ÅÏÇÒ ¶§ DogÀÇ ¸ðµç È£Ãâ Á¤º¸¸¦ Á¤¸®ÇÑ´Ù.

º¸´Ù½ÃÇÇ ÇÔ¼öÀÇ ¸ðµç È£Ãâ Á¤º¸°¡ ½ºÅà ÇÁ·¹ÀÓ¿¡ ÀúÀåµÇ°í ¸®ÅϽà ¿ø·¡´ë·Î º¹±¸ÇÏ¿© ½ºÅÃÀº Ç×»ó¼ºÀ» À¯ÁöÇÑ´Ù. ½ºÅà °ø°£ÀÌ ³²¾Æ ÀÖ´Â ÇÑ ¾ó¸¶µçÁö ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ°í ÀÓÀÇÀÇ ÇÔ¼ö³¢¸® ¼­·Î È£Ãâ °¡´ÉÇÏ´Ù. ÇÔ¼ö È£Ãâ½Ã ½ºÅÃÀÇ µ¿ÀÛÀ» »ìÆì º½À¸·Î½á ´ÙÀ½°ú °°Àº Áß¿äÇÑ »ç½ÇÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù.

 

¡á Àμö´Â ÇÔ¼ö È£Ãâ Áß¿¡¸¸ »ý¸íÀÌ À¯ÁöµÇ´Â ÀÏÁ¾ÀÇ Áö¿ªº¯¼öÀÌ´Ù. ÀμöÀÇ ÃʱâÈ­ ½ÃÁ¡Àº ÇÔ¼ö°¡ È£ÃâµÉ ¶§À̸ç ÇÔ¼ö ³»ºÎ¿¡¼­¸¸ Åë¿ëµÈ´Ù.

¡á Áö¿ªº¯¼öÀÇ ¼ö¿Í ÇÔ¼öÀÇ ½ÇÇà ¼Óµµ´Â »ó°üÀÌ ¾ø´Ù. Áö¿ªº¯¼ö ¿µ¿ªÀº esp¸¦ ÇÊ¿äÇÑ ¾ç¸¸Å­ °¨¼Ò½ÃÄÑ »ý¼ºÇϴµ¥ 10À» »©³ª 20À» »©³ª ¿¬»ê ¼Óµµ´Â ÀÏÁ¤ÇÏ´Ù.

¡á Áö¿ªº¯¼ö¸¦ ¸¹ÀÌ ¾´´Ù°í Çؼ­ ÇÁ·Î±×·¥ÀÌ Ä¿Áö´Â °Íµµ ¾Æ´Ï´Ù. ¾îÂ÷ÇÇ Áö¿ªº¯¼ö´Â ½ºÅÿ¡ ÀÓ½ÃÀûÀ¸·Î »ý°å´Ù°¡ ÇÔ¼ö°¡ ³¡³ª¸é »ç¶óÁö¹Ç·Î ÇÁ·Î±×·¥ÀÇ Å©±â¿Í´Â ¹«°üÇÏ´Ù.

¡á Áö¿ªº¯¼ö¸¦ À§ÇØ esp¸¦ À§·Î ¿Ã·Á °ø°£¸¸ ¸¸µé »ÓÀ̹ǷΠÃʱâÈ­µÇÁö ¾ÊÀ¸¸ç À̶§ ¿ø·¡ ½ºÅÿ¡ ÀÖ´ø °ªÀ» ¾²·¹±â°ªÀ̶ó°í ºÎ¸¥´Ù. Ãʱâ½ÄÀ» ÀÛ¼ºÇÏ¸é ¾²·¹±â¸¦ Ä¡¿ö ÁÖÁö¸¸ ±×¸¸Å­ ´À·ÁÁø´Ù.

¡á ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§¸¶´Ù ½ºÅà ÇÁ·¹ÀÓÀÌ »ý¼ºµÇ¾ú´Ù°¡ »ç¶óÁö´Â º¹ÀâÇÑ °úÁ¤À» °ÅÄ¡¹Ç·Î ÇÔ¼ö È£Ãâ¿¡´Â ¾à°£ÀÇ ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù.

 

ÄÄÆÄÀÏ·¯ÀÇ ³»ºÎ µ¿ÀÛÀ» ÀÌÇØÇÏ¸é ¹®¹ýÀûÀÎ »ç½ÇÀ» ÀÚ¿¬½º·´°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ¸¸ç °¡º¯ Àμö¿¡ ´ëÇÑ ÀÌÇصµ ´õ ±í¾îÁø´Ù. ÀÌÇØ°¡ ±í¾îÁö¸é ±×¸¸Å­ º¹ÀâÇÑ »óȲ¿¡ ´ëÇÑ ´ëó ´É·Âµµ Çâ»óµÇ±â ¸¶·ÃÀÌ´Ù.

3.È£Ãâ ±Ô¾à

Add ÇÔ¼ö¸¦ ÅëÇØ ½ºÅà ÇÁ·¹ÀÓÀÇ ½ÇÁ¦ ¸ð¾çÀ» ºÃ´Âµ¥ ÀÌ´Â C ¾ð¾îÀÇ ±âº» È£Ãâ ±Ô¾àÀÎ __cdeclÀÇ °æ¿ìÀÌ´Ù. Àμö´Â µÚÂʺÎÅÍ Àü´ÞÇϸç Àμö Àü´Þ¿¡ »ç¿ëÇÑ ½ºÅÃÀº È£Ãâ¿øÀÌ Á¤¸®ÇÑ´Ù. È£Ãâ ±Ô¾àÀº ¾à¼ÓÀÏ »ÓÀ̹ǷΠ´Ù¸¥ ÇüÅ·εµ ¾ó¸¶µçÁö ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖÀ¸¸ç °¢ ±Ô¾àº°·Î ½ºÅà ÇÁ·¹ÀÓÀÌ ´Þ¶óÁø´Ù. ¸¹ÀÌ »ç¿ëµÇ´Â È£Ãâ ±Ô¾àÀº ´ÙÀ½°ú °°´Ù.

 

È£Ãâ ±Ô¾à

Àμö Àü´Þ

½ºÅà Á¤¸®

À̸§ ±ÔÄ¢

__cdecl

¿À¸¥ÂÊ ¸ÕÀú

È£Ãâ¿ø

_ÇÔ¼ö¸í

__stdcall

¿À¸¥ÂÊ ¸ÕÀú

ÇÔ¼ö

_ÇÔ¼ö¸í@ÀμöÅ©±â

__fastcall

ECX, EDX¿¡ ¿ì¼± Àü´Þ. ³ª¸ÓÁö´Â ¿À¸¥ÂÊ ¸ÕÀú

ÇÔ¼ö

@ÇÔ¼ö¸í@ÀμöÅ©±â

thiscall

¿À¸¥ÂÊ ¸ÕÀú, this Æ÷ÀÎÅÍ´Â ecx ·¹Áö½ºÅÍ·Î Àü´ÞµÈ´Ù.

ÇÔ¼ö

C++ À̸§ ±ÔÄ¢À» µû¸§.

naked

¿À¸¥ÂÊ ¸ÕÀú

ÇÔ¼ö

¾øÀ½

 

Àμö Àü´Þ ¹æ½Ä, ½ºÅà Á¤¸® Ã¥ÀÓ, À̸§ ±ÔÄ¢ µîÀÌ °¢°¢ ´Ù¸£´Ù. ¸®ÅÏ°ª ¹Ýȯ ¹æ½Äµµ ´Ù¸¦ ¼ö ÀÖÁö¸¸ ÇöÁ¸ÇÏ´Â ¸ðµç È£Ãâ ±Ô¾àÀº eax ·¹Áö½ºÅ͸¦ ¾²´Â °É·Î ÅëÀϵǾî ÀÖ´Ù. 8¹ÙÀÌÆ®°ªÀº edx:eax ½ÖÀ» »ç¿ëÇÏ¸ç ±¸Á¶Ã¼ °°Àº Å« °ªÀº Àӽà ¿µ¿ª¿¡ ÀúÀåÇÑ ÈÄ eax¿¡ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.

Add ÇÔ¼öÀÇ È£Ãâ ±Ô¾àÀ» __stdcall·Î ¹Ù²ã º¸ÀÚ. __stdcallÀº À©µµ¿ìÁî API ÇÔ¼ö¿Í ºñÁÖ¾ó º£ÀÌÁ÷ÀÌ »ç¿ëÇÏ´Â ¹æ½ÄÀÌ´Ù. __cdecl°ú Àμö Àü´Þ ¹æ½ÄÀº µ¿ÀÏÇ쵂 ½ºÅÃÀ» Á¤¸®ÇÏ´Â ÁÖü°¡ È£Ãâ¿øÀÌ ¾Æ´Ï¶ó ÇÔ¼ö¶ó´Â Á¡ÀÌ ´Ù¸£´Ù. Add ÇÔ¼öÀÇ È£Ãâ ±Ô¾àÀ» ¹Ù²Ù±â À§ÇØ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

int __stdcall Add(int a, int b)

{

     int c,d,e;

     c=a+b;

     return c;

}

 

ÇÔ¼ö À̸§¾Õ¿¡ __stdcall Å°¿öµå¸¦ »ðÀÔÇϸé ÀÌ ÇÔ¼ö´Â __stdcall È£Ãâ ±Ô¾àÀ» »ç¿ëÇÑ´Ù. main¿¡¼­ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ºÎºÐÀÌ ´ÙÀ½°ú °°ÀÌ º¯°æµÈ´Ù.

 

push 2

push 1

call Add

result=eax

 

Àμö¸¦ ½ºÅÿ¡ ¹Ð¾î ³Ö´Â °Í°ú Àμö¸¦ Ǫ½ÃÇÏ´Â ¼ø¼­´Â µ¿ÀÏÇÏ´Ù. ´Ü, call Add ´ÙÀ½¿¡ add esp,8 Äڵ尡 ¾ø¾î ÇÔ¼ö°¡ ¸®ÅÏµÈ ÈÄ¿¡ Àμö Àü´Þ¿¡ »ç¿ëÇÑ ½ºÅÃÀ» º¹±¸ÇÏÁö ¾Ê´Â´Ù. Àμö Àü´Þ¿¡ »ç¿ëÇÑ ¿µ¿ªÀº ÀÌÁ¦ Add ÇÔ¼ö°¡ Á÷Á¢ Á¤¸®ÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ Á¢µÎ, º»Ã¼´Â __cdecl°ú µ¿ÀÏÇϸç Á¢¹Ì ºÎºÐÀÌ ´ÙÀ½°ú °°ÀÌ º¯°æµÈ´Ù.

 

push ebp

....

ret 8

 

º¹±Í Äڵ尡 ret¿¡¼­ ret 8·Î ¹Ù²î¾úÀ¸¸ç º¹±ÍÇϸ鼭 esp¸¦ 8¸¸Å­ Áõ°¡½ÃŲ´Ù. ÀÌ Äڵ忡 ÀÇÇØ ÇÔ¼ö´Â ½ÇÇàÀ» ¸¶Ä¡°í º¹±ÍÇÔ°ú µ¿½Ã¿¡ Àμö ¿µ¿ªÀ» ÇØÁ¦ÇÑ´Ù. ÇÔ¼ö°¡ ½ºÅÃÀ» ¾Ë¾Æ¼­ Á¤¸®ÇϹǷΠȣÃâ¿øÀº Àμö¸¦ ¼ø¼­´ë·Î ½ºÅÿ¡ Ǫ½ÃÇÑ ÈÄ È£Ã⸸ ÇÑ´Ù.

´©°¡ Á¤¸®ÇÏµç ½ºÅÃÀº Ç×»ó È£ÃâÀüÀÇ »óÅ·Πº¹±ÍµÇ±â ¶§¹®¿¡ °á°ú Äڵ忡 Å« ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù. ½ÇÇà ¼Óµµ´Â °ÅÀÇ °°°í ÇÁ·Î±×·¥ Å©±â´Â __stdcallÀÌ ¾à°£ ´õ ÀÛ´Ù. __cdeclÀº ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§¸¶´Ù Á¤¸® Äڵ尡 ÀÛ¼ºµÇ´Âµ¥ ºñÇØ __stdcallÀº ÇÔ¼ö ÀÚü¿¡ Á¤¸® Äڵ尡 µü ÇÑ ¹ø¸¸ ÀÛ¼ºµÇ±â ¶§¹®ÀÌ´Ù.

¶Ç ´Ù¸¥ Â÷ÀÌÁ¡Àº °¡º¯ Àμö Áö¿ø ¿©ºÎÀÌ´Ù. __stdcallÀº ÇÔ¼ö°¡ ½ºÅÃÀ» Á¤¸®Çϱ⠶§¹®¿¡ Àμö °³¼ö°¡ °íÁ¤ÀûÀÌ´Ù. ¹Ý¸é __cdeclÀº È£ÃâÇÏ´Â °÷¿¡¼­ Á¤¸®ÇϹǷΠ½ÇÁ¦ Àμö °³¼ö¿¡ µû¶ó Á¤¸® Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. printf°°Àº °¡º¯ Àμö ÇÔ¼ö´Â ¸ðµÎ __cdeclÀ» »ç¿ëÇϸç API ÇÔ¼öµµ wsprintf´Â ¿¹¿ÜÀûÀ¸·Î __cdeclÀÌ´Ù. ¸¸¾à °¡º¯ Àμö ÇÔ¼ö¸¦ __stdcall·Î ÀÛ¼ºÇϸé ÄÄÆÄÀÏ·¯´Â À̸¦ ¹«½ÃÇÏ°í __cdecl·Î ¹Ù²Ù¾î ¹ö¸°´Ù.

´ÙÀ½Àº ÇÔ¼ö Á¤ÀǺθ¦ int __fastcall Add(int a, int b)·Î ¼öÁ¤ÇÏ¿© __fastcall È£Ãâ ±Ô¾àÀ» Å×½ºÆ®ÇØ º¸ÀÚ. È£ÃâºÎÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

 

mov edx,2

mov ecx,1

call Add

result=eax

 

__fastcallÀº Àμö Àü´ÞÀ» À§ÇØ edx, ecx ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ´Ù. Àμö°¡ ´õ ¸¹À¸¸é ¼¼ ¹ø° ÀμöºÎÅÍ´Â __cdecl°ú ¸¶Âù°¡Áö·Î ½ºÅÿ¡ ¹Ð¾î³Ö´Â´Ù. ·¹Áö½ºÅ͸¦ ¿ì¼±ÀûÀ¸·Î »ç¿ëÇÏ¿© Àμö Àü´Þ ¼Óµµ°¡ ºü¸£´Ù. ÇÔ¼öÀÇ ÄÚµå´Â ´ÙÀ½Ã³·³ ÀÛ¼ºµÈ´Ù.

 

push ebp

mov ebp,esp

sub esp,14h

mov [ebp-8],edx           // ù ¹ø° Àμö¸¦ Áö¿ªº¯¼ö·Î

mov [ebp-4],ecx           // µÎ ¹ø° Àμö¸¦ Áö¿ªº¯¼ö·Î

mov eax,[ebp-4]

add eax,[ebp-8]

mov [ebp-0ch],eax            // c´Â ¼¼ ¹ø° Áö¿ªº¯¼ö°¡ µÈ´Ù.

mov eax,[ebp-0ch]

mov esp,ebp

pop ebp

ret

 

edx, ecx ·¹Áö½ºÅ͸¦ ÅëÇØ Àü´Þ¹ÞÀº Àμö¸¦ Áö¿ªº¯¼ö ¿µ¿ª¿¡ º¹»çÇϴµ¥ ¾îÂ÷ÇÇ Àμöµµ Áö¿ªº¯¼öÀÇ ÀÏÁ¾À̹ǷΠÀÌ·¸°Ô Çصµ º° »ó°üÀÌ ¾ø´Ù. ºñÁÖ¾ó C++Àº fastcallÀ» Çü½ÄÀûÀ¸·Î¸¸ Áö¿øÇÒ »Ó fastcallÀÇ ÀåÁ¡À» ÃëÇÏÁö ¸øÇϴµ¥ ÄÄÆÄÀÏ·¯ ±¸Çö»ó ecx, edx ·¹Áö½ºÅÍ°¡ ²À ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù. 

·¹Áö½ºÅÍ´Â ½ºÅú¸´Ù »¡¶ó __fastcallÀº È£Ãâ ¼Óµµ°¡ ºü¸£´Ù. ´ë½Å ¸ðµç CPU¿¡ ¿©À¯ ·¹Áö½ºÅÍ°¡ Ç×»ó Á¸ÀçÇÏ´Â °ÍÀÌ ¾Æ´Ï¾î¼­ À̽ļº¿¡´Â ºÒ¸®ÇÏ´Ù. ±×·¡¼­ À©µµ¿ìÁî API´Â ÀÌ È£Ãâ ±Ô¾àÀ» Áö¿øÇÏÁö¸¸ »ç¿ëÇÏÁö´Â ¾Ê´Â´Ù. º¼·£µåÀÇ µ¨ÆÄÀÌ°¡ __fastcallÀ» »ç¿ëÇÑ´Ù.

thiscallÀº Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö¿¡ ´ëÇؼ­¸¸ Àû¿ëµÇ´Âµ¥ ecx·Î °´Ã¼ÀÇ Æ÷ÀÎÅÍ(this)°¡ Àü´ÞµÇ´Â °ÍÀÌ Æ¯Â¡ÀÌ¸ç ³ª¸ÓÁö ±ÔÄ¢Àº __stdcall°ú µ¿ÀÏÇÏ´Ù. ¿¹¿ÜÀûÀ¸·Î °¡º¯ Àμö¸¦ »ç¿ëÇÏ´Â ¸â¹ö ÇÔ¼ö´Â __cdecl·Î ÀÛ¼ºµÇ¸ç À̶§ this´Â ½ºÅÃÀÇ Á¦ÀÏ ¸¶Áö¸·¿¡(ù ¹ø° Àμö) Àü´ÞµÈ´Ù.

thiscallÀº ¸â¹ö ÇÔ¼ö¿¡ ´ëÇؼ­¸¸ Ưº°È÷ Àû¿ëÇÏ´Â °ÍÀ̾ ÀÏ¹Ý ÇÔ¼ö¿¡´Â Àû¿ëÇÒ ¼ö ¾ø´Ù. thiscallÀº ÀÌ È£Ãâ ±Ô¾àÀÇ À̸§ÀÏ »Ó Å°¿öµå°¡ ¾Æ´Ï¾î¼­ ÇÔ¼ö ¿øÇü¿¡ thiscallÀ̶ó°í ¾µ ¼öµµ ¾ø´Ù. ¸â¹ö ÇÔ¼öÀ̱⸸ Çϸé ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼­ thiscall È£Ãâ ±Ô¾àÀ» Àû¿ëÇÑ´Ù.

__naked È£Ãâ ±Ô¾àÀº ÄÄÆÄÀÏ·¯°¡ Á¢µÎ, Á¢¹Ì¸¦ ÀÛ¼ºÇÏÁö ¾ÊÀ¸¸ç ¸ðµç °ÍÀÌ »ç¿ëÀÚ Ã¥ÀÓÀÌ´Ù. ½ºÅÃÀ» ´Ù·ç·Á¸é ¾î¿ ¼ö ¾øÀÌ ¾î¼Àºí¸®¸¦ »ç¿ëÇØ¾ß ÇϹǷΠÀϹÝÀûÀÎ ¸ñÀûÀ¸·Î´Â ¾²±â ¾î·Æ´Ù. ´Ù¸¥ ¾ð¾î¿Í È¥ÇÕ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§³ª ¼Óµµ°¡ Áö±ØÈ÷ Áß¿äÇÑ ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö¿¡¸¸ »ç¿ëµÈ´Ù.

¿©±â¼­ ¾Ë¾Æº» È£Ãâ ±Ô¾à ¿Ü¿¡ __pascal, __fortran, __syscall À̶ó´Â È£Ãâ ±Ô¾àÀÌ ÀÖ¾úÀ¸³ª Áö±ÝÀº °ÅÀÇ »ç¿ëµÇÁö ¾Ê´Â´Ù. ÀÌ»óÀ¸·Î ´Ù¼¸ °¡ÁöÀÇ È£Ã⠱Ծ࿡ ´ëÇØ Á¤¸®Çߴµ¥ ½ÇÁ¦·Î »ç¿ëµÇ°í »ç¿ëÀÚ°¡ ÁöÁ¤ÇÒ ¼ö Àִ ȣÃâ ±Ô¾àÀº Çö½ÇÀûÀ¸·Î __cdecl, __stdcall µÎ °¡Áö¹Û¿¡ ¾ø´Â ¼ÀÀÌ´Ù.

4.È£Ãâ ±Ô¾à ºÒÀÏÄ¡

ÄÄÆÄÀÏ·¯´Â ÇÔ¼öÀÇ È£Ã⠱Ծ࿡ ¸Â°Ô ½ºÅà ÇÁ·¹ÀÓÀ» ÀÛ¼ºÇÏ°í °ü¸®ÇÑ´Ù. È£Ã⠱Ծ࿡ µû¶ó ³»ºÎ Äڵ尡 ¾à°£ ´Þ¶óÁö°í ¹«½ÃÇصµ ÁÁÀ» Á¤µµÀÇ ¹Ì¼¼ÇÑ ¼Óµµ¿Í Å©±â Â÷ÀÌ°¡ ¹ß»ýÇÏÁö¸¸ ½ÇÇà °á°ú´Â µ¿ÀÏÇÏ´Ù. ±×·¡¼­ °³¹ßÀÚ°¡ È£Ãâ ±Ô¾à ¶§¹®¿¡ °í¹ÎÇÒ ÇÊ¿ä´Â ¾ø´Ù. È£Ãâ ±Ô¾àÀ» ¹»·Î ÁöÁ¤Çϵç ÄÄÆÄÀÏ·¯°¡ ÇÔ¼ö¿Í È£Ãâ Äڵ带 ¦À» ¸ÂÃß¾î ¸¸µé¾î ÁØ´Ù.

ÇÏÁö¸¸ ÇÔ¼öÀÇ ¾ð¾î¿Í È£ÃâÂÊÀÇ ¾ð¾î°¡ ´Ù¸¦ ¶§³ª DLLÀÇ ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ µî Ư¼öÇÑ °æ¿ì¿¡´Â À̸¦ ¸ÂÃç ÁÖ¾î¾ß ÇÑ´Ù. °°Àº ¾ð¾î¿¡¼­´Â È£Ãâ ±Ô¾àÀÇ ºÒÀÏÄ¡´Â ¹ß»ýÇÏÁö ¾Ê¾Æ ÇÑ ¿¹Á¦¿¡¼­ ÀÌ·± Çö»óÀ» ¸ñ°ÝÇÏ´Â °ÍÀº ½±Áö ¾Ê´Ù. ¾ïÁö·Î ¸¸µé·Á¸é ÇÔ¼ö Æ÷ÀÎÅͷΠȣÃâ ±Ô¾àÀ» ´Ù¸£°Ô ¼³Á¤ÇØ ³õ°í °­Á¦ È£ÃâÇØ¾ß ÇÑ´Ù.

 

WrongCall

#include <stdio.h>

 

int __cdecl Add(int a, int b)

{

     int c, d, e;

     c = a + b;

     return c;

}

 

int main()

{

     int result;

     int(__stdcall *pf)(int, int);

     pf = (int(__stdcall *)(int, int))Add;

     result = pf(1, 2);

     printf("result = %d\n", result);

}

 

Add ÇÔ¼ö´Â __cdecl·Î ¼±¾ðÇßÀ¸¹Ç·Î ½ºÅà Á¤¸® Ã¥ÀÓÀº È£Ãâ¿ø¿¡ ÀÖ´Ù. mainÀº Add¸¦ ¹Ù·Î È£ÃâÇÏÁö ¾Ê°í __stdcall È£Ãâ ±Ô¾àÀ» »ç¿ëÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅÍ pf¿¡ °­Á¦ ´ëÀÔÇÑ ÈÄ È£ÃâÇß´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ´Â ÇÔ¼ö¸¦ È£ÃâÇϱâ À§ÇÑ ¸ðµç Á¤º¸¸¦ °¡Áö°í ÀÖ¾î¾ß ÇϹǷΠȣÃ⠱Ծ࿡ ´ëÇÑ ÁöÁ¤µµ °¡Áø´Ù. pf = Add¶ó°í ´ëÀÔÇϸé ŸÀÔÀÌ ´Þ¶ó ´ëÀÔµÇÁö ¾ÊÀ¸¹Ç·Î ij½ºÆÃÇß´Ù.

pf´Â __stdcall È£Ãâ ±Ô¾àÀ» ¾²´Â ÇÔ¼ö¿¡ ´ëÇÑ ÇÔ¼ö Æ÷ÀÎÅÍÀ̹ǷΠÀÌ Æ÷ÀÎÅÍ·Î ÇÔ¼ö¸¦ È£ÃâÇϸé mainÀº ½ºÅÃÀ» Á¤¸®ÇÏÁö ¾Ê´Â´Ù. ÄÄÆÄÀÏ·¯´Â pf(1,2)È£Ãâ¿¡ ´ëÇØ ÀÌ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ÇÔ¼ö´Â ½ºÅÃÀ» ¾Ë¾Æ¼­ Á¤¸®ÇÑ´Ù°í »ý°¢ÇÏ¿© ½ºÅà Á¤¸® Äڵ带 ÀÛ¼ºÇÏÁö ¾Ê´Â´Ù. °á±¹ ¾Æ¹«µµ ½ºÅÃÀ» Á¤¸®ÇÏÁö ¾Ê±â ¶§¹®¿¡ ½ºÅÃÀÇ Ç×»ó¼ºÀÌ ±úÁø´Ù.

½ºÅÿ¡ ÀúÀåµÇ´Â Á¤º¸´Â ¾ÆÁÖ Áß¿äÇÑ ¿ªÇÒÀ» Çϱ⠶§¹®¿¡ Á¶±ÝÀÌ¶óµµ ¼Õ»óµÇ¸é ÇÁ·Î±×·¥ÀÇ µ¿ÀÛÀº ¿¹ÃøÇÒ ¼ö ¾ø´Ù. ½ºÅà Æ÷ÀÎÅ͸¦ ÀÒ¾î¹ö¸° ÇÁ·Î±×·¥Àº ¾û¶×ÇÑ °ªÀ» ·¹Áö½ºÅÍ¿¡ ´ëÀÔÇϰųª º¹±Í ¹øÁö¸¦ À߸ø ã¾Æ ÀÓÀÇÀÇ ¸Þ¸ð¸® ¹øÁö·Î Á¡ÇÁÇÏ¿© ÆøÁÖÇØ ¹ö¸°´Ù. °á±¹ ÀÌ ÇÁ·Î±×·¥Àº Add°¡ ¸®ÅϵǴ Áï½Ã ´Ù¿îµÈ´Ù.

À̹ø¿¡´Â ¹Ý´ëÀÇ °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ. Add ÇÔ¼ö¸¦ __stdcall È£Ãâ ±Ô¾àÀ¸·Î ÀÛ¼ºÇÏ°í main¿¡¼­ pf¸¦ __cdecl È£Ãâ ±Ô¾àÀ» ¾²´Â ÇÔ¼ö Æ÷ÀÎÅÍ·Î ¼±¾ðÇÑ ÈÄ pf·Î Add¸¦ È£ÃâÇÏ¸é ¾î¶»°Ô µÉ±î? ÀÌ °æ¿ì ½ºÅÃÀº ÀÌÁßÀ¸·Î Á¤¸®µÇ°í ¸¶Âù°¡Áö·Î ½ºÅÃÀÌ ±úÁö±â ¶§¹®¿¡ ¿ª½Ã ´Ù¿îµÈ´Ù. ½ºÅÃÀº Ç×»ó¼ºÀ» À¯ÁöÇØ¾ß ÇÑ´Ù´Â ´ë¿øÄ¢À» ¾î°å±â ¶§¹®ÀÌ´Ù.

¾Õ ÀåÀÇ Äü ¼ÒÆ® ¿¹Á¦·Î ÀÌ·± »óȲÀ» Å×½ºÆ®ÇÒ ¼ö Àִµ¥ compare ÇÔ¼öÀÇ ¿øÇüÀ» __stdcall·Î ¹Ù²Ù¸é ´çÀå ´Ù¿îµÇ¾î ¹ö¸°´Ù. qsort°¡ ºñ±³ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÄÚµå´Â ÀÌ¹Ì ¶óÀ̺귯¸®¿¡ ÄÄÆÄÀÏµÈ ±â°è¾î ÄÚµå·Î µé¾î ÀÖÀ¸¸ç qsort´Â ºñ±³ ÇÔ¼ö°¡ __cdeclÀ̶ó°í ¾Ë°í ÀÖ´Ù. ±×·±µ¥ ´Ù¸¥ È£Ãâ ±Ô¾àÀ¸·Î ÇÔ¼ö¸¦ Á¦°øÇßÀ¸´Ï ´Ù¿îµÇ´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù.