[Áöµð³ÝÄÚ¸®¾Æ]°ú°Å 8051°ú °°Àº CPU ½ÃÀý°ú´Â ´Þ¸® ¿äÁò ³ª¿À´Â ÀÓº£µðµå Çü CPU´Â ARM, PowerPC, MIPS¿Í °°ÀÌ ÇÑ ¶§ À¯´Ð½º ¿öÅ©½ºÅ×À̼ǿ¡¼³ª »ç¿ëÇÏ´ø RISC ¹æ½ÄÀº ¹°·ÐÀ̰í CISC ¹æ½ÄÀÇ x86 Äھ Á¡Á¡ ´õ ¸¹ÀÌ »ç¿ëÇÑ´Ù. ¶§¹®¿¡ °ú°Å ¿öÅ©½ºÅ×À̼ǿ¡¼ »ç¿ëÇÏ´ø ÃÖÀûÈ ±â¹ý±îÁö ´Ù·ï¾ß ÇÏ´Â °æ¿ì°¡ Á¡Á¡ ´õ ´Ã¾î³ª±â ½ÃÀÛÇß´Ù. ÇÑ ¼ú ´õ ¶° ÀÓº£µðµå Àåºñ¿¡ µé¾î°¡´Â CPU ¼º´Éµµ ³¯·Î ³ô¾ÆÁö°í CPU Äھ °è¼ÓÇØ¼ ÆÇ¿Ã¸²À» °ÅµìÇϰí ÀÖ´Â Å¿¿¡ ÇÁ·Î±×·¡¹Ö ±â¹ýµéµµ ³¯·Î »õ·Î¿öÁö°í ÀÖ´Ù.
ÇÁ·Î±×·¡¹Ö ºÐ¾ß¿¡¼ ¡®ÃÖÀûÈ¡¯¸¸Å ´Ù¾çÇÑ Àǹ̷Π»ç¿ëµÇ´Â ´Ü¾îµµ µå¹° °ÍÀÌ´Ù. ÃÖÀûȶõ °³¹ß ¸ñÀû°ú »ç¿ëÇÏ´Â ¾ð¾î, ¾ÖÇø®ÄÉÀ̼ÇÀÇ Æ¯Â¡ µî¿¡ µû¶ó ¸ðµÎ ´Ù¸¥ Àǹ̷Π»ç¿ëµÇ´Â Å¿ÀÌ´Ù. ´Ù¸¸ ±× Çٽɸ¸Àº ´ëºÎºÐ ºñ½ÁÇÏ´Ù.
ÇÁ·Î±×·¡¹Ö ºÐ¾ßÀÇ ÃÖÀûÈ´Â ¿ä±¸ »çÇ×À» ÃæÁ·½ÃŰÁö ¸øÇÏ´Â ¼ÒÇÁÆ®¿þ¾î¸¦ °³¼±Çؼ ¿øÇÏ´Â °á°ú¸¦ ¾òµµ·Ï ÇÏ´Â ÀÛ¾÷À̶ó´Â Á¡¿¡¼ µ¿ÀÏÇϱ⠶§¹®ÀÌ´Ù. ÇѸ¶µð·Î °³¹ßÀÚ³ª ȯ°æ¿¡ µû¶ó ÃÖÀûÈÀÇ Àǹ̴ Á¦°¢±â ´Þ¶óÁöÁö¸¸, ÃÖÀûÈÀÇ Á߽ɿ¡´Â¡®¼Óµµ¡¯¿Í ¡®Å©±â¡¯°¡ ÀÖ´Ù.
ÇÏÁö¸¸ ÀÌ ¶ÇÇÑ ½Ã´ë°¡ ¹Ù²ñ¿¡ µû¶ó Á¶±Ý¾¿ ´Þ¶óÁö°í ÀÖ´Ù. ½Ã´ë°¡ ¹Ù²î¸é¼ CPUÀÇ ¼º´ÉÀÌ ÁÁ¾ÆÁö°í ¸Þ¸ð¸®ÀÇ ¿ë·® ¶ÇÇÑ ´Ã¾î³ª´Â ´ö¿¡ Á¤·®ÀûÀÎ ¡®¼Óµµ¡¯¿Í ¡®Å©±â¡¯°¡ Â÷ÁöÇÏ´Â Àǹ̰¡ ÀÛ¾ÆÁö´Â Å¿ÀÌ´Ù. ´ë½Å ¡®»ç¿ë ÆíÀǼº¡¯°ú ¡®Áñ°Å¿î °æÇ衯 °°Àº ¿ä¼Ò°¡ Áß¿äÇØÁö°í ÀÖ´Ù.
ÀÌ·± »óȲÀº ¾îµð±îÁö³ª ÇÁ·Î±×·¡¹Ö Àü¹Ý¿¡ ´ëÇÑ °ÍÀÏ »Ó ÀÓº£µðµå ¼ÒÇÁÆ®¿þ¾î´Â Á» ´õ º¹ÀâÇÑ Á¦¾à Á¶°ÇÇÏ¿¡¼ °³¹ßµÇ´Â Å¿¿¡ ¿©ÀüÈ÷ ¼Óµµ¿Í Å©±â°¡ Áß¿äÇÑ ¿ªÇÒÀ» Â÷ÁöÇÑ´Ù.
ÀÏ¹Ý µ¥½ºÅ©Åé PC³ª ¿öÅ©½ºÅ×À̼ǰú´Â ´Þ¸® ÀÓº£µðµå Àåºñ¿¡ µé¾î°¡´Â CPU´Â ¼º´Éµµ ¶³¾îÁö°í ¸Þ¸ð¸®(·¥À̳ª Ç÷¡½Ã) ¿ë·®µµ Àû´Ù. ¶§¹®¿¡ ¼öÇà ¼Óµµ, ¹ÝÀÀ ¼Óµµ, ½Ç½Ã°£ ¼º´É, ½ÇÇà Àü Æß¿þ¾î À̹ÌÁö Å©±â¿Í ½ÇÇà Áß ÇÁ·Î¼¼½º À̹ÌÁö Å©±â¸¦ È®º¸Çϱâ À§ÇØ ÀûÀÝÀº °øÀ» µé¿©¾ß ÇÑ´Ù.
¹°·Ð ¼Óµµµµ ºü¸£¸é¼ À̹ÌÁö Å©±âµµ ÀÛÀº ¿ä±¸ »çÇ×À» µ¿½Ã¿¡ ÃæÁ·ÇÒ ¼ö´Â ¾ø´Ù. ¾î´À ÇÑÂÊÀ» Èñ»ýÇØ¼ ´Ù¸¥ ÇÑÂÊÀ» »ì·Á¾ß ÇÑ´Ù. ÀÌ·± °úÁ¤¿¡¼ ƯÁ¤ Çϵå¿þ¾î¿¡ ´ëÇØ ¾ó¸¶³ª ±ÕÇüÀ» Àß ¸ÂÃß´À³Ä¿¡ µû¶ó ÀÓº£µðµå ¼ÒÇÁÆ®¿þ¾î °³¹ß ½ÂÆÐ°¡ ÆÇ°¡¸§ ³ª´Â °æ¿ìµµ ÀÖ´Ù.
5ºÎ´Â ÀÌ·± ¹è°æÀ» ¿°µÎ¿¡ µÎ°í ÀÓº£µðµå ºÐ¾ß¸¦ Áß½ÉÀ¸·Î ³Î¸® »ç¿ëµÇ´Â ARM(Advanced RISC Machine)°ú ÆÄ¿öPC °è¿ CPU¸¦ Åä´ë·Î C¿Í ¾î¼Àºí¸® ¾ð¾î Ư¼ºÀ» Ȱ¿ëÇØ¼ È¿°úÀûÀÎ ¼ÒÇÁÆ®¿þ¾î¸¦ Á¦ÀÛÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº»´Ù. ¿©±â¼ ÁÖÀÇ »çÇ×ÀÌ Çϳª Àִµ¥, ¿ö³« º¯¼ö°¡ ¸¹Àº ¾Ë°í¸®Áò°ú ƯÁ¤ ÄÄÆÄÀÏ·¯ ¹öÀü¿¡ µû¸¥ ÃÖÀûÈ Æ¯¼ºÀº ¼³¸í¿¡¼ Á¦¿ÜÇÑ´Ù.
 | ÃÖÀûÈÀÇ ±âÃÊ¿Í À߸øµÈ »ó½Ä |  |
¼¼°è ÃÖÃÊÀÇ 64ºñÆ® CPU·Î µîÀåÇÑ ¾ËÆÄ(21x64 ½Ã¸®Áî)¸¦ ¼³°èÇÒ ´ç½Ã¿¡ ÇÙ½ÉÀûÀÎ ÆÀÀ» ³× °³·Î ³ª´©¾ú´Âµ¥, ±× Áß¿¡ ¼ÒÇÁÆ®¿þ¾î ÆÀÀÌ Çϳª ³¢¾îÀÖ¾ú´Ù.
³î¶ø°Ôµµ ÀÌ ÆÀÀÌ ´ã´çÇÑ ¾÷¹«´Â ¹Ù·Î ¾ËÆÄ¿¡ ÃÖÀûÈµÈ ÄÄÆÄÀÏ·¯¸¦ Á¦ÀÛÇÏ´Â °ÍÀ̾ú´Ù. ³ôÀº Ŭ·° Á֯ļö·Î ¿òÁ÷ÀÌ´Â CPU¸¦ Á¦ÀÛÇÏ´Â °úÁ¤¿¡¼ Á¶±ÝÀÌ¶óµµ Çϵå¿þ¾îÀÇ º¹À⼺À» ÁÙÀ̱â À§ÇØ ÃÖ´ëÇÑ ´Ü¼øÇϰÔCPU¸¦ ¼³°èÇß´Ù. ¿øÇÏ´Â ¼º´ÉÀ» ¾ò±â À§ÇÑ ³ë·ÂÀ» ¼ÒÇÁÆ®¿þ¾î(Áï ÄÄÆÄÀÏ·¯)·Î ¶°³Ñ±ä °ÍÀÌ´Ù.
ÀÌ·± º¯È´Â Ĩ Á¦Á¶»ç°¡ °¡Àå °ñ¸Ó¸®¸¦ ¾Î´Â ºÎºÐÀÌ Çϵå¿þ¾î ºÎ¹®¿¡¼ ¼ÒÇÁÆ®¿þ¾î ºÎ¹®À¸·Î ¹Ù²î¾î ¹ö¸° ¿ª»çÀûÀÎ ÀüȯÁ¡À¸·Î »ý°¢Çصµ µÉ Á¤µµÀÌ´Ù.
ÁÖ·Î CISC(Complex Instruction Set Computer) ±â¹ÝÀ¸·Î ¼³°èµÈ CPU¸¦ ´Ù·ç´ø ÇÁ·Î±×·¡¸Ó´Â ¼ÕÀ¸·Î ÃÖÀûÈÇÑ ¾î¼Àºí¸® Äڵ尡 ¿ùµîÈ÷ ¶Ù¾î³ª´Ù°í »ý°¢Çϱ⠽±´Ù.
ÇÏÁö¸¸, RISC(Reduced Instruction Set Computer) ȯ°æÀ̳ª RISC¿Í CISC¸¦ °áÇÕÇÑ CPU¿¡¼´Â ±×´ÙÁö Å« Â÷À̰¡ ³ªÁö ¾Ê´Â´Ù. ¾î¶² °æ¿ì¿¡´Â ÄÄÆÄÀÏ·¯°¡ »ç¶÷º¸´Ù ´õ ¿ì¼öÇÑ ±â°è¾î Äڵ带 »ý¼ºÇϱ⵵ ÇÑ´Ù. ¿¬±¸¿¡ µû¸£¸é ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â µ¥ °É¸° ½Ã°£Àº ÇÁ·Î±×·¡¹Ö ¾ð¾î¿Í »ó°ü¾øÀÌ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ ÇàÀÇ ¼ö¿¡ ºñ·ÊÇÑ´Ù.
±×·¯¹Ç·Î ±× ¸¸Å ¸¹Àº ÇàÀ» ´ã°í ÀÖ´Â ¾î¼Àºí¸®¾î ÇÁ·Î±×·¥Àº »ý»ê¼ºÀÌ ³·À» ¼ö¹Û¿¡ ¾ø´Âµ¥, ÃÖÁ¾ °á°ú¹°¸¶Àú C ¾ð¾î¿Í °°Àº °í±Þ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿Í ºñ½ÁÇÏ´Ù¸é ¶È °°Àº ÀÏÀ» Çϱâ À§ÇØ ½Ã°£°ú ³ë·Â¸¸ ³¶ºñÇÑ ¼ÀÀÌ µÈ´Ù.
¼º´ÉÀÌ Àǽɽº·¯¿ï °æ¿ì ¼öµ¿ ÃÖÀûȸ¦ Çϱâ ÀÌÀü¿¡ ¿ì¼± ÄÄÆÄÀÏ·¯°¡ »ý¼ºÇÑ Äڵ尡 Á¤¸» ÃÖÀûÀÎÁö ¾Æ´ÑÁö¸¦ °¡·Á³»¾ß Çϸç, ÇöÀç »óÅ¿¡¼ ¾ó¸¶³ª °³¼±ÀÌ °¡´ÉÇÑÁö Æò°¡ÇØ¾ß ÇÑ´Ù.
¶ÇÇÑ ¼º´ÉÀÌ Áß¿äÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ °æ¿ì ¾ÆÅ°ÅØÃ³¿¡ ¸ÂÃç ÄÄÆÄÀÏ·¯°¡ ÇØ´ç ¾Ë°í¸®ÁòÀ» À§ÇÑ ÃÖÀûÀÇ Äڵ带 »ý¼ºÇϵµ·Ï ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼ ÃÖÀûÈµÈ Äڵ带 »ý¼ºÇϱ⸦ ±â´ëÇØ¼´Â ¾È µÈ´Ù´Â ¸»ÀÌ´Ù.
 | ±¸Ã¼ÀûÀÎ ÃÖÀûÈ ±â¹ý ¼Ò°³ |  |
ÀÚ ±×·³ ÀÌÁ¦ºÎÅÍ C ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ Ȱ¿ëÇÑ º»°ÝÀûÀÎ ÃÖÀûÈ ±â¹ýÀ» »ìÆìº¸±â·Î ÇÏÀÚ. ¿ì¼± ABI(Application Binary Interface)¸¦ »ç¿ëÇÑ ÃÖÀûÈ ±â¹ýºÎÅÍ ¼Ò°³ÇÑ´Ù. ¿©±â¿¡¼ ¸ÕÀú ¤°í ³Ñ¾î°¡¾ß ÇÒ °ÍÀº ÄÄÆÄÀÏ·¯°¡ ÁÁ¾ÆÇÏ´Â ¹æ½ÄÀ¸·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ¾ß ÃÖÀûȸ¦ ´Þ¼ºÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.
±×·³ ¾î¶»°Ô ÇØ¾ß ÄÄÆÄÀÏ·¯°¡ ÁÁ¾ÆÇÏ´Â ¹æ½ÄÀÇ ÇÁ·Î±×·¥ÀÌ µÇ´Â °ÍÀϱî? º¹ÀâÇÑ ¾î¼Àºí¸®¾î·Î ÄÚµùÀ» ÇÏÁö ¾Ê´õ¶óµµ ÇÁ·Î±×·¥ ÀÛ¼º °úÁ¤¿¡¼ Á¶±Ý¸¸ °øÀ» µéÀÌ¸é ±×·²µíÇÑ È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ´Â ±ÔÄ¢µéÀÌ ÀÖ´Ù. ¿©±â¿¡¼´Â °¡Àå ¹ü¿ëÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ¸î °¡Áö ±âº» ±ÔÄ¢ µé¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.
ABI¿Í ÃÖÀûÈ
ABI(Application Binary Interface)´Â ÀÀ¿ë ÇÁ·Î±×·¥°ú ¿î¿µÃ¼Á¦, ÀÀ¿ë ÇÁ·Î±×·¥°ú ¶óÀ̺귯¸® »çÀÌ¿¡ ÇÊ¿äÇÑ Àú ¼öÁØ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÑ´Ù. ¶Ç, ¸ñÀû ÆÄÀϰú °ü·ÃµÇ¾î ÀÖ¾î ¿ø½Ã ÄÚµå ÄÄÆÄÀÏ °úÁ¤¿¡ °³ÀÔÇÏ´Â API(Application Programming Interface)º¸´Ù Àú¼öÁØÀÌ´Ù.
ABI´Â ¾ÆÅ°ÅØÃ³¿Í ¿î¿µÃ¼Á¦¸¶´Ù Á¶±Ý¾¿ Â÷À̰¡ ÀÖÀ¸¸ç, Àμö Àü´Þ ¹æ¹ý°ú ¹Ýȯ °ª Àü´Þ ¹æ¹ýÀ» Æ÷ÇÔÇÑ ÇÔ¼ö È£Ãâ ±Ô¾àÀ» Á¤ÀÇÇÑ´Ù.
°í¼öÁØ¿¡¼ »ý°¢Çغ¸¸é ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â ÀÌÀ¯´Â °øÅëµÈ ºÎºÐÀ» ÇÑ °÷¿¡ ¸ð¾Æ¼ Áߺ¹ÀÌ µÇÁö ¾Êµµ·Ï ¸¸µé¾î ÄÚµåÀÇ À¯Áö º¸¼ö¼ºÀ» ³ôÀ̴µ¥ ÀÖ´Ù. Àú¼öÁØ¿¡¼ÀÇ ÇÔ¼ö´Â ÄÚµåÀÇ Å©±â¸¦ ÁÙÀÌ¸é¼ ¿¬°üµÈ Äڵ带 ÇÑ °÷¿¡ ¸ð¾Æ Áö¿ª¼ºÀ» ³ôÀÓÀ¸·Î½á ij½Ã ÀûÁß·üÀ» ³ôÀÌ´Â °úÁ¤¿¡ µµ¿òÀ» ÁØ´Ù.
±×·¸´Ù¸é ¸¸ÀÏ ÇÔ¼ö º»Ã¼ ±æÀ̰¡ ±æ¾î¼ ÄÄÆÄÀÏ·¯°¡ ÇÔ¼ö º»Ã¼¸¦ È£ÃâÇÑ °÷¿¡ ÀζóÀÎÀ¸·Î È®ÀåÇÏÁö ¸øÇÏ¿© Ãß°¡ÀûÀÎ ¼Ó·Â °³¼±ÀÌ ÇÊ¿äÇÏ´Ù¸é ¾î¶»°Ô ÇØ¾ß ÇÒ±î? ÀÌ ¶§ ABI ±ÔÄ¢À» ¾Ë°í ÀÖ´Ù¸é »ó´çÈ÷ À¯¸®ÇÏ´Ù. ¾Õ¼ ABI°¡ ¾ÆÅ°ÅØÃ³¸¶´Ù ´Ù¸£´Ù°í ÇßÀ¸¹Ç·Î ¿©±â¼´Â ARM°ú ÆÄ¿öPC·Î ³ª´©¾î »ý°¢Çغ¸ÀÚ.
¡Ü ARM
ARM ABI Á¤ÀÇ ±ÔÄ¢ÀÎ APCS(ARM Procedure StandardCall)¿¡ µû¸£¸é ÄÄÆÄÀÏ·¯´Â ÇÔ¼ö·Î ³Ñ±â´Â Àμö¸¦ ´ã´Â ·¹Áö½ºÅÍ ³× °³¸¦(a1~a4) ÇÒ´çÇÑ´Ù. Áï Ç¥ÁØ C·Î ÇÔ¼ö¸¦ ¼±¾ðÇÒ ¶§ Àμö¸¦ ³× °³ ÀÌÇÏ·Î À¯ÁöÇÒ °æ¿ì Àμö¸¦ ³Ñ±â±â À§ÇØ ½ºÅÃÀ» »ç¿ëÇÏÁö ¾Ê°í ·¹Áö½ºÅ͸¸ »ç¿ëÇÏ°Ô µÇ¹Ç·Î »ó´çÇÑ ¼Óµµ °³¼±ÀÇ È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
¡Ü ÆÄ¿öPC
ÆÄ¿öPC 32ºñÆ® ABI¿¡ µû¸£¸é ÀÏ¹Ý º¯¼ö¸¦ À§ÇØ ·¹Áö½ºÅÍ R3¿¡¼ R10¹ø±îÁö¸¦ »ç¿ëÇϰí, ºÎµ¿¼Ò¼öÁ¡ º¯¼ö¸¦ À§ÇØ F1¿¡¼ F8±îÁö¸¦ »ç¿ëÇÑ´Ù. µû¶ó¼ Ç¥ÁØ C·Î ÇÔ¼ö¸¦ ¼±¾ðÇÒ ¶§ Àμö¸¦ ¿©´ü °³ ÀÌÇÏ·Î À¯ÁöÇÑ´Ù¸é ¼Óµµ¸¦ °³¼±ÇÒ ¼ö ÀÖ´Ù.
¹°·Ð Àμö¸¦ ·¹Áö½ºÅÍ·Î ³Ñ±â´Â ¹æ½ÄÀÌ ´Ã °¡´ÉÇÑ °ÍÀº ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î, °¡º¯ ±æÀÌ Àμö(va_arg)¸¦ »ç¿ëÇÒ °æ¿ì¿¡´Â ¾î¿ ¼ö ¾øÀÌ ½ºÅÿ¡ Àμö¸¦ Áý¾î³Ö¾î¾ß ÇÑ´Ù. µû¶ó¼ ¼Óµµ °³¼±ÀÌ ÇÊ¿äÇÏ´Ù¸é °¡º¯ ±æÀÌ Àμö¸¦ °íÁ¤ ±æÀÌ Àμö·Î º¯°æÇØ¾ß ÇÑ´Ù.
¶ÇÇÑ ·¹Áö½ºÅÍ ±æÀ̸¦ ÃʰúÇÏ´Â °æ¿ì(¿¹: ±¸Á¶Ã¼¸¦ Àμö·Î ³Ñ±ä´Ù)¿¡µµ ·¹Áö½ºÅÍ¿Í ½ºÅÃÀ¸·Î ³ª´µ¾îÁ®¼ Àμö¸¦ Àü´ÞÇÏ°Ô µÇ¹Ç·Î ÀÌ Á¡µµ °í·Á ´ë»ó¿¡ ³Ö¾î¾ß ÇÑ´Ù.
ÇÔ¼ö È£Ãâ °úÁ¤¿¡¼ ·¹Áö½ºÅ͸¦ »ç¿ëÇÑ´Ù°í ÇØ¼ Å©°Ô ¼Óµµ°¡ ³ô¾ÆÁöÁö ¾ÊÀ» °Íó·³ º¸ÀÏÁöµµ ¸ð¸¥´Ù. ÇÏÁö¸¸ ÇÔ¼ö È£ÃâÀÌ ¼ö½Ê¸¸ ¹ø¿¡ °ÉÃÄ ÀÏ¾î³´Ù°í °¡Á¤ÇÒ ¶§ Äڵ塮ũ±â¡¯ÃÖÀûÈ ¶§¹®¿¡ ÀζóÀÎÀ̳ª ¸ÅÅ©·Î°¡ ºÒ°¡´ÉÇÑ »óȲ¿¡¼ ¼Óµµ ÃÖÀûȸ¦ °¡Àå ¸ÕÀú ´Þ¼ºÇÏ´Â ÁÁÀº ¼ö´ÜÀÌ µÉ ¼ö ÀÖ´Ù.
 | ´Ù¸¥ CPU¿¡¼ÀÇ ÃÖÀûÈ ÀÛ¾÷ ¼öÇà |  | |  | |
|
ºñ´Ü ARMÀ̳ª ÆÄ¿öPC »Ó¸¸ ¾Æ´Ï¶ó MIPSµµ Àμö Àü´Þ¿¡ ·¹Áö½ºÅÍ ³×°³¸¦ »ç¿ëÇϸç, x86_64µµ Àμö Àü´Þ¿¡ ·¹Áö½ºÅÍ ¿©¼¸ °³¸¦ »ç¿ëÇÑ´Ù.
x86ÀÇ °æ¿ì ABI ¼öÁØ¿¡¼´Â ±âº»ÀûÀ¸·Î ½ºÅø¸ »ç¿ëÇØ¼ Àμö¸¦ Àü´ÞÇϵµ·Ï Á¤ÇØÁ® ÀÖ´Ù. ¹°·Ð x86¿¡¼µµ ÄÄÆÄÀÏ·¯¿¡ µû¶ó ·¹Áö½ºÅÍ µÎ¼¼°³¸¦ »ç¿ëÇØ¼ Á¶±ÝÀÌ¶óµµ ¼Óµµ¸¦ ³ôÀÌ´Â ¿É¼ÇÀÌ Á¸ÀçÇÏ´Â °æ¿ìµµ ÀÖÁö¸¸ Ç¥ÁØÀº ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ºñÁÖ¾ó C++Àº Àμö Àü´Þ¿¡ ·¹Áö½ºÅÍ µÎ °³¸¦ »ç¿ëÇϸç, º¼·£µå C++´Â ¼¼ °³, ¿ÓÄÞ C´Â ³× °³¸¦ »ç¿ëÇÑ´Ù.
·¹Áö½ºÅͰ¡ ÀûÀº x86ÀÇ °æ¿ì¿¡´Â ½ºÅà ÇÁ·¹ÀÓ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ´Â EBP(Base Stack Pointer)¸¦ ´Ù¸¥ ¸ñÀûÀ¸·Î Ȱ¿ëÇϵµ·Ï ÄÄÆÄÀÏ·¯°¡ ESP ·¹Áö½ºÅ͸¦ ±³¹¦ÇÏ°Ô Á¶ÀÛÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇϱ⵵ ÇÑ´Ù. ÀÏ·Ê·Î gccÀÇ °æ¿ì¿¡´Â -fomit-frame-pointer ¿É¼ÇÀ» ºÙÀ̰ųª ?O2 ÃÖÀûÈ ¿É¼ÇÀ» ºÙÀÏ °æ¿ì ÇÁ·¹ÀÓ Æ÷ÀÎÅ͸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.
| | | | | |
| |
·çÇÁ ÃÖÀûÈ
±¸Á¶ÈµÈ ÇÁ·Î±×·¡¹Ö ±â¹ý¿¡¼ »ç¿ëÇÏ´Â ÁÖ¿ä ¿ä¼Ò·Î ÆÇ´Ü°ú ¹Ýº¹ÀÌ ¹«Ã´ Áß¿äÇÏ´Ù. ¿ì¼± ¹Ýº¹À» À§ÇÑ ·çÇÁ ÃÖÀûȺÎÅÍ »ìÆìº¸±â·Î ÇÏÀÚ.
¡Ü ºÒÇÊ¿äÇÑ ¹Ýº¹ Á¦°Å
°¡Àå ±âº»ÀûÀÎ ·çÇÁ ÃÖÀûÈ ±â¹ýÀ¸·Î ºÒÇÊ¿äÇÑ ¹Ýº¹À» Á¦°ÅÇÏ´Â ±â¹ýÀÌ ÀÖ´Ù. 3~5ȸ Á¤µµ¸¸ ¹Ýº¹ÇÏ°í ³¡³ª´Â °æ¿ì ·çÇÁ¸¦ Ç®¾î¼ »ç¿ëÇÑ´Ù¸é Å©±â¸¦ Èñ»ýÇØ¼ ¼º´ÉÀ» ³ôÀÏ ¼ö ÀÖ´Ù.
ÇÏÁö¸¸ ÄÚµå Å©±â°¡ Áõ°¡ÇÒ °æ¿ì ij½Ã ÀûÁß·üÀÌ ³·¾ÆÁ®¼ ¼º´ÉÀ» ³ôÀ̱â´ÂÄ¿³ç ¼º´ÉÀ» ¶³¾îÆ®¸®´Â ¿øÀÎÀÌ µÉ ¼öµµ ÀÖÀ¸´Ï, ¹Ýµå½Ã ·çÇÁ³»¿¡ µé¾îÀÖ´Â ÄÚµå Å©±â°¡ ÀÛÀ» °æ¿ì¿¡¸¸ Àû¿ëÇØ¾ß ÇÑ´Ù.
·çÇÁ¸¦ ¿ÏÀüÈ÷ Ç®Áö ¾Ê°í ¾ð·Ñ¸µÀ̶ó´Â ±â¹ýÀ» »ç¿ëÇØ¼ Å©±â¿Í ¼º´ÉÀÇ ±ÕÇüÀ» ¸ÂÃß´Â ¹æ¹ýµµ ÀÖ´Ù. ARM Ç÷§ÆûÀ» ¿¹·Î µé¾îº¸ÀÚ¸é ARM7À̳ª ARM9 ÇÁ·Î¼¼¼¿¡¼ »¬¼ÀÀ» ó¸®ÇÏ´Â µ¥ÇÑ »çÀÌŬ, ºÐ±â¸¦ ó¸®ÇÏ´Â µ¥ ¼¼ »çÀÌŬÀÌ ¼Ò¿äµÈ´Ù. ÀüüÀûÀ¸·Î ·çÇÁ¸¦ Çѹø µµ´Â µ¥¿¡ ³× »çÀÌŬÀÌ ÇÊ¿äÇÑ ¼ÀÀÌ´Ù.
ÀÌ·² °æ¿ì¿¡ ·çÇÁ¹®ÀÇ ¸öü¸¦ ¿©·¯ Â÷·Ê ¹Ýº¹Çؼ °°Àº ºñÀ²¸¸Å ¹Ýº¹¼ö¸¦ ÁÙÀÌ¸é ¼º´ÉÀ» ³ôÀÏ ¼ö ÀÖ´Ù. <¸®½ºÆ® 1>°ú <¸®½ºÆ® 2>¸¦ ºñ±³ÇØ º¸ÀÚ.
| <¸®½ºÆ® 1> ÀϹÝÀûÀÎ ¹æ¹ýÀÇ ¿¹Á¦ | | | |
int checksum (int *data, unsigned int count)
{
int sum = 0;
for (; count != 0; count--) {
sum += (*data++);
}
return sum;
}
| |
 |
| <¸®½ºÆ® 2> ¾ð·Ñ¸µ ±â¹ýÀ¸·Î ÀÛ¼ºµÈ ¿¹Á¦ | | | |
int checksum_unrolling(int *data, unsigned int count)
{
int sum = 0;
do {
sum += (*data++);
sum += (*data++);
sum += (*data++);
sum += (*data++);
} while (count != 0);
return sum;
}
| |
 |
<¸®½ºÆ® 1>Àº ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î ÀÛ¼ºÇßÀ¸¸ç, <¸®½ºÆ® 2>´Â ¾ð·Ñ¸µ ±â¹ýÀ¸·Î ÀÛ¼ºÇß´Ù. ¾ð·Ñ¸µ ±â¹ýÀ» »ç¿ëÇÒ °æ¿ì ·çÇÁ ¹Ýº¹ ȸ¼ö°¡ 4 * count »çÀÌŬ¿¡¼ count »çÀÌŬ·Î ÁÙ¾îµé±â ¶§¹®¿¡ »ó´çÇÑ À̵æÀ» ¾òÀ» ¼ö ÀÖ´Ù. ¹°·Ð ¾ð·Ñ¸µ ¾çÀº ¹«ÀÛÁ¤ ´Ã¿©¼´Â ¾È µÈ´Ù. ÄÚµå Å©±â°¡ Ä¿Áö°Ô µÇ¸é ij½Ã ÀûÁß·üÀÌ ¶³¾îÁ® »çÀÌŬÀ» Àý¾àÇØ¼ ¾ò´Â ÀåÁ¡À» ¸ðµÎ »ó¼â½ÃÄѹö¸®´Â Å¿ÀÌ´Ù.
¹è¿ Å©±â°¡ ¾ð·Ñ¸µ ¾ç¿¡ ºñ·ÊÇÒ °æ¿ì, °¡Àå ³ôÀº ¼º´ÉÀ» ´Þ¼ºÇϱ⠶§¹®¿¡ ¸¸ÀÏ ¹è¿ Å©±â°¡ ¾ð·Ñ¸µ ¾çÀÇ ¹è¼ö·Î ¶³¾îÁöÁö ¾ÊÀ¸¸é ¹è¼ö Å©±â¸¸Å¸¸ ¾ð·Ñ¸µ ·çÇÁ·Î ¸¸µé°í ³ª¸ÓÁö´Â ·çÇÁ ¹Ù±ù¿¡¼ ¾ð·Ñ¸µÇÏ¸é µÈ´Ù. °á±¹ ¹è¿ Å©±â¸¦ 4³ª 8 ¹è¼ö·Î Á¤·Ä½Ãų °æ¿ì Äڵ带 ¾îÁö·´È÷Áö ¾Ê°íµµ ·çÇÁ¸¦ 2, 4, 8¹è·Î ½±°Ô ¾ð·Ñ¸µÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù.
¡Ü ·çÇÁ °áÇÕ
·çÇÁ´Â ¾ÆÅ°ÅØÃ³¸¦ ºÒ¹®ÇÏ°í °ªºñ½Ñ ¿¬»êÀÌ ÇÊ¿äÇϹǷΠ¿©·¯·çÇÁ°¡ ÀÖÀ» °æ¿ì Çϳª·Î °áÇÕÇÏ´Â ÆíÀÌ ¼º´É¸é¿¡¼ ¿ùµîÈ÷ À¯¸®ÇÏ´Ù. <¸®½ºÆ® 3>°ú <¸®½ºÆ® 4>¸¦ »ìÆìº¸ÀÚ.
| <¸®½ºÆ® 3> ·çÇÁ¸¦ µÎ ¹ø µ¹¸®´Â ¿¹Á¦ | | | |
void foo(int count, int *x, int *y)
{
int b;
for (b = 0; b < count; b++) {
x[b] = b;
}
for (b = 0; b < count; b++) {
y[b] = b;
}
}
| |
 |
| <¸®½ºÆ® 4> ·çÇÁ¸¦ ÇÑ ¹ø µ¹¸®´Â ¿¹Á¦ | | | |
void bar(int count, int *x, int *y)
{
int b;
for (b = 0; b < count; b++) {
x[b] = b;
y[b] = b;
}
}
| |
 |
¿¹Á¦¿¡¼ ¾Ë ¼ö ÀÖµíÀÌ <¸®½ºÆ® 3>ÀÇ foo´Â ·çÇÁ¸¦ µÎ ¹ø µ¹¸®´Â ¹Ý¸é¿¡ <¸®½ºÆ® 4>ÀÇ bar´Â ÇÑ ¹ø¸¸ µ¹¸°´Ù. ÀÌ·² °æ¿ì ·çÇÁ ¿¬»ê¿¡ µû¸¥ »çÀÌŬÀ» Àý¾àÇÒ ¼ö ÀÖÀ» »Ó ¾Æ´Ï¶ó °æ¿ì¿¡ µû¶ó¼´Â ij½Ã¸¦ Á» ´õ È¿°úÀûÀ¸·Î »ç¿ëÇÏ¿© ¼º´ÉÀ» ³ôÀÏ ¼ö ÀÖ´Ù.
¡Ü ºÒº¯ ÄÚµå ºÐ¸®
ÄÚµå ³»ºÎ¿¡¼ ¹Ù²îÁö ¾ÊÀº ºÎºÐÀº ÄÚµå ¹Ù±ùÀ¸·Î ºÐ¸®½ÃÅ´À¸·Î½á ¹Ýº¹ÀûÀÎ °è»êÀ» ¸·À» ¼ö ÀÖ´Ù. ¾ÆÁÖ ´Ü¼øÇÑ ³í¸®ÀÎ µíÇÏÁö¸¸ Á¶±Ý¸¸ ½Å°æ ¾²¸é »ó´çÇÑ È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 5> ´ÙÁß ÇÔ¼ö È£Ãâ ¿¹Á¦ | | | |
void foo(const char *str)
{
int i;
for (i = 0; i < strlen(str); i++) {
¡¦
}
}
| |
 |
ºñ´Ü strlen °°Àº ÇÔ¼ö È£Ãâ»Ó¸¸ÀÌ ¾Æ´Ï¶ó »çÄ¢¿¬»ê°ú °°Àº °æ¿ì¿¡µµ °íÁ¤µÈ »ó¼ö °ªÀ» ·çÇÁ ³»ºÎ¿¡¼ ¸Å¹ø °è»êÇÏ´Â ´ë½Å, º¯¼ö¸¦ Çϳª Àâ¾Æ ¹Ì¸® °è»êÇÑ µÚ¿¡ ·çÇÁ·Î ÁøÀÔÇÏ¿© »ó´çÇÑ °³¼± È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù. °¡µ¶¼ºÀ̳ª ±âŸ ÀÌÀ¯·Î ¸öü Å©±â°¡ ÀÛÀº ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù¸é ¸ÅÅ©·Î È®ÀåÀ̳ª ÀζóÀÎÀ» °í·ÁÇÏÀÚ.
| <¸®½ºÆ® 6> ´ÜÀÏ ÇÔ¼ö È£Ãâ ¿¹Á¦ | | | |
void bar(const char *str)
{
int i;
int len = strlen(str);
for (i = 0; i < len; i++) {
¡¦
}
}
| |
 |
µÎ ¸®½ºÆ® Áß <¸®½ºÆ® 6>ÀÇ barÀº ¸Å¹ø strlen ÇÔ¼ö¸¦ È£ÃâÇÏ´Â foo¿Í ´Þ¸® Çѹø¸¸ È£ÃâÇÑ´Ù. <¸®½ºÆ® 5>ÀÇ foo´Â strÀÇ ±æÀ̰¡ ±æ¾îÁú¼ö·Ï ´«¿¡ ¶ç°Ô ¼Ó·ÂÀÌ ´À·ÁÁöÁö¸¸ bar´Â Ç×»ó °íÁ¤ ½Ã°¢¿¡ ·çÇÁ¸¦ µ¹¸± ¼ö ÀÖ´Ù.
¡Ü ·çÇÁ Áõ°¡¸¦ °¨¼Ò·Î ´ëü
°ÅÀÇ ´ëºÎºÐÀÇ ¾ÆÅ°ÅØÃ³¿¡¼´Â 0¿¡ µµ´ÞÇÒ ¶§ ZERO Ç÷¡±×¸¦ Àç¼³Á¤ÇÑ´Ù. ¶§¹®¿¡ ÁÙ¾îµç º¯¼ö¸¦ ¸í½ÃÀûÀ¸·Î 0°ú ºñ±³ÇÒ Çʿ䰡 ¾ø´Ù. ÀÌ·± ¹æ¹ýÀ» ÀÀ¿ëÇϸé for ·çÇÁ ¼Óµµ¸¦ ³ôÀÌ´Â ÇÑ °¡Áö ÈùÆ®¸¦ ãÀ» ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 7> ·çÇÁ Áõ°¡ ¿¹Á¦ | | | |
void checksum_inc(int *data)
{
unsigned int i;
int sum = 0;
for (i = 0; i < 64; i++) {
sum += *(data++);
}
return sum;
}
| |
 |
| <¸®½ºÆ® 8> ·çÇÁ °¨¼Ò ¿¹Á¦ | | | |
void checksum_dec(int *data)
{
unsigned int i;
int sum = 0;
for (i = 64; i != 0; i--) {
sum += *(data++);
}
return sum;
}
| |
 |
³í¸®ÀûÀ¸·Î´Â Å« Â÷À̰¡ ¾ø¾î º¸ÀδÙ. ÇÏÁö¸¸ µÎ Äڵ带 ¾î¼ÀºíÇÑ ³»¿ëÀ» »ìÆìº¸¸é À̾߱Ⱑ ´Þ¶óÁø´Ù. ARMÀÇ °æ¿ì¸¦ ¿¹·Î µéÁö¸¸ ´Ù¸¥ ¾ÆÅ°ÅØÃ³µµ °ÅÀÇ À¯»çÇÏ´Ù.
| <¸®½ºÆ® 9> ·çÇÁ Áõ°¡ÀÇ ¾î¼Àºí ¿¹ | | | |
checksum_inc
MOV r2, r0 r2 = data
MOV r0, #0 sum = 0
MOV r1, #0 i = 0
cheksum_inc_loop
LDR r3, [r2], #4 r3 = *(data++)
ADD r1, r1, #1 i++
CMP r1, #0x40 i¿Í 0x40(½ÊÁø¼ö 64)¸¦ ºñ±³
ADD r0, r3, r0 sum += r3
BCC checksum_inc_loop; (i < 64) À̸é loop ¹Ýº¹
MOV pc, r14 sum ¸®ÅÏ
| |
 |
| <¸®½ºÆ® 10> ·çÇÁ °¨¼ÒÀÇ ¾î¼Àºí ¿¹ | | | |
checksum_dec ÀÇ ¼öÁ¤
MOV r2, r0 r2 = data
MOV r0, #0 sum = 0
MOV r1, #0x40 i = 64
cheksum_dec_loop
LDR r3, [r2], #4 r3 = *(data++)
SUBS r1, r1, #1 i-- (ÀÚµ¿ Ç÷¡±× °»½Å)
ADD r0, r3, r0 sum += r3
BNE checksum_inc_loop; (i != 0) À̸é loop ¹Ýº¹
MOV pc, r14 sum ¸®ÅÏ
| |
 |
checksum_dec¿Í checksum_inc¸¦ ºñ±³Çغ¸¸é(¹ØÁÙ ±×Àº °÷À» ÂüÁ¶) Ç÷¡±× ¼³Á¤À» À§ÇÑ CMP ¸í·ÉÀÌ Çϳª ÁÙ¾îµé¾ú´Ù´Â »ç½ÇÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù.
¡Ü ºÐ±â Á¦°Å
·çÇÁ¹®¿¡ ºÐ±â°¡ µé¾î°¡¸é ¼º´ÉÀÌ ¶³¾îÁø´Ù. ¶§¹®¿¡ ·çÇÁ ³»¿¡¼ ºÐ±â¸¦ ¾î¶»°Ô Á¦°ÅÇØ¾ß ÇÒ Áö °í¹ÎÇØ¾ß ÇÑ´Ù. ¸¸¾à ÃÖÀûÈ ÄÄÆÄÀÏ·¯¶ó´Â °ÍÀÌ ÀÖ¾î¼ ÀÌ·± ÀϵéÀ» °³¹ßÀÚ°¡ ÀÏÀÏÀÌ ÇÏÁö ¾Ê´Â´Ù¸é ¸ô¶óµµ ÀÏ´Ü ¾ÆÁ÷Àº ¸ðµÎ ¼öÀÛ¾÷À¸·Î ÇØ¾ß ÇÏ´Â ÀϵéÀÌ´Ù. <¸®½ºÆ® 11>À» »ìÆìº¸ÀÚ.
| <¸®½ºÆ® 11> ºÐ±â°¡ ÀÖ´Â ·çÇÁ¹® | | | |
do
{
printf("ù¹øÂ° Ãâ·Â\n");
if (--a < 0) break;
printf("µÎ¹øÂ° Ãâ·Â\n");
} while (1);
| |
 |
ÄÚµå ³í¸®»óÀ¸·Î´Â Å« ¹®Á¦°¡ ¾ø¾î º¸ÀδÙ. ÇÏÁö¸¸ <¸®½ºÆ®11>À» <¸®½ºÆ® 12>¿Í °°ÀÌ ¼öÁ¤ÇÏ¸é ·çÇÁ¹® ¾È¿¡¼ Á¶°Ç¹®À» Á¦°ÅÇÒ ¼ö ÀÖ¾î ¼º´ÉÀ» Çâ»ó½Ãų ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 12> <¸®½ºÆ® 11>¿¡¼ ºÐ±â°¡ Á¦°ÅµÈ ÄÚµå | | | |
printf("ù¹øÂ° Ãâ·Â\n");
a--;
if (a>=0) {
do
{
printf("µÎ¹øÂ° Ãâ·Â\n");
printf("ù¹øÂ° Ãâ·Â\n");
} while (--a<0);
}
| |
 |
À̹ø¿¡´Â <¸®½ºÆ® 1>ÀÇ checksum ÇÔ¼ö¸¦ <¸®½ºÆ® 13>°ú °°ÀÌ °íÃĺ¸ÀÚ.
| <¸®½ºÆ® 13> <¸®½ºÆ® 1>ÀÇ ¼öÁ¤ | | | |
int checksum_dowhile(int *data, unsigned int count)
{
int sum = 0;
do {
sum += (*data++);
} while (--count != 0);
return sum;
}
| |
 |
Äڵ带 ÀÌ·¸°Ô °íÄ¡¸é ¿ª½Ã óÀ½¿¡ count¿Í 0À» ºñ±³ÇÏ´Â ºÎºÐÀÌ ºüÁ®¼ µÎ »çÀÌŬ(ºñ±³¿¡ ÀÌÀº ºÐ±â)À» Àý¾àÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¾ð·Ñ¸µ ±â¹ý¿¡ ºñÇØ ¼º´ÉÀÌ ¶³¾îÁö±ä ÇÏÁö¸¸ ÄÚµå Å©±â¸¦ À¯ÁöÇÑ »óÅ¿¡¼ ó¸® ¼Óµµµµ ¾î´À Á¤µµ °³¼±ÇÒ ¼ö ÀÖÀ¸´Ï µÎ ¸¶¸® Åä³¢¸¦ ¸ðµÎ Àâ¾Æ¾ß ÇÏ´Â °æ¿ì¿¡ À¯¿ëÇÏ°Ô ¾µ ¼ö ÀÖ´Ù.
 | ¿Ö ÀÌ·¸°Ô ·çÇÁ ÃÖÀûÈ¿¡ ¸ñ¼ûÀ» °Å³ª? |  | |  | |
|
´Ù¸¥ ÃÖÀûÈ ±â¹ýµµ ¸¹Àº »óȲ¿¡¼ ·çÇÁ ÃÖÀûÈ¿¡ »ó´çÇÑ Áö¸éÀ» ÇÒ¾ÖÇØ¼ ´Ù¾çÇÑ ¹æ¹ýÀ» ¼Ò°³ÇÏ´Â ÀÌÀ¯´Â ¿ì¸® ÁÖº¯¿¡¼ »ý°¢º¸´Ù ·çÇÁ¿Í °ü·ÃµÈ ¼º´É ÀúÇϰ¡ ¸¹ÀÌ ÀϾ±â ¶§¹®ÀÌ´Ù.
ÀÓº£µðµå Àåºñ¸¦ °³¹ßÇÒ ¶§ ½Ã½ºÅÛ ¼Óµµ¸¦ °³¼±Çϱâ À§ÇØ »ç¹æÆÈ¹æÀ¸·Î ¶Ù¾î´Ù³à º¸´Ï °á±¹ ·çÇÁ Ƚ¼ö¸¦ ÁÙÀ̰ųª, ·çÇÁ Çϳª¸¦ µ¹ ¶§ ´Ü ¸î »çÀÌŬÀÌ¶óµµ ¾Æ³¢´Â ¹æ¹ýÀ¸·Î ±Í°áµÊÀ» ¿©·¯ Â÷·Ê ¸ñ°ÝÇß´Ù.
Áö±Ýµµ ±â¾ï³ª´Â °¡Àå ±ØÀûÀÎ ¼º´É °³¼±Àº ¼öõ ¹ø¿¡¼ ¼ö¸¸ ¹øÀ» ¹Ýº¹ÇÏ´Â ·çÇÁ ³»ºÎÀÇ ºÒº¯½ÄÀ» ¸ÅÅ©·Î·Î Á¤ÀÇÇØ¼ È®ÀåÇßÀ» ¶§ ¼º´ÉÀÌ Àڱ׸¶Ä¡ 2¹è¿¡¼ 10¹è±îÁö Çâ»óµÇ¾úÀ» ¶§¿´´Ù.
¾Õ¼ strlen°ú °°Àº °ªºñ½Ñ ÇÔ¼ö¸¦ ·çÇÁ ³»ºÎ¿¡ ³ÖÀº ¿¹Á¦¸¦ º¸°í ¿ô°í ³Ñ±æÁö ¸ð¸£°ÚÁö¸¸, ÁÖº¯ Äڵ带 »ìÆìº¸¸é ÀǿܷΠÀÌ·± »ç¼ÒÇÏ´Ù°í º¸¸é »ç¼ÒÇÏÁö¸¸ ¼º´É¿¡ Ä¡¸íŸ¸¦ ÀÔÈ÷´Â Äڵ尡 ¸¹´Ù. ÃÖÀûȰ¡ ÇÊ¿äÇÏ´Ù¸é °¡Àå ¸ÕÀú ·çÇÁ¿Í ·çÇÁ ³»ºÎ¿¡ µé¾îÀÖ´Â ºÐ±â¹®À» ÁýÁß °ø·«Çϱ⠹ٶõ´Ù.
| | | | | |
| |
ºÐ±â ÃÖÀûÈ
·çÇÁ ÃÖÀûÈ¿¡ À̾î À̹ø¿¡´Â ºÐ±â ÃÖÀûÈ¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ·çÇÁ ÃÖÀûÈ´Â Á¶±Ý¸¸ ¼ÕÀ» º¸¸é »ó´çÇÑ ¼º´É °³¼±À» ÀÌ·ê ¼ö ÀÖ´Â ¹Ý¸é ºÐ±â ÃÖÀûÈ´Â ±¸Çöµµ ¾î·Æ°í ¼º´É °³¼± È¿°úµµ ¹Ì¹ÌÇÏ´Ù. ÇÏÁö¸¸ ¸î °¡Áö ±ÔÄ¢À» ¾Ë°í ÀÖ´Ù¸é ÇÁ·Î±×·¥ ÀÛ¼º °úÁ¤¿¡¼ ÀÚ¿¬½º·´°Ô ¼º´ÉÀ» ³ôÀÌ´Â Ãâ¹ßÁ¡À̶ó´Â Á¡À» ¿°µÎ¿¡ µÐ´Ù¸é ¹Ýµå½Ã °ü½ÉÀ» °¡Á®¾ß ÇÒ ±â¹ýÀÌ´Ù.
¡Ü ±âº» switch ~ case ¹® ÃÖÀûÈ
ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Ù º¸¸é switch ~ case ¹®À» ÀÚÁÖ »ç¿ëÇÏ°Ô µÈ´Ù. ÇÏÁö¸¸ switch ~ case ¹®Àº ½ÇÇà Áß¿¡ ¼ö¸¹Àº Á¶°ÇÀ» ÆÇº°Çؼ ºÐ±âÇØ¾ß Çϱ⠶§¹®¿¡ CPU ÀÔÀå¿¡¼´Â »ó´çÈ÷ ³°¨ÇÑ ±¸¹®À̶ó°í º¸¸é Ʋ¸²¾ø´Ù. <¸®½ºÆ® 14>¸¦ »ìÆìº¸ÀÚ.
| <¸®½ºÆ® 14> switch ~ case ¹® ¿¹Á¦ | | | |
switch (x) {
case 10: case 12: case 14: case 16: case 20:
foobar();
break;
}
| |
 |
<¸®½ºÆ® 14>¿Í °°Àº Äڵ带 ÀÛ¼ºÇßÀ» °æ¿ì ÄÄÆÄÀÏ·¯´Â 10, 12, 14, 16, 20ÀÏ °æ¿ì¸¦ ÀÏÀÏÀÌ ÆÇ´ÜÇØ¾ß ÇÏ´Â Å¿¿¡ »ó´çÇÑ ¾î·Á¿òÀ» °Þ´Â´Ù. ÆÄ¿öPCÀÇ ¾î¼Àºí¸® ÄÚµåÀÎ <¸®½ºÆ® 15>¸¦ º¸¸é <¸®½ºÆ® 14> Äڵ尡 ¾ó¸¶³ª º¹ÀâÇÏ°Ô ¸¸µé¾îÁö´ÂÁö ¾Ë ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 15> <¸®½ºÆ® 14>ÀÇ ÆÄ¿öPC ¾î¼Àºí¸® ÄÚµå | | | |
lwz R3,x # x¸¦ R3À¸·Î
cmpwi cr0,R3,10
beq cr0,lab10 # if (x == 10) goto lab10
cmpwi cr1,R3,12
beq cr1,lab12 # else if (x == 12) goto lab12
cmpwi cr5,R3,14
beq cr5,lab14 # else if (x == 14) goto lab14
cmpwi cr6,R3,16
beq cr6,lab16 # else if (x == 16) goto lab16
cmpwi cr7,R3,18
beq cr7,lab18 # else if (x == 18) goto lab18
cmpwi cr0,R3,20
beq cr0,lab20 # else if (x == 20) goto lab20
...
lab10:
lab12:
lab14:
lab16:
lab18:
lab20:
# foobar È£Ãâ
| |
 |
ÇÏÁö¸¸ ¾ÆÁÖ °£´ÜÇÑ ¼öÁ¤¸¸ ÇÑ <¸®½ºÆ® 16>À» ¾î¼Àºí¸® ÄÚµå·Î ¸¸µé¸é ÀüÇô ´Ù¸¥ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 16> ¼öÁ¤µÈ switch ~ case ¹® ¿¹Á¦ | | | |
switch (x) {
case 10: case 11: case 13: case 14: case 15:
foobar();
break;
}
| |
 |
<¸®½ºÆ® 16>À» ¾î¼Àºí¸® ÄÚµå·Î ¸¸µé¸é <¸®½ºÆ® 14>¶§ º¸´Ù ÄÚµåÀÇ ¾çµµ ÈξÀ Àû¾îÁö°í ÆÇ´Ü Ƚ¼öµµ ÁÙ¾îµå´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. º°·Î ´Ù¸£Áö ¾ÊÀº ÄÚµåÁö¸¸ ±× °á°ú´Â Å« Â÷À̸¦ ³ªÅ¸³»´Â °ÍÀÌ´Ù. ±×¸®°í ÀÌ Â÷ÀÌÀÇ Á߽ɿ¡´Â ÄÄÆÄÀÏ·¯°¡ ÁÁ¾ÆÇÏ´Â ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù´Â ±ÔÄ¢ÀÌ ÀÖ´Ù.
| <¸®½ºÆ® 17> <¸®½ºÆ® 16>ÀÇ ¾î¼Àºí¸® ÄÚµå | | | |
lwz R3,x # x¸¦ R3À¸·Î
subic R4,R3,10 # tmp = (x - min)
cmplwi cr3,R4,5 # ³í¸® ºñ±³ (tmp, max-min)
bgt cr3,out # if tmp < 0 ¶Ç´Â tmp > 5,
# x ´Â¹üÀ§ [min,max] ¹Ù±ù
# foobar È£Ãâ
out:
| |
 |
¡Ü °í±Þ switch ~ case ¹® ÃÖÀûÈ
¾Õ¿¡¼´Â ¾ÆÁÖ ±âÃÊÀûÀÎ ±¸¼ºÀÇ switch ~ case ¹®ÀÇ ÃÖÀûÈ ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù. À̹ø¿¡´Â Á¶±Ý ´õ º¹ÀâÇÑ ÇüÅÂÀÇ Switch~ case ¹®À» ÀÌ¿ëÇØ¼ ÃÖÀûÈ ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.
| <¸®½ºÆ® 18> °í±Þ switch ~ case ¹® ¿¹Á¦ | | | |
switch(x){
case 0: code_for_case_0;
case 1: code_for_case_1;
case 2: code_for_case_2;
case 3: code_for_case_3;
case 4: code_for_case_4;
case 5: code_for_case_5;
case 6: code_for_case_6
case 7: code_for_case_7
default: code_for_case_d;
}
| |
 |
°¨ÀÌ ÀÖ´Â °³¹ßÀÚ¶ó¸é <¸®½ºÆ® 18>°ú °°Àº Äڵ尡 Å×ÀÌºí °Ë»ö¹ýÀ» »ç¿ëÇÒ °æ¿ì Á¦°ÝÀ̶ó´Â »ý°¢ÀÌ µéÁö ¸ð¸£°Ú´Ù. À̹ø¿¡´Â ÆÄ¿öPC ¾î¼Àºí¸®¾î¿Í ARM ¾î¼Àºí¸®¾î¸¦ µ¿½Ã¿¡ Á¦½ÃÇØ¼ ºñ±³Çغ¸±â·Î ÇÏÀÚ. ¸ÕÀú <¸®½ºÆ® 19>¸¦ ÅëÇØ Å×ÀÌºí °Ë»ö ±â¹ýÀ» »ç¿ëÇÏ´Â ÆÄ¿öPCºÎÅÍ »ìÆìº¸ÀÚ.
| <¸®½ºÆ® 19> <¸®½ºÆ® 18>ÀÇ ÆÄ¿öPC ¾î¼Àºí¸® ÄÚµå | | | |
lwz R4,x # x¸¦ R4·Î
lwz R7,$TABLE # TABLE ÁÖ¼Ò¸¦ R7·Î
slwi R5,R4,2 # 4¸¦ °öÇÔ (Å×ÀÌºí ¿£Æ®¸® ´ç 4 ¹ÙÀÌÆ®)
lwzx R3,R7,R5 # TABLE[x]¸¦ R3·Î
mtctr R3 # Ä«¿îÆ® ·¹Áö½ºÅÍ ÀûÀç
bctr # Ä«¿îÆ® ·¹Áö½ºÅÍ ³»¿ëÀ¸·Î ºÐ±â
| |
 |
<¸®½ºÆ® 20>Àº Å×ÀÌºí °Ë»ö ±â¹ýÀ» Ȱ¿ëÇÏ´Â ARM ¾î¼Àºí¸®¾îÀÇ ÄÚµåÀÌ´Ù. code_for_case_?¸¦ ´ãÀº TABLEÀ» Á¤ÀÇÇϰí, ¿ÀÇÁ¼ÂÀ» °è»êÇØ¼ ¹Ù·Î ÇÁ·Î±×·¥ Ä«¿îÅ͸¦ ÀûÀçÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÒ °æ¿ì ÃÖÀûȸ¦ ´Þ¼ºÇÒ ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 20> <¸®½ºÆ® 18>ÀÇ ARM ¾î¼Àºí¸® ÄÚµå | | | |
x RN 0
CMP x, #8
ADDLT pc, pc, x, LSL#2
B code_for_case_d
B code_for_case_0
B code_for_case_1
B code_for_case_2
B code_for_case_3
B code_for_case_4
B code_for_case_5
| |
 |
<¸®½ºÆ® 18>°ú °°Àº ¹æ½ÄÀº ¾ÆÁÖ ºü¸£°Ô ½ÇÇàµÇ±â ¶§¹®¿¡ switch ¹®À» »ç¿ëÇÏ´õ¶óµµ ºñ±³¿¡ µû¸£´Â ºÎÇϰ¡ °ÅÀÇ ¾ø´Ù. ¹°·Ð ÃÖÀûÈ ÄÄÆÄÀÏ·¯ Á¾·ù³ª ¹®¸Æ¿¡ µû¶ó ¹üÀ§ ºñ±³³ª Å×ÀÌºí ¹æ½ÄÀ¸·Î Äڵ带 »ý¼ºÇÏÁö ¸øÇÒ ¼öµµ ÀÖ´Ù. ¹Ý¸é¿¡ ¹«ÀÛÀÇ caseó·³ 100% ºÒ°¡´ÉÇÑ »óȲÀÌ ¾Æ´Ô¿¡ ÁÖ¸ñÇÏÀÚ.¡® ÇÒ ¼ö ¾ø´Ù¡¯¿Í¡®ÇÒ ¼ö ÀÖ´Ù¡¯´Â Çϴðú ¶¥ Â÷À̱⠶§¹®ÀÌ´Ù.
°í±Þ ÃÖÀûÈ ±â¹ý: ARM CPU ¾ÆÅ°ÅØÃ³¿¡ ¹ÐÁ¢ÇÑ memcpy ·çƾ
Áö±Ý±îÁö´Â ±¸Á¶È ÇÁ·Î±×·¡¹Ö¿¡¼ °¡Àå ¸¹ÀÌ ¾²ÀÌ´Â ¿ä¼ÒÀÎ ¹Ýº¹°ú ºÐ±â¿¡ ´ëÇÑ C ÇÁ·Î±×·¡¹Ö ÃÖÀûÈ ¹æ¾È¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù. ±×·³, CPU ¾ÆÅ°ÅØÃ³¿¡ ¹ÐÁ¢ÇÑ ¹æ½ÄÀ¸·Î ¾î¼Àºí¸® ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ¾ß ÇÏ´Â °æ¿ì´Â ¾î¶³±î? ¹°·Ð ÀÌ °æ¿ì¿¡µµ ÃÖÀûȸ¦ À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Â ±â¹ýµéÀÌ ÀÖ´Ù.
±× Áß °¡Àå ´ëÇ¥ÀûÀÎ °ÍÀÌ ¹Ù·Î ¸Þ¸ð¸® °ü·Ã ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¶§ÀÌ´Ù. ½ÇÁ¦·Î ÃÖÀûÈµÈ ¸Þ¸ð¸®°ü·Ã ¶óÀ̺귯¸®´Â ´ëºÎºÐ ¾î¼Àºí¸® ¾ð¾î·Î ÀÛ¼ºµÇ¾î ÀÖ´Ù.
¸®´ª½º Ä¿³Î ³»ºÎ¿¡¼µµ ÀÚÁÖ »ç¿ëÇÏ´Â ¸Þ¸ð¸® ÇÔ¼ö´Â ¸ðµÎ ¾ÆÅ°ÅØÃ³ º°·Î ¾î¼Àºí¸®¾î¸¦ »ç¿ëÇÑ´Ù. ¸®´ª½º Ä¿³Î Äڵ带 ¹Þ¾Æ¿Í¼ arch/¾ÆÅ°ÅØÃ³/lib ¾Æ·¡¸¦ º¸¸é ¾ÆÅ°ÅØÃ³ º° ÃÖÀûÈ ±â¹ýÀ» ÃÑÁ¤¸®ÇÑ ¾î¼Àºí¸® Äڵ带 È®ÀÎÇÒ ¼ö ÀÖ´Ù.
 | ³í¸® Æ®¸®¿Í ÇØ½Ã¸¦ »ç¿ëÇÑ ¼öµ¿ switch ~ case ¹® Á¦ÀÛ |  | |  | |
|
case ¹®¿¡ µé¾î°¡´Â °ªÀÌ ¿¬¼ÓÀûÀÎ °íÁ¤ ¹üÀ§ÀÏ °æ¿ì¿¡´Â ÄÄÆÄÀÏ·¯ Â÷¿ø¿¡¼ ¾î´À Á¤µµ ÃÖÀûȰ¡ °¡´ÉÇÏ´Ù. ÇÏÁö¸¸ ÀϹÝÀûÀÎ switch ~ case ¹®¿¡¼´Â ¾î¶»°Ô ÇÒ±î? Å©°Ô µÎ °¡Áö ¹æ¹ýÀ» »ý°¢Çغ¼ ¼ö ÀÖ´Ù. Çϳª´Â ¼±Çü ½ºÀ§Ä¡ Æ®¸®¿¡¼ ¹þ¾î³ª ±íÀ̰¡ ¾èÀº Æ®¸®¸¦ ±¸¼ºÇÏ´Â ¹æ¹ýÀÌ´Ù.
³ª¸ÓÁö Çϳª´Â case ¹®¿¡ µé¾î°¡´Â Á¶°ÇÀÌ ±ÔÄ¢¼ºÀ» °¡Áú °æ¿ì ÇØ½Ã Å×À̺íÀ» ¸¸µé¾î¼ ´ëÀÀÇϵµ·Ï ÇÏ´Â ¹æ¹ýÀÌ´Ù. ÇÏÁö¸¸ µÑ ´Ù ¾î¼Àºí¸®¾î¸¦ »ç¿ëÇØ¼ ÄÚµùÀ» ÁøÇàÇØ¾ß ÇϹǷΠ½ÇÁ¦ Àû¿ë °úÁ¤¿¡¼ ÅõÀÔÇÑ ºñ¿ë¿¡ ºñÇØ ÀÌÀÍÀº ±×´ÙÁö Å©Áö ¾Ê´Ù.
°á±¹ switch ~ case ¹®À» »ç¿ëÇÒ °æ¿ì ÃÖ´ëÇÑ case ¹®¿¡ Àϰü¼º ÀÖ´Â Á¶°ÇÀ» ÁöÁ¤ÇØ¾ß ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÑ ÀÚµ¿ ÃÖÀûÈ ÀÛ¾÷À̳ª ¾î¼Àºí¸®¾î¸¦ »ç¿ëÇÑ ¼öµ¿ ÃÖÀûÈ ÀÛ¾÷ÀÌ ½¬¿öÁø´Ù.
| | | | | |
| |
°ü·Ã ¶óÀ̺귯¸®´Â ´ëºÎºÐ ¾î¼Àºí¸® ¾ð¾î·Î ÀÛ¼ºµÇ¾î ÀÖ´Ù. ¸®´ª½º Ä¿³Î ³»ºÎ¿¡¼µµ ÀÚÁÖ »ç¿ëÇÏ´Â ¸Þ¸ð¸® ÇÔ¼ö´Â ¸ðµÎ ¾ÆÅ°ÅØÃ³ º°·Î ¾î¼Àºí¸®¾î¸¦ »ç¿ëÇÑ´Ù. ¸®´ª½º Ä¿³Î Äڵ带 ¹Þ¾Æ¿Í¼ arch/¾ÆÅ°ÅØÃ³/lib ¾Æ·¡¸¦ º¸¸é ¾ÆÅ°ÅØÃ³ º° ÃÖÀûÈ ±â¹ýÀ» ÃÑÁ¤¸®ÇÑ ¾î¼Àºí¸® Äڵ带 È®ÀÎÇÒ ¼ö ÀÖ´Ù.
CPU ¾ÆÅ°ÅØÃ³¿¡ ¹ÐÁ¢ÇÑ ÃÖÀûÈÀÇ ÁÁÀº ¿¹·Î uClibc¿¡¼ ±¸ÇöÇϰí ÀÖ´Â memcpy(memmove, bcopy) ·çƾÀ» µé ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â °úÁ¤¿¡¼ »ç¿ëÇÏ´Â °¢Á¾ ÃÖÀûÈ ±â¹ýÀ» ÀÌÇØÇϰí ÀÖ´Ù¸é ¾î·ÆÁö ¾Ê°Ô ´Ù¸¥ ºÎ¹®¿¡µµ Àû¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
uClibc¿¡ µé¾îÀÖ´Â memcpy ÇÔ¼ö ±¸ÇöºÎ´Â »ó´çÈ÷ ±æ°í º¹ÀâÇϱ⠶§¹®¿¡ ¸ðµÎ ¼Ò°³Çϱâ´Â ¾î·Æ´Ù. ¿©±â¿¡¼´Â ÀÏ´Ü ³»ºÎ¿¡¼ ¾î¶² Á¡¿¡ ÁÖ¸ñÇØ¼ ±¸ÇöÇß´ÂÁö¿¡ ´ëÇØ ¾Ë¾Æº»´Ù.
º¹»ç °úÁ¤¿¡¼ Á¶±ÝÀÌ¶óµµ ¼Ó·ÂÀ» ³ôÀ̱â À§ÇØ ´Ù¾çÇÑ Á¶°ÇÀ» °í·ÁÇÑ´Ù.
¡Ü
¹æÇâ: Á¤¹æÇâ º¹»çÀΰ¡ ¿ª¹æÇâ º¹»çÀΰ¡(º¹»ç ½ÃÀÛ ÁÖ¼Ò¿Í º¹»ç ´ë»ó ÁÖ¼Ò Å©±â¸¦ ºñ±³ÇÑ´Ù)
¡Ü
Á¤·Ä: º¹»ç ½ÃÀÛ ÁÖ¼Ò¿Í º¹»ç ´ë»ó ÁÖ¼Ò À§Ä¡°¡ Á¤·ÄµÇ¾îÀִ°¡
¡Ü
Å©±â: 12¹ÙÀÌÆ®³ª 32¹ÙÀÌÆ® ´ÜÀ§·Î º¹»ç°¡ °¡´ÉÇѰ¡
°¢ °æ¿ì¸¦ ¸ðµÎ µûÁ®¼ ÇØ´ç Á¶°Ç¿¡ ¸Â´Â ¼ºê·çƾÀ¸·Î ºÐ±âÇϱ⠶§¹®¿¡ memcpy¸¦ ±¸ÇöÇÏ´Â ¾î¼Àºí¸® ÄÚµå ±æÀ̰¡ ¹«Ã´ ±æ¾îÁ³´Ù. ARM CPU¿¡¼ Á¦°øÇÏ´Â LDM/STM ¸í·ÉÀ» »ç¿ëÇØ¼ Çѹø¿¡ ºí·Ï Àü¼ÛÀÌ °¡´ÉÇÑ °æ¿ì¸¦ »ìÇDZâ À§ÇØ Å©±â¸¦ µûÁö¸ç, Á¤·ÄÀÇ °æ¿ì ¸Þ¸ð¸® ¹ö½º¿Í ij½Ã ¶óÀÎÀ» È¿°úÀûÀ¸·Î »ç¿ëÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î µûÁø´Ù. ARM CPUÀÇ °æ¿ì ¿£µð¾ÈÀ» ¸®Æ²À̳ª ºò ¾çÂÊ Áß Çϳª¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î, ¹æÇâ±îÁö Àß µûÁ®¾ß ÇÑ´Ù.
32ºñÆ® ºí·Ï Àü¼ÛÀ» À§ÇÑ ARM ¾î¼Àºí¸® ÄÚµå Á¶°¢À» º¸¸é <¸®½ºÆ® 21>°ú °°ÀÌ ´Ü¼øÇϸ鼵µ ¹«Ã´ È¿À²ÀûÀÌ´Ù.
| <¸®½ºÆ® 21> 32ºñÆ® ºí·Ï Àü¼ÛÀ» À§ÇÑ ARM ¾î¼Àºí¸® ÄÚµå | | | |
.Lmemcpy_bloop32:
ldmdb r1!, {r3, r4, r12, lr}
stmdb r0!, {r3, r4, r12, lr}
ldmdb r1!, {r3, r4, r12, lr}
stmdb r0!, {r3, r4, r12, lr}
subs r2, r2, #0x20
bge .Lmemcpy_bloop32
| |
 |
¾Õ¿¡¼ ¼³¸íÇÑ Á¶°ÇÀ» °í·ÁÇØº¸¸é Lmemcpy¸¦ »ç¿ëÇÒ °æ¿ì¿¡´Â º¹»ç ½ÃÀÛ°ú º¹»ç ´ë»ó ÁÖ¼Ò°¡ Á¤·ÄÀÌ µÇ¾îÀÖ°í, Àüü ÀÚ·á Å©±â°¡ 32ºñÆ® ¹è¼ö°¡ µÉ °æ¿ì ÃÖ´ëÀÇ È¿°ú¸¦ ¿Ã¸± ¼ö ÀÖ´Ù. ÀÌ·¡¼ ¿ì¸®´Â ¶§·Î C¸¸ »ç¿ëÇÏ´Â °æ¿ì¿¡µµ º°·Î »ó°ü¾ø¾î º¸ÀÌ´Â ¾î¼Àºí¸®¾î·Î ±¸ÇöµÈ ¶óÀ̺귯¸®¸¦ È®ÀÎÇÒ Çʿ䰡 ÀÖ´Â °ÍÀÌ´Ù.
C ¾ð¾î¸¦ ÄÄÆÄÀÏ·¯°¡ ÁÁ¾ÆÇÏ´Â ¹æ½ÄÀ¸·Î Á¦´ë·Î ÀÛ¼ºÇϱ⸸ ÇØµµ »ó´çÇÑ ¼º´É °³¼±À» ´Þ¼ºÇÒ ¼ö ÀÖ´Ù´Â »ç½ÇÀ» Á÷Á¢ È®ÀÎÇß´Ù. ¹°·Ð Á¤¸» ÁÁÀº ÄÄÆÄÀÏ·¯¶ó¸é À̹ø ±â»ç¿¡¼ ¼Ò°³ÇÑ ³»¿ë¿¡ ¸ÂÃç¼ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏÁö ¾Ê´õ¶óµµ °³¹ßÀÚ Àǵµ¸¦ ÆÄ¾ÇÇØ¼ ÀÚµ¿À¸·Î ó¸®ÇØÁà¾ß ÇϰÚÁö¸¸ À¯°¨½º·´°Ôµµ ÀÌ·¸°Ô ÈǸ¢ÇÑ ÄÄÆÄÀÏ·¯´Â Á¸ÀçÇÏÁö ¾Ê´Â´Ù.
ÄÄÆÄÀÏ·¯ ÀÌ·ÐÀÌ °è¼ÓÇØ¼ ¹ßÀüÇϰí ÃÖÀûÈ ±â´ÉÀ» °ÈÇÑ ÄÄÆÄÀÏ·¯ ±¸Çö °á°ú¹°ÀÌ °è¼ÓÇØ¼ ³ª¿À°í´Â ÀÖÁö¸¸ ±× ¸¸Å ÄÄÇ»ÅÍ ¾ÆÅ°ÅØÃ³¿Í ¾Ë°í¸®ÁòÀÌ º¹ÀâÇØÁ³±â ¶§¹®¿¡ È¿°ú°¡ ¹Ý°¨µÇ´Â ´À³¦ÀÌ´Ù.
°á±¹ ÃÖ°í ¼º´ÉÀ» ´Þ¼ºÇϱâ À§Çؼ´Â °³¹ßÀÚ°¡ ¸¸µç ÇÔ¼ö¸¦ ¾î¼Àºí¸® ÄÚµå·Î ¹Ù²ã¼ ¾î¶² ¹®Á¦Á¡ÀÌ ÀÖ´ÂÁö ÆÄ¾ÇÇÏ°í ¼Óµµ¸¦ ³ôÀ̱â À§ÇØ ´Ù¸¥ ÄÚµåµé°ú ºñ±³ÇÏ¸ç ¾î¶² Á¦¾àÁ¡ÀÌ ÀÖ´ÂÁö ÆÄ¾ÇÇØ¾ß ÇÑ´Ù. ÀÌ·¸°Ô ¹®Á¦Á¡°ú Á¦¾àÁ¡À» ÆÄ¾ÇÇÏ°í ³ª¸é ÄÄÆÄÀÏ·¯°¡ ÁÁ¾ÆÇϵµ·Ï ÃÖÀûÈÇÑ Äڵ带 C·Î ¸¸µé ¼ö ÀÖ°Ô µÈ´Ù.
ÃÖÀûÈ¿Í °ü·ÃÇØ¼ ÁÖ·Î C ¾ð¾îÀûÀΠƯ¼º¿¡ ÁýÁßÇÏ´Ù º¸´Ï À̹ø ±â»ç¿¡¼´Â CPU ¸Þ¸ð¸®¹ö½º Ư¼º, CPU ij½Ã ¶óÀÎ Á¤·Ä, ÆÄÀÌÇÁ¶óÀÎ, ºÎµ¿¼Ò¼öÁ¡ ·çƾ±îÁö °í·ÁÇÑ ÃÖÀûÈ ¹æ½ÄÀº ´Ù·çÁö ¾Ê¾Ò´Ù. ´ÙÀ½¿¡ ±âȸ°¡ »ý±â¸é CPU ¾ÆÅ°ÅØÃ³¿Í °ü·ÃÇØ¼ Á» ´õ ±íÀÌ ÀÖ´Â ÃÖÀûÈ ±â¹ýÀ» ´Ù·ç±â·Î ¾à¼ÓÇϸç, ¾µ¸¸ÇÑ Âü°í ÀڷḦ Á¤¸®ÇØ µÎ¾úÀ¸´Ï Âü°íÇÏÀÚ. @
Âü°íÀÚ·á
1. ARM System Developer¡¯s Guide, (ÁÖ) ¾¾·¦½Ã½º ¿ª, Andrew N. Sloss, Dominic Symes, Chris Wright Àú, 2005³â »çÀÌÅØ ¹Ìµð¾î Ãâ°£.
2. ÀÓº£µðµå ¸Þ¸ð¸® ÃÖÀûÈ ±â¹ý, ¿©ÀÎÃá ¿ª, Kris Kaspersky Àú, 2004³â ¿¡ÀÌÄÜ Ãâ°£.
3. GCC ¿ÏÀü Á¤º¹, ±è°æÇå ¿ª, Kurt Wall°ú William von Hagen Àú, 2006³â ¿¡ÀÌÄÜ Ãâ°£.
4. ¸®´ª½º ¹®Á¦ ºÐ¼®°ú ÇØ°á, ¹ÚÀçÈ£ ¿ª, ¸¶Å© Àªµù Àú, 2006³â ¿¡ÀÌÄÜ Ãâ°£.
5. ¸®´ª½º µð¹ö±ë°ú ¼º´É Æ©´×, ¹ÚÀçÈ£ ¿ª, ½ºÆ¼ºê º£½ºÆ® Àú, 2006³â ¿¡ÀÌÄÜ Ãâ°£.
6. Inside the machine, John Stokes, 2007. No Starch Press Ãâ°£.
7. À§Å°Çǵð¾Æ(ÃÖÀûÈ): http://en.wikipedia.org/wiki/Optimization_%28computer _science%29
8. PowerPC Compiler Writer¡¯s Guide: http://openlook.org/blog/684
9. x86 ABI: http://www.caldera.com/developers/devspecs/abi386-4.pdf
10. x86_64 ABI: http://www.x86-64.org/documentation/abi.pdf
11. PowerPC 32bit ABI: http://www-3.ibm.com/chips/techlib/techlib.nsf/ techdocs/852569B20050FF77852569970071B0D6/$file/eabi_app.pdf
12. PowerPC 64bit ABI: http://www.freestandards.org/spec/ELF/ppc64/PPCelf64abi-1.9.html
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.