>>> Åͺ¸ CÀÇ ±íÀº °÷ <<< Á¦3ȸ ÇÔ¼ö È£ÃâÀÇ ½ÇÁ¦¿Í C È£Ãâ °üÇà ±Û/ÀÓÀ롂 (¼­¿ï´ë ±â°è°øÇаú4) --------------------------------------------------------------------- 1 º»¹®¿¡ ¾Õ¼­ --------------------------------------------------------------------- Áö³­ ´Þ¿¡´Â Åͺ¸ C°¡ Á¦°øÇÏ´Â 6°³ ¸Þ¸ð¸® ¸ðµ¨(memory model)ÀÇ ±¸ Á¶/Ư¡/Â÷ÀÌÁ¡¿¡ °üÇÏ¿© ¼³¸íÇß´Ù. À̹ø¿¡´ÂÀ̾ Åͺ¸ C°¡ Á¦°øÇÏ´Â 3 °¡Áö ÇÔ¼ö È£Ãâ ¹æ½Ä°ú ´õºÒ¾î ÇÔ¼ö¿¡ ¸Å°³º¯¼ö¸¦ Àü´ÞÇÏ´Â ¼ø¼­¿¡ ´ëÇÏ¿© ÀÚ¼¼È÷ ¼³¸íÇÏ°Ú´Ù. --------------------------------------------------------------------- 2 ÀÏ´Ü °¨ºÎÅÍ Àâ°í º¸ÀÚ - C ÇÔ¼ö È£ÃâÀÇ ¼û°ÜÁø ³»¸· --------------------------------------------------------------------- ´ÙÀ½ÀÇ <¿¹Á¦ 1>Àº ¼Ò½ÃÀûÀÇ ÆĽºÄ®ÀÌ ÄÚ¿ôÀ½Ä¥ ¸¸ÇÑ, ±¸¼®±â ½Ã´ëÀû ÀÎ Á¤¼ö ÇÕ»ê ÇÁ·Î±×·¥ÀÌ´Ù. ÀÌ ¿¹Á¦¿¡¼­ main ÇÔ¼ö´Â sumÀ̶ó´Â ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ÀÌ ¶§ sum ÇÔ¼ö´Â intÇü ¸Å°³º¯¼ö¸¦ 2°³ ÃëÇÏ°í, intÇü °ªÀ» µÇ µ¹·ÁÁØ´Ù. ±×¸®°í sum ÇÔ¼ö´Â 2°³ÀÇ intÇü ÀÚµ¿º¯¼ö¸¦ ¸¶·ÃÇÏ¿© ³»ºÎÀûÀ¸ ·Î ¾²°í ÀÖ´Ù. ¿©±â¼­ ÁÖÀÇÇÒ »çÇ×Àº ¾î¶² ÇÔ¼öÀ̵çÁö ±× ¼±¾ð¹®¿¡ ³ªÅ¸³ª´Â ÃÖÃÊÀÇ 2¹ÙÀÌÆ® Å©±â(intÇü, unsignedÇü, ±Ù°Å¸® Æ÷ÀÎÅÍ)ÀÇ ÀÚµ¿º¯¼ö 2°³´Â Åͺ¸ CÀÇ ÃÖÀûÈ­(optimizing)¿¡ ÀÇÇØ ·¹Áö½ºÅͺ¯¼ö·Î ÀÚµ¿ º¯È¯µÈ´Ù´Â Á¡ÀÌ´Ù. ÀÌ ¶§ ·¹Áö½ºÅͺ¯¼ö´Â Åͺ¸ C ³»ºÎÀûÀ¸·Î SI¿Í DI ·¹Áö½ºÅ͸¦ ÀǹÌÇÑ´Ù. ÀÌ Á¡À» ÆľÇÇÏÁö ¸øÇϸé <¿¹Á¦ 2>¸¦ ÀÌÇØÇÒ ¼ö ¾ø°Ô µÈ´Ù. ¹°·Ð ±×·¯ÇÑ ÃÖÀûÈ­´Â´Ù¸¥ ·¹Áö½ºÅͺ¯¼öÀÇ Á¤ÀÇ°¡ ¾øÀ» ¶§¿¡ ÇÑÇϸç, ¶ÇÇÑ ¹øÁö ¿¬»êÀÚ &ÀÇ ÇÇ¿¬»êÀÚ·Î ´Ü ÇÑ ¹øÀÌ¶óµµ ¾²ÀÌ´Â 2¹ÙÀÌÆ® Å©±âÀÇ ÀÚµ¿º¯¼ö´Â ¼ø¼­»ó ºñ·Ï ÃÖÃÊÀÏÁö¶óµµ ·¹Áö½ºÅͺ¯¼ö·Î ÀÚµ¿ º¯È¯µÇÁö ¾Ê´Â ´Ù. ±×°ÍÀº ·¹Áö½ºÅͺ¯¼öÀÇ °æ¿ì ±× ¹øÁö¸¦ ÃëÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. <¿¹Á¦ 1> ¾ÆÁÖ °£´ÜÇÑ ¿¹Á¦ --------------------------------------------------------------------- #include int sum(int n1, int n2) { +--+------------ ÃÖÀûÈ­¿¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î int n; | ·¹Áö½ºÅÍ º¯¼ö(SI¿ÍDI)°¡ µÈ´Ù. int sum = 0; --- ÇÔ¼ö¸í°ú ÀÚµ¿º¯¼ö¸íÀº Áߺ¹µÇµµ ¹«¹æÇÏ´Ù. for (n = n1; n <= n2; n++) sum += n; return sum; } void main(void) { int result; result = sum(0, 10); printf("Result = %d\n", result); } --------------------------------------------------------------------- ´ÙÀ½ÀÇ <¿¹Á¦ 2>´Â tcc.exe¸¦ ½á¼­ <¿¹Á¦ 1>À» ¾î¼Àºí¸®·Î ÄÄÆÄÀÏÇÑ µÚ¿¡ Áß¿äÇÑ ºÎºÐ¸¸ ¹ßÃé/ÆíÁýÇÑ °ÍÀ¸·Î¼­, Åͺ¸ C¿¡¼­ ÇÔ¼ö¸¦ È£ÃâÇÏ°í °ªÀ» º¹±Í(return)ÇÏ´Â À̸¥¹Ù "È£Ãâ °üÇà(calling convention)"ÀÇ Àü¸»À» º¸¿© ÁÖ°í ÀÖ´Ù. Áï ÇÔ¼ö È£Ãâ/ÇÇÈ£Ãâ ±ÔÄ¢ ¹× ¸Å°³º¯¼öÀÇ Àü´Þ ¼ø¼­ µîÀÌ Àû³ª¶óÇÏ°Ô µå·¯³ª ÀÖ´Ù. ÀÌ¹Ì ¾î¼Àºí¸®¿¡¼­ÀÇ ÇÔ¼ö(ÇÁ·Î½ÃÁ®) È£Ãâ ¹æ½Ä µî¿¡ Àͼ÷ÇØ ÀÖ´Â µ¶ÀÚ´Â <¿¹Á¦ 2>¸¸À¸·Îµµ ¸î ´Þ ºÐ·®ÀÇ ¿ø°í¸¦ ´Ù ÀÐÀº ¼ÀÀÌ µÉ °ÍÀÌ´Ù. <¿¹Á¦ 2> <¿¹Á¦ 1>À» ¾î¼Àºí¸®·Î ÄÄÆÄÀÏÇÑ ÄÚµå --------------------------------------------------------------------- ...... ; ; sum ÇÔ¼ö(PUBLIC ¼±¾ðÀº ´Ù¸¥ °÷¿¡ ¸ð¾ÆÁ® ÀÖ´Ù) ; _sum PROC near --- ±Ù°Å¸® ÇÔ¼öÀÓÀ» ³ªÅ¸³½´Ù. ÁøÀÔ +-push bp --- BP¸¦ ´ëÇǽÃŲ´Ù. ÄÚµå +-mov bp,sp --- BP´Â ¸Å°³º¯¼ö¿Í ÀÚµ¿º¯¼ö¸¦ ÂüÁ¶Çϱâ À§ÇÑ Æ÷ÀÎÅÍ·Î ¾²ÀδÙ. push si -+- ÇÔ¼ö ³»¿¡¼­ SI¿Í DI¸¦ ¾²·Á¸é ¹Ýµå½Ã push di -+ SI¿Í DIÀÇ ÀÌÀü °ªÀ» ´ëÇǽÃÄÑ¾ß ÇÑ´Ù. xor di,di --+ mov si,word ptr [bp+4] | jmp short @5 ¸Å°³º¯¼ön1 | @4: | sum ÇÔ¼ö ºí·° ³»ÀÇ add di,si | ¹®ÀåµéÀ» ÄÄÆÄÀÏÇÑ @3: | ¾î¼Àºí¸® ÄÚµå inc si | @5: | cmp si,word ptr [bp+6] | jle @4 ¸Å°³º¯¼ön2 -+ @2: mov ax,di --- 2¹ÙÀÌÆ® Å©±âÀÇ µ¥ÀÌÅÍÇüÀº jmp short @1 AX¿¡ ³Ö¾î º¹±ÍÇÑ´Ù. @1: pop di -+- SI¿Í DIÀÇ ÀÌÀü °ªÀ» º¹±¸ pop si -+ Å»Ãâ +-pop bp--- BPÀÇ ÀÌÀü °ªÀ» º¹±¸ ÄÚµå +-ret _sum ENDP ; ; main ÇÔ¼ö ; _main PROC near +-- ÇÔ¼ö ³»ºÎ¿¡¼­ SI¸¦ ¾²¹Ç·Î push si ----+ ÀÌÀü °ªÀ» ´ëÇǽÃŲ´Ù. (main ÇÔ¼öµµ ±âµ¿ Äڵ忡 ´ëÇÑ ÇÇÈ£Ãâ ÇÔ¼öÀÓ) +-mov ax,10 | push ax ------- µÎ¹ø° ½Ç¸Å°³º¯¼ö 10ÀÇ ÀúÀå sum | xor ax,ax ---- ù¹ø° ½Ç¸Å°³º¯¼ö 0ÀÇ ÀúÀå È£Ãâ | push ax ------- ±Ù°Å¸® È£Ãâ(near call) | call near ptr _sum | pop cx -+----- SPÀÇ ¿ø»ó º¹±Í +-pop cx -+ (pop ¸í·ÉÀ» ½èÀ½¿¡ ÁÖ¸ñ) mov si,ax --- ¹Ýȯ°ªÀ» result(Áï SI)¿¡ ´ëÀÔ +-push si ¹®ÀÚ¿­ "Result = %d\n"À» °¡¸®Å°´Â printf| mov ax,offset DGROUP:s@ --+ Æ÷ÀÎÅÍ È£Ãâ | push ax +--- ´ÙÀ½ ´Þ¿¡ ¼³¸íÇÒ ¿¹Á¤ | call near ptr _printf | pop cx +-pop cx pop si -------- ÀÌÀü °ªÀ» º¹±¸ ret --------------- ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀ» Á¾·áÇÑ´Ù _main ENDP (½ÇÁ¦·Î´Â ±âµ¿ ÄÚµåÀÇ Á¾·á ·çƾÀ¸·Î ÇÁ·Î±×·¥ Á¦¾î¸¦ ³Ñ±ä´Ù) ...... --------------------------------------------------------------------- --------------------------------------------------------------------- 3 È£Ãâ ÇÔ¼ö¿Í ÇÇÈ£Ãâ ÇÔ¼öÀÇ ÀÇ¹Ì --------------------------------------------------------------------- º»·Ð¿¡ µé¾î°¡±â Àü¿¡ ¿ì¼± »õ·Î¿î ¿ë¾î µÎ °¡Áö¸¸ È®½ÇÈ÷ ÇÏ°í ³Ñ¾î °¡ÀÚ. <¿¹Á¦ 1>¸¦ º¸¸é main ÇÔ¼ö°¡ sum ÇÔ¼ö¸¦ È£ÃâÇÏ°í ÀÖ´Ù. ¿©±â¼­ ±× È£ÃâÇÑ ½ÃÁ¡¿¡¼­¸¸ ±¹ÇÑÇÏ¿© º¼ ¶§, main ÇÔ¼ö¸¦ "È£Ãâ ÇÔ¼ö"¶ó°í ÇÏ°í su m ÇÔ¼ö¸¦ "ÇÇÈ£Ãâ ÇÔ¼ö"·Î ºÎ¸£±â·Î ÇÏÀÚ. ±»ÀÌ ¿µ¾î·Î ÇÏÀÚ¸é °¢°¢ "call ing function", "called function"ÀÌ µÇ°Ú´Ù. À¯ÀÇÇÒ Á¡Àº È£Ãâ ÇÔ¼ö¿Í ÇÇÈ£Ãâ ÇÔ¼öÀÇ °ü°è°¡ ±× È£ÃâÇÏ´Â ½ÃÁ¡¿¡ ±¹ÇÑµÇ¾î °áÁ¤Áö¾îÁø´Ù´Â °ÍÀÌ´Ù. ±×·¡¼­ ½ÃÁ¡À» ¹Ù²Ù¸é ±× °ü°èµµ ´Þ¶óÁø ´Ù. ¿¹¸¦ µé¾î ¸¸¾à sum ÇÔ¼ö°¡ ¶Ç ´Ù¸¥ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù¸é ±× ½ÃÁ¡¿¡¼­´Â sumÀÌ È£Ãâ ÇÔ¼ö°¡ µÈ´Ù. ±×¸®°í main ÇÔ¼öµµ ÇÁ·Î±×·¥ ½ÇÇà Á÷ÈÄ·Î ½ÃÁ¡ À» ´Þ¸® ÇÏ¸é ±âµ¿ ÄÚµå(startup code)¿¡¼­ È£ÃâµÇ´Â ÇÇÈ£Ãâ ÇÔ¼öÀÌ´Ù. ±× ¹Û¿¡ º¹±Í(return), ´ëÇÇ(push), º¹±¸(pop), ¹Ýȯ°ª(¸®ÅÏ°ª; retur n value) µîÀÇ ¿ë¾îµµ »ý¼ÒÇÑ µ¶ÀÚ´Â ÀÍÇô µÎ±â ¹Ù¶õ´Ù. --------------------------------------------------------------------- 4 ±Ù°Å¸®/¿ø°Å¸®/°Å´ë ÇÔ¼ö --------------------------------------------------------------------- 4.1 C¿Í ¾î¼Àºí¸®ÀÇ ¸µÅ©¿¡ ¾Õ¼­ ÇÑÆí, <¿¹Á¦ 2>¸¦ ÈȾ°í "´ëÃæ ±×·±°Å±¸³ª!"ÇÏ°í ÀÌÇØ°¡ °£´Ù¸é °ð ¹Ù·Î ÀÌ ±ÛÀÇ ÃÖÁ¾ ¸ñÇ¥ÀÎ C¿Í ¾î¼Àºí¸®ÀÇ ¸µÅ©¿¡ °üÇÑ À̾߱⸦ Ç®¾îµµ ¹«¸®°¡ ¾ø°ÚÁö¸¸, ³í¸®ÀÇ È帧À» À§ÇØ ÀÏ´ÜÀº ÇÔ¼ö È£Ãâ ¹æ½ÄÀ» ºñ·ÔÇÑ Á¦ ¹Ý »çÇ׿¡ ´ëÇÑ ¼³¸íÀÌ ¸ÕÀú ÀÖ¾î¾ß ÇÒ °Í °°´Ù. ¿ì¸®´Â C·Î ÇÁ·Î±×·¥À» © ¶§ ÇÔ¼ö¸í ´ÙÀ½¿¡ °ýÈ£¸¦ µÎ¸£°í ½Ç¸Å°³º¯ ¼öµéÀ» ³ª¿­Çϸé C ÄÄÆÄÀÏ·¯°¡ ±× ÇÔ¼ö¸¦ ¾Ë¾Æ¼­ Àû´çÇÑ ¹æ¹ýÀ¸·Î È£ÃâÇØ ÁֹǷΠ½ÇÁ¦·Î(¾î¼Àºí¸®¾î ¼öÁØ¿¡¼­) ÇÔ¼ö°¡ ¾î¶»°Ô È£ÃâµÇ´ÂÁö´Â »ç½Ç»ó ¾Ë ÇÊ¿ä°¡ ¾ø¾ú´Ù. ÇÏÁö¸¸ C¿Í ¾î¼Àºí¸®¸¦ ¸µÅ©ÇÏ·Á¸é ±× È£Ãâ ¹æ¹ýÀ» ¸ð ¸£°í¼­´Â ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö°¡ ¾ø´Ù. ¿Ö³Ä ÇÏ¸é ¾î¼Àºí¸® ·çƾÀº C ÄÄÆÄÀÏ ·¯¿Í º°°³ÀÇ Á¸ÀçÀ̱⠶§¹®ÀÌ´Ù. ¿©´ãÀÌÁö¸¸... ¿ì¸®°¡ ¼ù°¡¶ôÀ¸·Î ¹ä ÇÑ ¼úÀ» ¶ã ¶§ °ú¿¬ ¾î¶»°Ô ÇÏ°í ÀÖ´ÂÁö »ý°¢ÇØ º¸°í ¸Ô´Â »ç¶÷ÀÌ Àִ°¡? ¼ù°¡¶ôÀ» Áæ ¶§¿¡ ¾ó¸¶¸¶ÇÑ ¾Ð ·ÂÀ» °¡ÇØ¾ß ¼ù°¡¶ôÀÌ ¹Ì²ô·¯ ¶³¾îÁöÁö ¾Ê°í, ¼ù°¡¶ôÀ» ¸î ´ºÆ°ÀÇ ÈûÀ¸·Î ¾î¶² ¹æÇâ¿¡¼­ ¹äÇ® ´õ¹Ì¿¡ ¾¥¼Å ³Ö¾î¾ß ¼ù°¡¶ôÀÌ ¹äÇ® ´õ¹ÌÀÇ ÀúÇ×À¸·Î À̱â°í ÆÄ°íµé ¼ö Àִ°¡, ±×¸®°í ¼Õ¸ñ¿¡ ¾ó¸¶ ¸¸ÇÑ ¸ð¸àÆ®¸¦ °¡ÇØ¾ß ¼ù°¡ ¶ôÀÌ ¹äÀ» ÆÛ³¾ ¼ö ÀÖÀ¸¸ç, ÆÈ°ú ¼Õ¸ñÀ» ¸î ÀÚÀ¯µµ·Î ¾î¶°ÇÑ °æ·Î·Î ¾ó¸¶ ¸¸ÇÑ ¼Óµµ·Î À̵¿½ÃÄÑ¾ß ÃÖ´Ü ½Ã°£ ³»¿¡ ÆÛ³½ ¹äÀ» ´Ü ÇÑ Åç È긮Áö ¾Ê°í ¸ñÀûÁöÀÎ ÀÔ¿¡ Á¢±Ù½Ãų ¼ö Àִ°¡... °Ô´Ù°¡ ±×·± µ¿ÀÛÀ» ÃëÇϱâ À§ÇØ ´ë ³ú¿¡¼­ °¢ Á¶Á÷ÀÇ ½Å°æ ¼¶À¯¿¡ ¾î¶°ÇÑ Àü±âÀû ÆÞ½º¸¦ °¡ÇØ¾ß ÇÏ´À³Ä¿¡±îÁö ´Ù´Ù¸£¸é Á¤¸» ¹Øµµ ³¡µµ ¾ø´Ù. ÀÌ·± °É »ý°¢ÇØ º» ÀûÀÌ Àִ°¡ ¸»ÀÌ´Ù. ¹°·Ð °ÅÀÇ Àü¹«ÇÏ°ÚÁö. »ç¶÷À̶ó¸é ±×·± °Ç º»´ÉÀûÀ¸·Î "ÀÚ¿¬½º·´°Ô" ó¸® ÇÒ ¼ö ÀÖÀ» Å×´Ï ´ç¿¬ÇÏ´Ù. ÇÏÁö¸¸ ¸¸¾à¿¡ ¹ä ÇÑ ¼úÀ» ¶ß´Â ·Îº¸Æ® ÆÈÀ» ¸¸µç´Ù°í Çغ¸¶ó. ¾Æ´Ï¸é ½Ã¹Ä·¹À̼ǵµ ÁÁ´Ù. ±×·¸´Ù¸é ¾ê±â´Â ÀüÇô ´Þ¶óÁú °ÍÀÌ´Ù. ¿Ö³Ä ÇÏ¸é ·Îº¸ Æ®´Â º»´ÉÀ̶õ °Ô ¾øÀ¸´Ï±ñ. ±×·¯¹Ç·Î Á» Àü¿¡ ¾ð±ÞÇÑ ¸ðµç °ÍÀÌ ½É°¢ÇÑ °í·Á ´ë»óÀÌ µÈ´Ù. °á·ÐÀûÀ¸·Î ºÁ¼­ ±× ¹ä ÇÑ ¼ú ¶ß´Â ¾îÂ¸é ÇÏÂú°í °£ ´ÜÇÑ µ¿ÀÛÀ» Çؼ®Çϱâ À§ÇÏ¿© ¼ö½Ê ¼ö¹é¸íÀÇ ÃµÀç°¡ µ¿¿øµÇ¾î¾ß ÇÒ °ÍÀÌ ´Ù. ÀÌ°ÍÀ» C¿Í ¾î¼Àºí¸®ÀÇ °ü°è¿¡¼­µµ ±×·² µíÇÏ°Ô ºñÀ¯µÈ´Ù. C ¾ð¾î·Î ÇÁ·Î±×·¡¹ÖÇÒ ¶§¿¡´Â ³»ºÎÀûÀÎ º¹ÀâÇÑ Ã³¸®¸¦ C ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼­ "ÀÚ¿¬ ½º·´°Ô ÇØ°á(ÄÄÆÄÀÏ)"ÇØ ÁֹǷΠÀüÇô ´ë¼ö·ÓÁö ¾Ê°Ô »ý°¢µÇ´ø °ÍÀÌ, ¾î¼À ºí¸®·Î ÇÒ ¶§¿¡´Â ÇϳªºÎÅÍ ¿­±îÁö ¸ðµç °ÍÀ» ÇÁ·Î±×·¡¸Ó°¡ Ã¥ÀÓÁö°í ÇØ ³ª°¡¾ß ÇÑ´Ù. µû¶ó¼­ ¹ß»ýÇÏ´Â ¾î·Á¿î ÀÏÀÌ ÇѵΠ°¡Áö°¡ ¾Æ´Ï´Ù. ¹Ýµå½Ã ÁؼöÇØ¾ß ÇÒ ±ÔÄ¢µµ ºÎÁö±â¼öÀÌ°í, ¶ÇÇÑ ¹ú·¹Àâ´Â µ¥(µð¹ö±ë) µå´Â °íÃæµµ À̸¸Àú¸¸ÀÌ ¾Æ´Ï´Ù. ÀÌ·± Á¡À» ¿°µÎ¿¡ µÎ°í, C¿Í ¾î¼Àºí¸®ÀÇ ¸µÅ©¿¡´Â ÀÌó·³ ¾î·Á¿î ÀÏÀÌ »êÀûÇØ ÀÖ´Ù´Â °ÍÀ» ¹Ì¸® ÆľÇÇÑ µÚ¿¡ ÀÌ ±ÛÀ» ÀÐ¾î ³ª°£´Ù¸é, ¼¼¼¼ÇÏ°í ÂÉÁ¸ÇÑ ¼ö¸¹Àº ±ÔÄ¢µéÀ» ÀÍÈ÷´Â µ¥ µå´Â ºÎ´ã°¨Àº ¾î´À Á¤µµ ÁÙÀÏ ¼ö ÀÖÀ¸ ¸®¶ó º»´Ù. 4.2 ±Ù°Å¸® È£Ãâ(near call) ¸ÕÀú °¡Àå °£´ÜÇÏ°í °¡Àå ÀϹÝÀûÀÎ ±Ù°Å¸® È£Ãâ¿¡ °üÇÏ¿© ¾Ë¾Æº¸ÀÚ. ±Ù°Å¸® È£ÃâÀÇ °¡Àå Ư¡ÀûÀÎ Á¡Àº ÇÇÈ£Ãâ ÇÔ¼ö(±Ù°Å¸® ÇÔ¼ö)°¡ º»¿¬ÀÇ ÀÓ ¹«¸¦ ¼º°ø¸®¿¡ ¸¶Ä¡°í ¿ø·¡ ÀÚ½ÅÀ» È£ÃâÇß´ø ÇÔ¼ö·Î º¹±Í(¸®ÅÏ)ÇÒ ¶§, ½º ÅÃÀ¸·ÎºÎÅÍ "2¹ÙÀÌÆ®ÀÇ º¹±Í ¹øÁö"¸¦ ÃëÇÑ´Ù´Â °ÍÀÌ´Ù. ¾î¼Àºí¸® ÄÚµå·Î À̸¦ ³ªÅ¸³»¸é ´ÙÀ½°ú °°´Ù. * ±Ù°Å¸® ÇÔ¼ö(near function)ÀÇ Á¤ÀÇ PUBLIC _func _func PROC near ¡ç ±Ù°Å¸® ÇÔ¼öÀÓÀ» Ç¥½Ã ...... ret --- 2¹ÙÀÌÆ®ÀÇ º¹±Í ¹øÁö(IP)¸¦ ÃëÇÑ´Ù. _func ENDP * ±Ù°Å¸® È£Ãâ(near call) call near ptr _func | +-- ½ºÅÿ¡ 2¹ÙÀÌÆ®ÀÇ º¹±Í ¹øÁö¸¸À», Áï IP¸¸À» ´ëÇǽÃŲ´Ù. 4.3 ¿ø°Å¸® È£Ãâ(far call) ±× ´ÙÀ½À¸·Î ¿ø°Å¸® È£ÃâÀÇ °¡Àå Ư¡ÀûÀÎ Á¡Àº ÇÇÈ£Ãâ ÇÔ¼ö(¿ø°Å¸® ÇÔ¼ö)°¡ ÀÏÀ» ¸ðµÎ ³¡¸¶Ä¡°í º¹±ÍÇÒ ¶§, ½ºÅÃÀ¸·ÎºÎÅÍ "4¹ÙÀÌÆ®ÀÇ º¹±Í ¹ø Áö"¸¦ ÃëÇÑ´Ù´Â °ÍÀÌ´Ù. ¾î¼Àºí¸® ÄÚµå·Î À̸¦ ³ªÅ¸³»¸é ´ÙÀ½°ú °°´Ù. * ¿ø°Å¸® ÇÔ¼ö(far function)ÀÇ Á¤ÀÇ PUBLIC _func _func PROC far --- ¿ø°Å¸® ÇÔ¼öÀÓÀ» Ç¥½Ã ...... ret ---4¹ÙÀÌÆ®ÀÇ º¹±Í ¹øÁö(CS:IP)¸¦ ÃëÇÑ´Ù. _func ENDP * ¿ø°Å¸® È£Ãâ(far call) °°Àº ¸ðµâ ³»ÀÇ ÇÔ¼ö È£Ãâ½Ã ¡ç ÀÛÀº ±ÛÀÚü!! push cs call near ptr _func ´Ù¸¥ ¸ðµâ ³»ÀÇ ÇÔ¼ö È£Ãâ½Ã ¡ç ÀÛÀº ±ÛÀÚü call far ptr _func | +-- ½ºÅÿ¡ 4¹ÙÀÌÆ®ÀÇ º¹±Í ¹øÁö¸¦, Áï CS:IP¸¦ ´ëÇǽÃŲ´Ù. (ÁÖÀÇ)À§ÀÇ È£Ãâ ¹æ½ÄÀÌ ¾Æ·¡º¸´Ù ó¸® ¼Óµµ°¡ ºü¸§. ±×·¯³ª °á°ú´Â ¿ÏÀüÈ÷ µ¿µîÇÔ. 4.4 °Å´ë È£Ãâ(huge call) °Å´ë È£ÃâÀº ÇÔ¼ö È£Ãâ ¹æ¹ý¿¡ °üÇÑ ÇÑ »ç½Ç»ó ¿ø°Å¸® È£Ãâ°ú ¿ÏÀüÈ÷ µ¿ÀÏ(identical)ÇÏ´Ù. ´õ¿íÀÌ ¾î¼Àºí¸® ¼öÁØ¿¡¼­´Â "¹®¹ýÀûÀ¸·Î" ¿ø°Å¸® È£Ãâ°ú °Å´ë È£ÃâÀÌ ÀüÇô ±¸º°µÇÁö ¾Ê´Â´Ù. ´Ù¸¸ ¿ø°Å¸® È£Ãâ°úÀÇ Â÷ÀÌÁ¡À̶ó¸é ÇÇÈ£Ãâ ÇÔ¼ö(°Å´ë ÇÔ¼ö)°¡ ±× ¼± µÎ¿¡¼­ DSÀÇ °ªÀ» ÀÏ´Ü ´ëÇǽÃŲ ÈÄ¿¡, ÀÚ½ÅÀÌ ¼ÓÇØ ÀÖ´Â ¸ðµâÀÇ Á¤Àû µ¥ ÀÌÅÍ ¿µ¿ª ¼±µÎ·Î DS¸¦ º¯°æÇÑ´Ù´Â °ÍÀÌ´Ù. ±×·± ÈÄ ÀÏÀ» ¸ðµÎ ³¡¸¶Ä¡¸é ¿ø·¡ÀÇ DS °ªÀ» º¹±¸ÇÑ ´ÙÀ½ 4¹ÙÀÌÆ®ÀÇ º¹±Í ¹øÁö(CS:IP)¸¦ ÃëÇÏ¿© µÇµ¹¾Æ °£´Ù. ÀÌó·³ DS°¡ °íÁ¤ÀûÀÌÁö ¾Ê±â ¶§¹®¿¡ Åͺ¸ CÀÇ 6°³ ¸Þ¸ð¸® ¸ðµ¨ Áß ¿¡¼­ À¯ÀÏÇÏ°Ô 64k ÀÌ»óÀÇ Á¤Àû µ¥ÀÌŸ¸¦ ÃëÇÒ ¼ö ÀÖ´Â ¸ðµ¨ÀÌ µÇ´Â °ÍÀÌ ´Ù. ¾î¼Àºí¸® ÄÚµå·Î À̸¦ ³ªÅ¸³»¸é ´ë·« ´ÙÀ½°ú °°Àºµ¥, °Å´ë ÇÔ¼ö´Â ¾î ¼Àºí¸®¿ÍÀÇ ¸µÅ©¿¡¼­´Â ½ÇÁ¦·Î °ÅÀÇ ¾²ÀÌÁö ¾ÊÀ» °ÍÀ̹ǷΠ±×·±µ¥ ÀÖ±¸³ª ÇÏ´Â Á¤µµ·Î¸¸ ¾Ë¾Æ µÎ¸é µÉ °Í °°´Ù. * °Å´ë ÇÔ¼öÀÇ Á¤ÀÇ(ÀÛ¼º) PUBLIC _func _func PROC far ...... push ds mov ax, ¸ðµâ¸í_DATA mov ds,ax | ...... +-- ÇØ´ç ¸ðµâÀÇ Á¤Àû µ¥ÀÌÅÍ ¿µ¿ªÀÇ pop ds ¼±µÎ¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ. ...... ret _func ENDP * °Å´ë È£Ãâ(¿ø°Å¸® È£Ãâ°ú ¿ÏÀüÈ÷ µ¿ÀÏ) °°Àº ¸ðµâ ³»ÀÇ ÇÔ¼ö È£Ãâ½Ã push cs call near ptr _func ´Ù¸¥ ¸ðµâ ³»ÀÇ ÇÔ¼ö È£Ãâ½Ã call far ptr _func --------------------------------------------------------------------- 5 ±Ù°Å¸®/¿ø°Å¸®/°Å´ë ÇÔ¼öÀÇ ¼±¾ð(Á¤ÀÇ) --------------------------------------------------------------------- 5.1 ÇÔ¼ö ¼ö½ÄÀÚ near/far/huge Áö±Ý±îÁö´Â ¾î¼Àºí¸® ÄÚµå·Î ¿¹¸¦ µé¾ú´Âµ¥ C ¹®¹ýÀûÀ¸·Îµµ ±Ù°Å¸®/¿ø °Å¸®/°Å´ë ÇÔ¼ö¸¦ ¼±¾ð ¹× Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ±× ¹æ¹ýµµ °£´ÜÇؼ­, ÇÔ¼ö ¼± ¾ð ¶Ç´Â Á¤ÀÇ¿¡¼­ void, int, double µûÀ§ÀÇ ÇÔ¼öÇü ÁöÁ¤ÀÚ(type specifie r)¿Í ÇÔ¼ö¸í »çÀÌ¿¡ near/far/huge¶ó´Â ÇÔ¼ö ¼ö½ÄÀÚ(function modifier) ÁßÀÇ Çϳª¸¦ »ðÀÔÇÏ´Â °ÍÀ¸·Î ³¡³­´Ù. ¿¹¸¦ µé¾î <¿¹Á¦ 1>ÀÇ sum ÇÔ¼ö¸¦ ¿ø°Å¸® ÇÔ¼ö·Î Á¤ÀÇÇÏ·Á¸é ¾Æ·¡¿Í °°ÀÌ ¹Ù²Ù¸é µÈ´Ù. ´Ù¸¥ ¸ðµç»çÇ×Àº Æò»ó½Ã¿Í ¶È°°´Ù. * ¿ø°Å¸® ÇÔ¼öÀÇ Á¤ÀÇ int far sum(int n1, int n2) { ...... } * ¿ø°Å¸® ÇÔ¼öÀÇ ¼±¾ð int far sum(int n1, int n2); ÀϹÝÀûÀÎ °æ¿ì¿¡ near/far/huge µîÀÇ ÇÔ¼ö ¼ö½ÄÀÚ´Â ¾µ ÀÏÀÌ °ÅÀÇ ¾ø´Ù. ±×°ÍÀº ¸Þ¸ð¸® ¸ðµ¨¿¡ µû¶ó¼­ ÀûÀýÇÑ ÇÔ¼ö È£Ãâ ¹æ½ÄÀÌ ³»Á¤µÇ±â ¶§¹®ÀÌ ´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº Àú¹ø ´Þ¿¡ Áö·çÇϵµ·Ï ÀÚ¼¼È÷ ¼³¸íÇÑ ¹Ù ÀÖÀ¸¹Ç·Î »õ»ï ½º·´°Ô Àç·ÐÇÏÁö´Â ¾Ê°Ú´Ù. ´Ù¸¸ ´ëÇü ÄÚµå ¸ðµ¨¿¡¼­ ¼Óµµ»óÀÇ ¹®Á¦·Î ÀÎÇØ Æ¯º°È÷ ±Ù°Å¸® ÇÔ¼ö°¡ ÇÊ¿äÇÒ ÇÒ ¶§ near¸¦ ¾²±âµµ ÇÏ°í, ¹Ý¸é¿¡ Åͺ¸ C°¡ Á¦°øÇÏ´Â ±×·¡ÇÈ ÇÔ¼ö µé°ú °°ÀÌ ¼ÒÇü ÄÚµå ¸ðµ¨¿¡¼­µµ ¹Ýµå½Ã ¿ø°Å¸® È£ÃâÀ» Çؾ߸¸ ÇÏ´Â °æ¿ì ¿¡ ±× ¼±¾ð¹® µî¿¡ far¸¦ ±â¼úÇϱ⵵ ÇÔÀ» Âü°íÇϱ⠹ٶõ´Ù. Áö±Ý ´çÀå ÅÍ º¸ C ÂüÁ¶ ¾È³»¼­(¸Å´º¾ó)¸¦ º¸±â ¹Ù¶õ´Ù. ¾Æ¸¶ ±×·¡ÇÈ ÇÔ¼ö´Â ¸ù¶¥ ±× ¿ø Çü¿¡ far ¼ö½ÄÀÚ¸¦ Æ÷ÇÔÇÏ°í ÀÖÀ» °ÍÀÌ´Ù. µ¡ºÙ¿©¼­ ±×·¡ÇÈ ÇÔ¼ö´Â ¸Þ¸ð¸® ¸ðµ¨¿¡ »ó°ü¾øÀÌ ´Ü ÇÑ ¹ú¸¸ÀÌ ¸¶·ÃµÇ ¾î Àֱ⠶§¹®¿¡ ȣȯ¼ºÀ» À§ÇØ ¸ðµÎ ¿ø°Å¸® ÇÔ¼ö·Î¼­ ÀÛ¼ºµÇ¾î ÀÖ´Ù. 5.2 ¼±¾ð/Á¤ÀÇÇÒ ¶§ ÁÖÀÇÇÒ Á¡ ÇÑÆí, ÁÖÀÇÇÒ Á¡Àº ¹Ýµå½Ã ÇÔ¼ö¸í Á÷Àü¿¡ near/far/huge¸¦ »ðÀÔÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ´Ù¸¥ °÷¿¡ »ðÀÔÇÏ¸é ¼ö½ÄÀÚÀÇ Àǹ̰¡ ÀüÇô Ʋ·ÁÁø´Ù. ¿¹¸¦ µé¾î ¾Æ·¡ÀÇ ¼¼ ¼±¾ð¹®Àº ¼­·Î ¿ÏÀüÈ÷ ´Ù¸¥ Àǹ̸¦ °¡Áö°í ÀÖ´Ù. [1] char *far func1(void); [2] char far *func2(void); [3] char far *far func3(void); | | | +-- func3°¡ ¿ø°Å¸® ÇÔ¼öÀÓÀ» ³ªÅ¸³»´Â | ÇÔ¼ö ¼ö½ÄÀÚ(function modifier) +-- func3ÀÇ ¹Ýȯ°ªÀÌ ¿ø°Å¸® Æ÷ÀÎÅÍÀÓÀ» ³ªÅ¸³»´Â ¹øÁöÁöÁ¤ ¼ö½ÄÀÚ(addressing modifier) À§ÀÇ ¼±¾ðµéÀº °¢°¢ ¾Æ·¡¿Í °°Àº Àǹ̸¦ °¡Áö°í ÀÖ´Ù. [1] (³»Á¤µÈ Å©±âÀÇ) char *Çü Æ÷ÀÎÅ͸¦ º¹±ÍÇÏ´Â ¿ø°Å¸® ÇÔ¼ö func1À» ¼± ¾ð [2] char far *Çü Æ÷ÀÎÅ͸¦ º¹±ÍÇÏ´Â (³»Á¤µÈ È£Ãâ ¹æ½ÄÀÇ) ÇÔ¼ö func2¸¦ ¼±¾ð [3] char far *ÇüÀÇ Æ÷ÀÎÅ͸¦ º¹±ÍÇÏ´Â ¿ø°Å¸® ÇÔ¼ö func3¸¦ ¼±¾ð ¿©±â¼­ "³»Á¤µÈ Å©±â"¶õ ¼ÒÇü µ¥ÀÌÅÍ ¸ðµ¨¿¡¼­´Â ±Ù°Å¸® Æ÷ÀÎÅÍ, ±× ¹Û¿¡´Â ¿ø°Å¸® Æ÷ÀÎÅÍ·Î ³»Á¤µÊÀ» ¶æÇÏ°í, "³»Á¤µÈ È£Ãâ ¹æ½Ä"À̶õ ¼ÒÇü ÄÚµå ¸ðµ¨¿¡¼­´Â ±Ù°Å¸® ÇÔ¼ö, °Å´ë ¸ðµ¨¿¡¼­´Â °Å´ë ÇÔ¼ö, ±× ¹Û¿¡´Â ¿ø °Å¸® ÇÔ¼öÀÓÀ» ¶æÇÑ´Ù. ¼¼ °¡Áö ¼±¾ðÀÌ Àß ±¸º°µÇÁö ¾Ê´Â´Ù¸é, Ã¥À» Àá½Ã µ¤¾î µÎ°í À帶·Î ¿ìÁßÃæÇÑ ÇÏ´ÃÀ̳ª¸¶ Çѹø ¹°²ô·¯¹Ì ÃÄ´Ùº» µÚ¿¡ Àú¹ø ´Þ ±ÛºÎÅÍ Â÷ºÐÈ÷ ´Ù½Ã ÀÐ¾î º¸¸é ÀÚ¿¬½º·´°Ô ÀÌÇØ°¡ µÇ¸®¶ó º»´Ù. #51 ÀÓÀ롂 (turbo28 ) [°­ÁÂ] C±íÀº°÷3-2: ÇÔ¼ö È£Ãâ/C È£Ãâ °üÇà 05/06 00:13 437 line --------------------------------------------------------------------- 6 ¸Å°³º¯¼ö Àü´Þ ¹æ½Ä 2°¡ÁöÀÇ °³¿ä --------------------------------------------------------------------- À̻󿡼­´Â ÇÔ¼öÀÇ È£Ãâ/º¹±Í¶ó´Â °üÁ¡¿¡¼­ ÁÖ·Î ¼³¸íÀ» ÁøÇàÇß´Ù. ÀÌ ¹ø¿¡´Â ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ °ú¿¬ ½Ç¸Å°³º¯¼ö(actual parameter ¶Ç´Â argumen t)¸¦ ¾î¶°ÇÑ ¼ø¼­·Î ½ºÅÿ¡ ´ëÇÇ(ÀúÀå)½ÃÅ°´À³Ä ÇÏ´Â °üÁ¡¿¡¼­ ¼³¸íÀ» ÇÏ °Ú´Ù. Âü, ÇÔ¼ö¿¡ ¸Å°³º¯¼ö¸¦ Àü´ÞÇÏ´Â ¹æ¹ýÀ¸·Î¼­ °ÅÀÇ ´ëºÎºÐÀÇ °í±Þ ¾ð ¾î¿¡¼­ ½ºÅÃÀÌ È°¿ëµÈ´Ù´Â °ÍÂëÀº ÀÍÈ÷ ¾Ë°í ÀÖÀ¸¸®¶ó ¹Ï´Â´Ù. ÇÇÈ£Ãâ ÇÔ¼ö¿¡ ¸Å°³º¯¼ö¸¦ Àü´ÞÇÏ´Â ¼ø¼­´Â ¾Æ·¡¿Í °°ÀÌ µü 2°¡Áö ¹æ ¹ý¿¡ ÀÇÇÑ´Ù. +----------------------------------------+ | [1] C ¹æ½Ä ¸Å°³º¯¼ö Àü´Þ ¼ø¼­ | | C Parameter-Passing Sequence | | ¶Ç´Â C È£Ãâ °üÇà | | C Calling Convention | | | | [2] ÆĽºÄ®½Ä ¸Å°³º¯¼ö Àü´Þ ¼ø¼­ | | Pascal Parameter-Passing Sequence| | ¶Ç´Â ÆĽºÄ® È£Ãâ °üÇà | | Pascal Calling Convention | +----------------------------------------+ ÀÌ Áß¿¡¼­ ÈÄÀÚ´Â Åͺ¸ ÆĽºÄ®°°Àº °í±Þ ¾ð¾î¿ÍÀÇ ¸µÅ©¿¡¼­³ª ÇÊ¿äÇÑ °ÍÀ̹ǷΠÁö±Ý ´çÀåÀº ¾Ë¾Æ µÑ ÇÊ¿ä°¡ ¾ø´Ù. ¹Ý¸é¿¡ ÀüÀÚ´Â Åͺ¸ C(»ç½Ç»ó IBM-PC¿¡¼­ µ¹¾Æ°¡´Â ´ëºÎºÐÀÇ C)°¡ Ç¥ÁØ ¶óÀ̺귯¸® ÇÔ¼öµéÀ» ºñ·ÔÇÑ ¸ð µç ÇÔ¼öÀÇ È£ÃâÇÒ ¶§ÀÇ ³»Á¤(default)µÈ ¹æ½ÄÀ̹ǷÎ, C¿Í ¾î¼Àºí¸®ÀÇ ¸µÅ© ¸¦ À§Çؼ± ÀüÀÚÀÇ ¹æ½ÄÀ» ÇнÇÇÏ°Ô ÆľÇÇØ µÑ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ µÎ ¹æ½Ä°£ÀÇ °¡Àå Å« Â÷ÀÌÁ¡Àº ù°, ½Ç¸Å°³º¯¼ö¸¦ ½ºÅÿ¡ ÀúÀåÇÏ ´Â ¼ø¼­ÀÌ°í µÑ°, º¹±Í ÈÄ¿¡ ½ºÅà Æ÷ÀÎÅÍ SP°ªÀÇ º¹±¸¸¦ È£Ãâ ÇÔ¼ö¿Í ÇÇ È£Ãâ ÇÔ¼ö Áß ¾î´À ÂÊÀÌ ´ã´çÇÏ´À³Ä ÇÏ´Â °ÍÀÌ´Ù. µÎ¹ø° »çÇ×Àº °ð ¸Å°³ º¯¼öÀÇ °¹¼ö°¡ ÇÊ¿ä¿¡ µû¶ó °¡º¯ÀûÀÏ ¼öµµ ÀÖ´À³Ä ¾Æ´Ï¸é Ç×»ó °íÁ¤ÀûÀÌ³Ä ÇÏ´Â °ÍÀ» ÀǹÌÇϱ⵵ ÇÑ´Ù. Ãß°¡·Î ¾ÆÁÖ ±Ù¼ÒÇÏ°í º¸Åë ¹«½ÃÇÒ ¼ö Àִ ȣÃâ/º¹±Í ó¸® ¼ÓµµÀÇ Â÷À̵µ ÀÖ´Ù. ±×·¯¸é ÀÌÁ¦ºÎÅÍ C ¹æ½Ä ¸Å°³º¯¼ö Àü´Þ ¼ø¼­¿¡ ´ëÇÏ¿© Â÷ºÐÈ÷ ¾Ë¾Æº¸ ±â·Î ÇÏÀÚ. --------------------------------------------------------------------- 7 C ¹æ½Ä ¸Å°³º¯¼ö Àü´Þ ¼ø¼­ - C È£Ãâ °üÇà --------------------------------------------------------------------- ¿¹¸¦ µé¾î ¾Æ·¡¿Í °°Àº ¿øÇü(prototype)À» °¡Áø ÇÔ¼ö°¡ Á¤ÀÇ ¹× ¼±¾ð µÇ¾î ÀÖ´Ù°í Ä¡ÀÚ. ¿©±â¼­ ÇÔ¼ö º»Ã¼(body)´Â ¾Æ¹«·¡µµ »ó°ü¾ø´Ù. ÁÖ¸ñÇÒ °ÍÀº ¸Å°³º¯¼öÀÇ Àü´Þ ¹æ½ÄÀ̳ª±î. void funca(int p1, int p2, long p3); ³»Á¤ÀûÀ¸·Î Åͺ¸ C´Â C ¹æ½Ä ¸Å°³º¯¼ö Àü´Þ ¼ø¼­¿¡ ÀÇÇÑ´Ù. ÀÌ´Â ´Ù¸¥ ¸»·Î "C È£Ãâ °üÇà"À̶ó°íµµ ÈçÈ÷ ÀÏÄ´´Ù. À§ÀÇ ÇÔ¼ö funca°¡ ´ÙÀ½°ú °° ÀÌ È£ÃâµÇ¾úÀ» ¶§, void main(void) { funca(0x1122, 0x3344, 0x55667788); } È£Ãâ ÇÔ¼ö(Áï main)ÂÊÀÇ °¢ ½Ç¸Å°³º¯¼ö 0x1122, 0x3344, 0x55667788Àº "¸ð µÎ" ½ºÅÿ¡ ´ëÇÇ(ÀúÀå)µÈ´Ù. ÀÌ ¶§ ´ëÇÇ ¼ø¼­´Â "¿À¸¥ÂÊ->¿ÞÂÊ"ÀÓ¿¡ À¯ÀÇ Çϱ⠹ٶõ´Ù. ±×·± ´ÙÀ½¿¡ ¸¶Áö¸·À¸·Î º¹±Í ¹øÁö(return address)°¡ ½ºÅà ¿¡ ´ëÇÇµÈ ÈÄ funca·Î ÇÁ·Î±×·¥ Á¦¾î°¡ ¿Å°ÜÁø´Ù. ÀÚ, ±×·± ¿¬ÈÄ¿¡ ½ºÅÃÀº ¾î¶»°Ô µÇ¾úÀ»±î? Áï º¹±Í ¹øÁö°¡ ´ëÇÇµÈ " Á÷ÈÄ"¿¡ ¸»ÀÌ´Ù(º¹±Í ¹øÁö°¡ ´ëÇÇµÈ ÀÌÈÄ¿¡µµ È£Ãâ ±ÔÄ¢¿¡ µû¸¥ Ãß°¡ÀûÀÎ ´ëÇÇ°¡ °è¼ÓÇؼ­ À̾îÁö¹Ç·Î À¯ÀÇÇÒ °Í). <±×¸² 1-1> ±Ù°Å¸® È£Ãâ½Ã ½ºÅÃÀÇ ³»¿ë --------------------------------------------------------------------- »óÀ§ ¹øÁö ´ëÇÇ ¼ø¼­ | | SP + 8: 0x5566 -+- ¼¼¹ø° ½Ç¸Å°³º¯¼ö | | SP + 6: 0x7788 -+ | | SP + 4: 0x3344 --- µÎ¹ø° ½Ç¸Å°³º¯¼ö | | SP + 2: 0x1122 --- ù¹ø° ½Ç¸Å°³º¯¼ö | | SP + 0: º¹±Í ¹øÁö(2¹ÙÀÌÆ®) ÇÏÀ§ ¹øÁö --------------------------------------------------------------------- <±×¸² 1-2> ½ÇÁ¦ ½ºÅÃÀÇ »óȲ(¹ÙÀÌÆ® ´ÜÀ§ÀÇ ±¸Á¶) --------------------------------------------------------------------- SP SP+2 SP+4 SP+6 SP+8 +----------+---+---+---+---+---+---+---+---+ | º¹±Í¹øÁö | 22| 11| 44| 33| 88| 77| 66| 55| +----------+---+---+---+---+---+---+---+---+ --ÇÏÀ§ ¹øÁö »óÀ§ ¹øÁö-- --------------------------------------------------------------------- <±×¸² 1-3> ½ÇÁ¦ ½ºÅÃÀÇ »óȲ(¿öµå ´ÜÀ§ÀÇ ±¸Á¶) --------------------------------------------------------------------- SP 0x55667788 +-------------+ +----------+-------+-------+-------+-------+ | º¹±Í¹øÁö | 0x1122| 0x3344| 0x7788| 0x5566| +----------+-------+-------+-------+-------+ --ÇÏÀ§ ¹øÁö »óÀ§ ¹øÁö-- --------------------------------------------------------------------- <±×¸² 2> ¿ø°Å¸®/°Å´ë È£Ãâ½Ã ½ºÅÃÀÇ ³»¿ë --------------------------------------------------------------------- »óÀ§ ¹øÁö ´ëÇÇ ¼ø¼­ | | SP + 10: 0x5566 -+- ¼¼¹ø° ½Ç¸Å°³º¯¼ö | | SP + 8: 0x7788 -+ | | SP + 6: 0x3344 --- µÎ¹ø° ½Ç¸Å°³º¯¼ö | | SP + 4: 0x1122 --- ù¹ø° ½Ç¸Å°³º¯¼ö | | SP + 0: º¹±Í ¹øÁö(4¹ÙÀÌÆ®) ÇÏÀ§ ¹øÁö --------------------------------------------------------------------- ¿©±â¼­ ÁÖÀÇÇÒ Á¡Àº ù°, ½ºÅÃÀº »óÀ§ ¹øÁöÂÊ¿¡¼­ ÇÏÀ§ ¹øÁöÂÊÀ¸·Î ¼ºÀå(SP°¡ °¨¼Ò)ÇÑ´Ù´Â °ÍÀÌ°í µÑ°, 8086°è CPUÀÎ Å¿¿¡ 2¹ÙÀÌÆ® ÀÌ»óÀÇ Å©±â¸¦ °¡Áö´Â µ¥ÀÌŸ´Â ¿ª¿öµå(reverse word) ¹æ½Ä¿¡ ÀÇÇØ Ç×»ó ÇÏÀ§ ¹Ù ÀÌÆ®ºÎÅÍ ¸Þ¸ð¸®¿¡ Â÷·Ê´ë·Î ÀúÀåµÈ´Ù´Â Á¡ÀÌ´Ù. µû¶ó¼­ 4¹ÙÀÌÆ® Å©±âÀÇ ½Ç¸Å°³º¯¼öÀÎ 0x55667788Àº <±×¸² 1-2>¿¡¼­¿Í °°ÀÌ 0x88, 0x77, 0x66, 0x5 5ÀÇ ¼øÀ¸·Î ¸Þ¸ð¸®¿¡ ÀúÀåµÇ´Ï Âø¿À¾ø±â ¹Ù¶õ´Ù. ÀÚ, ÀÌÁ¦ C È£Ãâ °üÇà¿¡¼­ ¶Ç ÇϳªÀÇ Áß¿äÇÑ »ç½ÇÀ» ¼³¸íÇÏ°Ú´Ù. ±×°Í Àº ¹Ù·Î "ÇÇÈ£Ãâ ÇÔ¼ö´Â ½ºÅÿ¡ ´ëÇǵǾî ÀÖ´Â ½Ç¸Å°³º¯¼öÀÇ °³¼ö¸¦ ÀüÇô ¾Ë ¼ö°¡ ¾ø´Ù"´Â Á¡ÀÌ´Ù. Áï ¿øÄ¢ÀûÀ¸·Î ºÒ°¡´ÉÇÏ´Ù. ´ë½Å¿¡ ÇÇÈ£Ãâ ÇÔ¼öÀÇ ÀÔÀå¿¡¼­´Â "ÇÊ¿äÇÑ ¸¸Å­ÀÇ ½Ç¸Å°³º¯¼ö°¡ ´ëÇÇ µÇ¾î ÀÖ´Ù"°í °¡Á¤ÇÒ ¼ö¹Û¿¡ ¾ø´Ù. ¹Ù²ã ¸»ÇÏ¸é ½Ç¸Å°³º¯¼ö°¡ Çü½Ä¸Å°³º¯ ¼öÀÇ °³¼öº¸´Ù ¸ðÀÚ¶ó°Å³ª ³²¾Æµ¹´õ¶óµµ ÇÇÈ£Ãâ ÇÔ¼ö´Â µü ¸Â´Â °³¼ö¸¸Å­ ÀÌ ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡¼­ ¸ðµç ÀÏÀ» ó¸®ÇÑ´Ù. ÀÌ´Â C È£Ãâ °üÇàÀÇ °æ¿ì ÇÇÈ£Ãâ ÇÔ¼ö°¡ ¾Æ´Ñ È£Ãâ ÇÔ¼ö ÂÊ¿¡¼­ SPÀÇ º¹±¸¸¦ ´ã´çÇϱ⠶§¹®¿¡ ÆÄ»ýµÇ´Â °á°úÀÌ´Ù. Áï ½ºÅÿ¡ ´ëÇǵǾî ÀÖ´Â ½Ç ¸Å°³º¯¼öµé¸¸Å­ÀÇ º¹±¸(pop)¸¦ È£Ãâ ÇÔ¼ö ÂÊ¿¡¼­ ´ã´çÇÑ´Ù. ´ÙÀ½ <¸®½ºÆ® 2>ÀÇ ¸Ç ¸¶Áö¸· Çà¿¡ ÀÖ´Â add sp,8 ¸í·É¿¡ ÁÖ¸ñÇϱ⠹ٶõ´Ù. <¸®½ºÆ® 2> funca¸¦ È£ÃâÇÏ´Â ¾î¼Àºí¸® ÄÚµå --------------------------------------------------------------------- mov dx,21862 --- 0x5566 mov ax,30600 --- 0x7788 push dx --+------- ¸¶Áö¸· ½Ç¸Å°³º¯¼ö¸¦ ´ëÇÇ push ax --+ mov ax,13124 --- 0x3344 push ax ---------- µÎ¹ø°¸¦ ´ëÇÇ mov ax,4386 --- 0x1122 push ax ---------- ù¹ø°¸¦ ´ëÇÇ call near ptr _funca add sp,8 --- popÀ» 4¹ø ÇàÇÑ °Í°ú °°Àº È¿°ú¸¦ °¡Á®¿Â´Ù. --------------------------------------------------------------------- <¸®½ºÆ® 2>¸¦ º¸¸é ½ºÅÃÀÇ º¹±¸¸¦ È£Ãâ ÇÔ¼ö ÂÊ(main ÇÔ¼ö)¿¡¼­ ´ã´ç ÇÑ´Ù´Â °ÍÀ» ´«À¸·Î È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸»À» ¹Ù²Ù¸é ½ºÅÃÀÇ º¹±¸¸¦ ÇÇÈ£Ãâ ÇÔ¼ö ÂÊ¿¡¼­ ÇàÇϸé Àý´ë·Î ¾È µÈ´Ù°íµµ ÇÒ ¼ö ÀÖ´Ù. ÆĽºÄ®¿¡¼­ ¾î¼Àºí¸® ¸µÅ©¸¦ Çغ» µ¶ÀÚ´Â Çò°¥¸®Áö ¾Êµµ·Ï ƯÈ÷ Á¶½ÉÇØ¾ß ÇÑ´Ù. Áï re t ¸í·É¿¡ ¼ýÀÚ¸¦ ÁöÁ¤Çϸé Àý´ë·Î ¾È µÈ´Ù. Âü°í·Î ½ºÅÃÀ» º¹±¸ÇÒ ¶§ pop ¸í·ÉÀ» 4¹ø ¾²´Â ´ë½Å add sp,8À» ¾´ °Í Àº ó¸® ¼Óµµ»óÀÇ ÀÌÁ¡ ¶§¹®ÀÌ´Ù. <¸®½ºÆ® 1>¿¡¼­ add sp,4 ´ë½Å¿¡ pop ¸í ·ÉÀ» µÎ ¹ø ¾´ °Íµµ °°Àº ÀÌÀ¯¿¡¼­´Ù. <Ç¥ 1> C È£Ãâ °üÇà°ú ÆĽºÄ® È£Ãâ °üÇàÀÇ Â÷ÀÌÁ¡ -----------------+------------------+-------------------- | C È£Ãâ °üÇà | ÆĽºÄ® È£Ãâ °üÇà -----------------+------------------+-------------------- ¸Å°³º¯¼ö | ¿À¸¥ÂÊ¿¡¼­ ¿ÞÂÊ | ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊ Àü´Þ ¼ø¼­ | (¸¶Áö¸·ºÎÅÍ) | (ù¹ø°ºÎÅÍ) | | ½ºÅÃÀÇ º¹±¸ | È£Ãâ ÇÔ¼ö°¡ ´ã´ç | ÇÇÈ£Ãâ ÇÔ¼ö°¡ ´ã´ç | | ¸Å°³º¯¼öÀÇ °³¼ö | °¡º¯ÀûÀÏ ¼ö ÀÖÀ½ | Ç×»ó °íÁ¤Àû -----------------+------------------+-------------------- --------------------------------------------------------------------- 8 ¹Ýȯ°ª(return value)ÀÇ Ã³¸® --------------------------------------------------------------------- ÇÇÈ£Ãâ ÇÔ¼ö°¡ ÀÏÀ» ¸¶Ä¡°í º¹±ÍÇÒ ¶§ ¹Ýȯ°ªÀº °ú¿¬ ¾î¶°ÇÑ ¹æ½ÄÀ¸·Î ÀÚ½ÅÀ» È£ÃâÇÑ ÇÔ¼ö¿¡ µÇµ¹·Á ÁÙ±î? ±×°ÍÀº ¾Æ·¡¿Í °°Àº ±ÔÄ¢¿¡ ÀÇÇÑ´Ù. --------------------------------------------------------------------- [1] 2¹ÙÀÌÆ® Å©±â ÀÌÇÏÀÇ µ¥ÀÌÅÍÇü: AX¿¡ ÀúÀåÇÑ´Ù. char, unsigned char, int, unsigned, enum, ±Ù°Å¸® Æ÷ÀÎÅÍ µî [2] 4¹ÙÀÌÆ® Å©±âÀÇ µ¥ÀÌÅÍÇü: DX:AX¿¡ ÀúÀåÇÑ´Ù. (DX¿¡ »óÀ§ 2¹ÙÀÌÆ®¸¦, AX¿¡ ÇÏÀ§ 2¹ÙÀÌÆ®¸¦) long, unsigned long, ¿ø°Å¸® Æ÷ÀÎÅÍ, °Å´ë Æ÷ÀÎÅÍ µî [3] ºÎµ¿Çü: 80x87ÀÇ TOS ·¹Áö½ºÅÍ, Áï ST(0)¿¡ ÀúÀåÇÑ´Ù. ´Ü, 80x87À» ¿¡¹Ä·¹ÀÌÆ®ÇÏ´Â °æ¿ì ¿¡¹Ä·¹ÀÌÅÍÀÇ TOS ·¹Áö½ºÅÍ¿¡ ÀúÀåÇÑ´Ù. float, double, long double µî [4] ±¸Á¶Ã¼/°ø¿ëü¸¦ Åëä·Î ¸®ÅÏÇÏ´Â °æ¿ì: µû·Î Àü¿ëÀ¸·Î ¸¶·ÃµÈ Á¤Àû µ¥ÀÌÅÍ ¿µ¿ª¿¡ °á°ú¸¦ ÀúÀåÇÑ ´ÙÀ½ ±× ¿µ¿ªÀ» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ AX ¶Ç´Â DX:AX¿¡ ³Ö¾î µÇµ¹¿© ÁØ´Ù. --------------------------------------------------------------------- ´ë°³ÀÇ °æ¿ì ¾î¼Àºí¸®¿ÍÀÇ ¸µÅ©¿¡¼­ ÁÖ·Î ¾²ÀÌ´Â °ÍÀº ¾Æ¹«·¡µµ [1]¹ø ¶Ç´Â [2]¹ø ¹æ½ÄÀ̸ç, <¿¹Á¦ 2>¿¡¼­´Â [1]¹ø ¹æ½ÄÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. --------------------------------------------------------------------- 9 ÇÔ¼ö¸í¿¡ µ¡ºÙ´Â ¹ØÁÙ¹®ÀÚÀÇ ÀÇ¹Ì --------------------------------------------------------------------- Áö±Ý±îÁöÀÇ ¿¹Á¦µéÀ» º¸¸é C ¿ø½Ã ÄÚµåÀÇ ÇÔ¼ö¸í¿¡´Â ¾ÈºÙ´ø ¹ØÁÙ¹® ÀÚ°¡ ¾î¼Àºí¸® ÄÚµåÀÇ ÇÔ¼ö¸í ¾Õ¿¡ µ¡ºÙ¿©Á® ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °Í ÀÌ´Ù. ¿¹¸¦ µé¾î main ÇÔ¼öÀÇ ¾î¼Àºí¸® Äڵ忡´Â ±× ÇÔ¼ö¸íÀÌ _mainÀ¸·Î µÇ¾î ÀÖ´Ù. »ç½Ç Åͺ¸ C¿¡¼­´Â ÇÔ¼ö¸íÀÌ ¾î¼Àºí¸® ÄÚµå·Î ÄÄÆÄÀ쵃 ¶§¿¡ Ç×»ó ±× ¾Õ¿¡ ¹ØÁÙ¹®ÀÚ°¡ µ¡ºÙ¿©Áöµµ·Ï µÇ¾î ÀÖ´Ù. ±× ÀÌÀ¯´Â º¼·£µå¿¡¼­ °ø½ÄÀûÀ¸ ·Î ¹ßÇ¥ÇÑ ¹Ù ¾øÀ¸³ª, ÃßÃøÄÁ´ë Åͺ¸ CÀÇ ³»ºÎ ·çƾÀÌ Á÷Á¢ÀûÀ¸·Î È£ÃâµÇ ´Â °ÍÀ» ¸·±â À§ÇÑ °ÍÀ¸·Î º¸ÀδÙ. objxref.exe À¯Æ¿¸®Æ¼¸¦ ½á¼­ Åͺ¸ C Ç¥ÁØ ¶óÀ̺귯¸®¸¦ µÚÀû°Å·Á º¸ ¸é ´ë¼Ò¹®ÀÚ°¡ ¸¶±¸ ¼¯¿© ÀÖ´Â ±«»óÇÑ À̸§ÀÇ ÇÔ¼ö(½ÇÁ¦·Î´Â Á¤½Ä ÇÔ¼öµµ ¾Æ´Ô)µéÀÌ ¸¹ÀÌ º¸À̴µ¥ À̵éÀº ´ëºÎºÐ ¼±µÎ¿¡ ¹ØÁÙ¹®ÀÚ¸¦ °¡Áö°í ÀÖÁö ¾Ê´Ù. ±×°ÍÀº ¼Óµµ/Å©±â ¹®Á¦·Î ÀÎÇØ C È£Ãâ °üÇàÀ» ÁöÅ°Áö ¾ÊÀº ÀÏÁ¾ÀÇ ¾î¼Àºí¸® ¼­ºê·çƾÀ̱⠶§¹®ÀÌ´Ù. µû¶ó¼­ À̵éÀ» CÂÊ¿¡¼­ Á÷Á¢ È£ÃâÇϸé ÇÁ·Î±×·¥ÀÌ ÆøÁÖÇÏ°Ô µÇ¹Ç·Î ±×·¯Áö ¸øÇϵµ·Ï ¸ðµç C ÇÔ¼ö¸í¿¡´Â ÀÚµ¿ÀûÀ¸ ·Î ¼±µÎ¿¡ ¹ØÁÙ¹®ÀÚ°¡ µ¡ºÙµµ·Ï ÇÑ °Í °°´Ù. ¹°·Ð ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» Á¶Á¤ÇÏ¸é ¹ØÁÙ¹®ÀÚ¸¦ Á¦°ÅÇÒ ¼öµµ ÀÖÁö¸¸, ±×°Í Àº Åͺ¸ ÆĽºÄ®°ú ¸µÅ©ÇÒ ¶§¿¡³ª ÇÊ¿äÇÑ Á¶Ä¡À̹ǷΠÀÚ¼¼ÇÑ ¼³¸íÀº »ý·«ÇÏ °Ú´Ù. --------------------------------------------------------------------- 10 ¼ÒÇü ¸ðµ¨¿¡¼­ÀÇ ¸Þ¸ð¸® Áöµµ --------------------------------------------------------------------- Áö³­ ´Þ¿¡ ¼Ò°³Çß´ø ¸Þ¸ð¸® Áöµµ ¿¹Á¦¿¡ ´ëÇÑ ¼³¸íÀ» °è¼ÓÇÏÀÚ¸é ´ÙÀ½ °ú °°´Ù. * º¯¼ö ¼³¸í(¼ÒÇü ¸ðµ¨¿¡ ÇØ´çÇÏ´Â ³»¿ëÀÓ!!) _heaplen: ±Ù°Å¸® ÈüÀÇ ¹ÙÀÌÆ® Å©±â¸¦ ³ªÅ¸³½´Ù. 0ÀÇ °ªÀ» °¡Áö¸é µ¥ÀÌ ÅÍ ¼¼±×¸ÕÆ®ÀÇ Å©±â°¡ Á¤È®È÷ 64k¹ÙÀÌÆ®°¡ µÇµµ·Ï ±Ù°Å¸® Èü ÀÇ Å©±â°¡ ÀÚµ¿À¸·Î °áÁ¤µÈ´Ù. µû¶ó¼­ ±Ù°Å¸® ÈüÀÇ ÃÖ¼Ò Å©±â ´Â 1¹ÙÀÌÆ®°¡ µÈ´Ù. _stklen: ½ºÅà ¿µ¿ªÀÇ ¹ÙÀÌÆ® Å©±â¸¦ ³ªÅ¸³½´Ù. ³»Á¤Ä¡´Â 4k¹ÙÀÌÆ®(409 6)ÀÌ´Ù. ±×·¯³ª ÀÌ º¯¼ö°¡ ½ºÅÃÀÇ Å©±â¸¦ 4k¹ÙÀÌÆ®·Î Á¦ÇÑÇÏ Áö´Â ¸øÇÑ´Ù. ¿¹¸¦ µé¾î 4k¹ÙÀÌÆ®°¡ ³Ñ´Â ÀÚµ¿¹è¿­À» Á¤ÀÇÇØ µµ ½ÇÇà½Ã ¿¡·¯°¡ ³ªÁö ¾Ê´Â´Ù. ´Ù¸¸ _heaplen°ú ÇÔ²² µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®ÀÇ Å©±â¸¦ °áÁ¤ÇÏ´Â µ¥ ¾²ÀδÙ. _psp: PSPÀÇ ¼¼±×¸ÕÆ®°ªÀ» °¡Áø´Ù. PSP¿¡ °üÇÑ ¼³¸íÀº Áö¸é»ó »ý·« ÇÏ°Ú´Ù. ´Ù¸¸ ¿É¼Â 0x0002ÀÇ À§Ä¡¿¡ ¸Þ¸ð¸® ÃÖ»ó´ÜÀÇ ¼¼±×¸Õ Æ®°ª(640k ½Ã½ºÅÛ¿¡¼­´Â 0xa000)ÀÌ ÀúÀåµÇ¾î ÀÖ´Ù´Â °Í¸¸ ¾Ë ¾Æ µÎ¸é ÇÁ·Î±×·¥À» ÀÌÇØÇÏ´Â µ¥¿¡´Â º° ÁöÀåÀÌ ¾øÀ» °ÍÀÌ´Ù. __heapbase: ±Ù°Å¸® ÈüÀÇ ÃÖÇÏÀ§ ¹øÁö(Áï º£À̽º)¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. ¸»À» ¹Ù²Ù¸é Á¤Àû µ¥ÀÌÅÍ ¿µ¿ª Á÷Èĸ¦ °¡¸®Å°´Â Æ÷ÀÎÅͶó°íµµ ÇÒ ¼ö ÀÖ´Ù. __heaptop: ±Ù°Å¸® ÈüÀÇ ÇöÀç ÃÖ»ó´ÜÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. ÇÁ·Î±×·¥ ½ÇÇà Á÷ÈÄ¿¡´Â µ¿ÀûÀ¸·Î ±Ù°Å¸® ÈüÀÌ ÇÒ´çµÈ °ÍÀÌ Çϳªµµ ¾øÀ» ÅÍÀ̹ǷΠ__heapbase¿Í µ¿ÀÏÇÑ °ªÀ» °®´Â´Ù. _heapbase: ¿ø°Å¸® ÈüÀÇ ÃÖÇÏ´ÜÀ» °¡¸®Å°´Â ¿ø°Å¸® Æ÷ÀÎÅÍÀÌ´Ù. ¿ø°Å¸® ÈüÀº Ç×»ó ¼¼±×¸ÕÆ® °æ°è¿¡¼­ ½ÃÀÛÇϸç, ¶ÇÇÑ _heapbase´Â Á¤ ±ÔÈ­µÇ¾î ÀÖÀ¸¹Ç·Î ±× ¿É¼Â(ÇÏÀ§ 2¹ÙÀÌÆ®)Àº Ç×»ó 0x0000ÀÌ ´Ù. _heaptop: ¿ø°Å¸® ÈüÀÇ ÃÖ»ó´ÜÀ» °¡¸®Å°´Â ¿ø°Å¸® Æ÷ÀÎÅÍÀÌ´Ù. ÁÖÀÇÇÒ »çÇ×Àº __heaptop°ú´Â ´Þ¸® _heaptopÀº ¸Þ¸ð¸®ÀÇ ÃÖ»ó´ÜÀ» °¡ ¸®Å²´Ù´Â Á¡ÀÌ´Ù. µû¶ó¼­ 640k¹ÙÀÌÆ® ½Ã½ºÅÛ¿¡¼­´Â Ç×Ç× A00 0:0000ÀÇ °ªÀ» °®°Ô µÈ´Ù. Âü°í·Î __heapbase, __heaptop, _hearbase, _heaptop µîÀº Åͺ¸ C ¸Å ´º¾ó¿¡ ¼³¸íµÇ¾î ÀÖÁö ¾ÊÀ¸¸ç, _heaplen, _stklen, _psp´Â Turbo C Refere nce GuideÀÇ 28, 30, 29ÂÊ¿¡ »ó¼¼È÷ ¼³¸íµÇ¾î ÀÖ´Ù. ¶ÇÇÑ ¸Å´º¾ó¿¡ ¼³¸íµÇ¾î ÀÖÁö´Â ¾ÊÁö¸¸, _heaplen°ú _stklen º¯¼ö¿¡ °ªÀ» ÁöÁ¤ÇÒ ¶§¿¡´Â <¿¹Á¦ 3>ó·³ ¹Ýµå½Ã ¿ÜºÎº¯¼öÀÇ ÃʱâÈ­ Çü½ÄÀ̾î¾ß Çϴµ¥ ÁÖÀÇÇϱ⠹ٶõ´Ù. ÇÁ·Î±×·¥ ½ÇÇà ÈÄ ¾î¶² °ªÀ» ´ëÀÔÇÏ´Â °ÍÀº ¾Æ¹« Àǹ̵µ ¾ø´Ù. ±×°ÍÀº ±× º¯¼öµéÀ» ÂüÁ¶ÇÏ´Â ·çƾÀÌ main ÇÔ¼ö°¡ È£ÃâµÇ±â ÀÌÀüÀÇ ±âµ¿ ÄÚµå(startup code)À̱⠶§¹®ÀÌ´Ù. * ¼ÒÇü µ¥ÀÌÅÍ ¸ðµ¨¿¡¼­ µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®ÀÇ Å©±â¸¦ °áÁ¤ÇÏ´Â °ø½Ä void *ptr; unsigned DSsize; --- Æз¯±×·¡ÇÁ ´ÜÀ§ÀÇ Å©±â if (_heaplen == 0) DSsize = 0x1000; --- ȯ»êÇϸé 65536¹ÙÀÌÆ® else { ptr = (char *)__heapbase + _stklen + _heaplen; DSsize = ((unsigned)ptr >> 4) + 1; } Âü°í: ÀÌ °ø½ÄÀº ±âµ¿ ÄÚµå c0.asmÀ» ºÐ¼®Çؼ­ ¾òÀº °ÍÀÓ. * ·¥»óÁÖ ÇÁ·Î±×·¥(ÃʼÒÇü ¶Ç´Â ¼ÒÇü ¸ðµ¨)¿¡¼­ »óÁÖ Å©±â(keep size)¸¦ ±¸ÇÏ´Â °ø½Ä 2°¡Áö +- unsigned keepsize; --- »óÁÖ Å©±â +- unsigned CSsize; --- ÄÚµå ¼¼±×¸ÕÆ®ÀÇ Å©±â | +----------------------- Æз¯±×·¡ÇÁ ´ÜÀ§ keepsize = FP_SEG(_heapbase) - _psp; --- °¡Àå °£´ÜÇÑ °ø½Ä (¸ðµç ¸ðµ¨¿¡¼­ Åë¿ë) ¶Ç´Â(ÃʼÒÇü/¼ÒÇü ¸ðµ¨¿¡¼­) CSsize = _DS - _CS; --- ÃʼÒÇü ¸ðµ¨¿¡¼­´Â Ç×»ó 0 keepsize = 0x10 + CSsize +DSsize; | +-- PSPÀÇ Å©±â À§ÀÇ »óÁÖ Å©±â´Â ·¥»óÁÖ ÇÁ·Î±×·¥¿¡¼­ ¾Æ·¡¿Í °°ÀÌ ¾²ÀδÙ. keep(0, keepsize); ¸¸¾à _heaplenÀÌ 0(³»Á¤Ä¡)À̶ó¸é µ¥ÀÌÅÍ ¼¼±×¸ÕÆ®ÀÇ Å©±â°¡ 65536¹Ù ÀÌÆ®·Î °áÁ¤µÇ¹Ç·Î ±¸Å¿© º¹ÀâÇÑ °ø½Ä ¾µ ÇÊ¿ä ¾øÀÌ °£´ÜÇÏ°Ô keep(0, 0x 1000)À̶ó°í Çصµ µÈ´Ù. <¿¹Á¦ 3> ¼ÒÇü ¸Þ¸ð¸® ¸ðµ¨ÀÇ ¸Þ¸ð¸® Áöµµ --------------------------------------------------------------------- /* File MEMMODEL.C */ #include #include #include #pragma warn -par /* off warning */ unsigned _heaplen = 0x0001; /* minimum value */ /* if _heaplen == 0 or _heaplen is too large, this program will output wrong results */ unsigned _stklen = 0x0250; /* minimum value is 0x0200 when the software emulation for the floating point operation */ extern unsigned _psp; /* program segment prefix */ /* declared in dos.h */ extern void *__heapbase; /* a pointer to the near heap base */ extern void *__heaptop; extern void far *_heapbase; /* a pointer to the far heap base */ extern void far *_heaptop; void main(int argc, char *argv[], char **env) { unsigned CSsize; /* code segment size in paragraph(small model) */ unsigned DSsize; /* data segment size in paragraph */ unsigned StartingSP; /* initial value of SP */ unsigned farheap; /* segment of the far heap base pointer */ unsigned keepsize; /* calculated keep size in paragraph, i.e. total program size */ void *ptr; void far *topofmem; /* far pointer to the top of the memory */ CSsize = _DS - _CS; /* when small model */ ptr = (char *)__heapbase + _stklen + _heaplen; DSsize = ((unsigned)ptr >> 4) + 1; StartingSP = DSsize << 4; farheap = FP_SEG(_heapbase); /* get segment of the _heapbase */ keepsize = farheap - _psp; /* print the structure of the small memory model */ printf("Porgram segment prefix == %#06x\n", _psp); printf("Code segment == %#06x\n", _CS); printf("Data segment == %#06x\n", _DS); printf("Stack segment == %#06x\n", _SS); printf("Extra segment == %#06x\n", _ES); printf("Offset of static data area to DS == 0x0000\n"); printf("Offset of near heap base to DS == %#06x\n", __heapbase); printf("Offset of near heap top to DS == %#06x\n", __heaptop); printf("Current stack pointer == %#06x\n", _SP); /* print the initial value of SP calculated by three different methods */ printf("Initial value of SP == %#06x\n", StartingSP); printf(" == %#06x(other method)\n", (farheap - _DS) << 4); /* print the map of the far heap */ topofmem = MK_FP(*(unsigned far *)MK_FP(_psp, 0x0002), 0x0000); printf("Far heap base == %Fp\n", _heapbase); printf("Far heap top == %Fp\n", _heaptop); printf("Top of memory == %Fp\n\n", topofmem); /* print sizes */ printf("CS size == %#06x paragraph\n", CSsize); printf("DS size == %#06x paragraph(including stack)\n", DSsize); printf("Keep size == %#06x paragraph\n", keepsize); printf(" == %#06x(other method)\n", 0x10 + CSsize + DSsize); printf("Free space in near heap == %#06x byte(including stack area)\n", _SP - (unsigned)__heaptop + 1); printf("Free space in far heap == %ld byte\n", (unsigned long)(FP_SEG(_heaptop) - FP_SEG(_heapbase)) << 4); printf(" == %ld byte(other method)\n", (unsigned long)(FP_SEG(topofmem) - FP_SEG(_heapbase)) << 4); /* for a TSR program "keep(0, keepsize);" is required before quit program */ } --------------------------------------------------------------------- ½ÇÇà °á°ú (Åͺ¸ C 2.0¿¡¼­ ÄÄÆÄÀÏÇÏ¿© µµ½º ÇÁ·ÒÇÁÆ®»ó¿¡¼­ ½ÇÇà) Porgram segment prefix == 0x16c2 Code segment == 0x16d2 Data segment == 0x1822 Stack segment == 0x1822 Extra segment == 0x1822 Offset of static data area to DS == 0x0000 Offset of near heap base to DS == 0x076e Offset of near heap top to DS == 0x076e Current stack pointer == 0x098a Initial value of SP == 0x09c0 == 0x09c0(other method) Far heap base == 18BE:0000 Far heap top == A000:0000 Top of memory == A000:0000 CS size == 0x0150 paragraph DS size == 0x009c paragraph(including stack) Keep size == 0x01fc paragraph == 0x01fc(other method) Free space in near heap == 0x021d byte(including stack area) Free space in far heap == 554016 byte == 554016 byte(other method) --------------------------------------------------------------------- --------------------------------------------------------------------- 11 ´ÙÀ½¿¡´Â --------------------------------------------------------------------- º°·Î ÇÑ ¾ê±âµµ ¾ø´Âµ¥ ¹ú½á À̹ø ±ÛÀÇ ³¡¸ÎÀ½À» ÇÒ ¶§°¡ µÈ °Í °°´Ù. ÇѲ¨¹ø¿¡ ³Ê¹« ¸¹Àº ¾ê±â¸¦ Çϸé Áö·çÇÒ °Í °°¾Æ ÀÌÂë¿¡¼­ Àϴܶô Áö¾ú´Ù. ´ÙÀ½ ´Þ¿¡´Â À̹ø °­ÁÂÀÇ ÇÙ½ÉÀÎ C¿Í ¾î¼Àºí¸® ·çƾÀÇ Á¢¼Ó(interface)¿¡ ´ëÇÏ¿© º»°ÝÀûÀ¸·Î ¼³¸íÀ» ÇØ ³ª°¡°Ú´Ù.