È£Ãâ ±Ô¾à(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¾ð¾î´Â
½ºÅÃÀ» Á÷Á¢ Á¶ÀÛÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù.
ÇÔ¼ö È£Ãâ½Ã Àμö, º¹±Í ¹øÁö, Áö¿ªº¯¼ö
µîÀÌ ½ºÅÿ¡ ÀúÀåµÇ´Âµ¥ ÇÔ¼ö Çϳª´ç »ý¼ºµÇ´Â ÀÏ·ÃÀÇ Á¤º¸¸¦ ½ºÅà ÇÁ·¹ÀÓ(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¸¦ À§·Î ¿Ã·Á °ø°£¸¸
¸¸µé »ÓÀ̹ǷΠÃʱâȵÇÁö ¾ÊÀ¸¸ç À̶§ ¿ø·¡ ½ºÅÿ¡ ÀÖ´ø °ªÀ» ¾²·¹±â°ªÀ̶ó°í ºÎ¸¥´Ù. Ãʱâ½ÄÀ» ÀÛ¼ºÇϸé
¾²·¹±â¸¦ Ä¡¿ö ÁÖÁö¸¸ ±×¸¸Å ´À·ÁÁø´Ù.
¡á ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§¸¶´Ù ½ºÅà ÇÁ·¹ÀÓÀÌ »ý¼ºµÇ¾ú´Ù°¡ »ç¶óÁö´Â º¹ÀâÇÑ °úÁ¤À» °ÅÄ¡¹Ç·Î
ÇÔ¼ö È£Ãâ¿¡´Â ¾à°£ÀÇ ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù.
ÄÄÆÄÀÏ·¯ÀÇ ³»ºÎ µ¿ÀÛÀ» ÀÌÇØÇÏ¸é ¹®¹ýÀûÀÎ »ç½ÇÀ» ÀÚ¿¬½º·´°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ¸¸ç °¡º¯ Àμö¿¡ ´ëÇÑ ÀÌÇصµ ´õ ±í¾îÁø´Ù. ÀÌÇØ°¡ ±í¾îÁö¸é ±×¸¸Å º¹ÀâÇÑ »óȲ¿¡ ´ëÇÑ ´ëó ´É·Âµµ Çâ»óµÇ±â ¸¶·ÃÀÌ´Ù.
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 µÎ °¡Áö¹Û¿¡ ¾ø´Â ¼ÀÀÌ´Ù.
ÄÄÆÄÀÏ·¯´Â ÇÔ¼öÀÇ È£Ã⠱Ծ࿡ ¸Â°Ô ½ºÅà ÇÁ·¹ÀÓÀ» ÀÛ¼ºÇÏ°í °ü¸®ÇÑ´Ù. È£Ãâ
±Ô¾à¿¡ µû¶ó ³»ºÎ Äڵ尡 ¾à°£ ´Þ¶óÁö°í ¹«½ÃÇصµ ÁÁÀ» Á¤µµÀÇ ¹Ì¼¼ÇÑ ¼Óµµ¿Í Å©±â Â÷ÀÌ°¡ ¹ß»ýÇÏÁö¸¸ ½ÇÇà °á°ú´Â µ¿ÀÏÇÏ´Ù. ±×·¡¼ °³¹ßÀÚ°¡ È£Ãâ ±Ô¾à ¶§¹®¿¡ °í¹ÎÇÒ ÇÊ¿ä´Â ¾ø´Ù. È£Ãâ ±Ô¾àÀ»
¹»·Î ÁöÁ¤Çϵç ÄÄÆÄÀÏ·¯°¡ ÇÔ¼ö¿Í È£Ãâ Äڵ带 ¦À» ¸ÂÃß¾î ¸¸µé¾î ÁØ´Ù.
ÇÏÁö¸¸ ÇÔ¼öÀÇ ¾ð¾î¿Í È£ÃâÂÊÀÇ ¾ð¾î°¡ ´Ù¸¦ ¶§³ª 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À̶ó°í ¾Ë°í ÀÖ´Ù. ±×·±µ¥ ´Ù¸¥ È£Ãâ
±Ô¾àÀ¸·Î ÇÔ¼ö¸¦ Á¦°øÇßÀ¸´Ï ´Ù¿îµÇ´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù.