|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Programming from the Ground UpProgramming from the Ground UpÀ±»ó¹è| 고친 과정 |
|---|
| 고침 0.8 | 2004³â 2¿ù 09ÀÏ 19½Ã | | | ÃÖÃÊ ¹®¼ÀÛ¼º |
ÀÌ ¹®¼´Â ProgrammingGroundUpÀÇ ¹ø¿ª ¹®¼´Ù. °èȹÀ¸·Î´Â ÇÏ·ç Çѽ𣾿À»
¹ø¿ª¿¡ ÅõÀÚÇÒ »ý°¢ÀÌÁö¸¸ »ý°¢Ã³·³ Àß µÉ·±Áö´Â ¸ð¸£°Ú´Ù. ´©±º°¡ Âü¿©ÇÏ´Â
»ç¶÷ÀÌ ÀÖ´Ù¸é ÈξÀ ÁøÇàÀÌ »¡¶óÁú °ÍÀ̶ó°í »ý°¢µÈ´Ù.
¹ø¿ªÀº ¸Å¿ì ´À½¼ÇÏ°Ô ÀÌ·ç¾îÁú °ÍÀÌ´Ù. Áï ÇÊ¿ä¾ø´Ù°í »ý°¢ µÇ´Â ºÎºÐÀº
°ú°¨È÷ »ý·«ÇÒ ¼ö ÀÖÀ¸¸ç, ºñ½ÁÇÑ ´Ù¸¥ ¸»·Ð ¹Ù²ð ¼ö ÀÖÀ¸¸ç Ãß°¡ µÉ ¼öµµ
ÀÖ´Ù. ¹ø¿ª ¼ø¼¿ª½Ã °¢ÀåÀÇ ¼ø¼¸¦ µû¸£Áö´Â ¾ÊÀ» ¼öµµ ÀÖ´Ù(°ü½ÉÀÖ´Â
ºÎºÐºÎÅÍ ¹ø¿ªÀÌ ÀÌ·ç¾îÁú °ÍÀÌ´Ù).
1. ¼Ò°³
1.2. »ç¿ëÇÏ´Â µµ±¸ ÀÌÃ¥Àº x86 ÇÁ·Î¼¼½º±â¹ÝÀÇ GNU/Linux ¿î¿µÃ¼Á¦¿¡¼ ¾î¼Àºí¸®¾î¸¦
ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇØ¼ ´Ù·é´Ù. ÀÌ·± ÀÌÀ¯·Î ÀÌÃ¥ÀÇ ¸ðµç ¿¹Á¦¿Í
ÀÌ¿¡ ´ëÇÑ ¼³¸íÀº GNU/Linux»ó¿¡¼ GCCµµ±¸¸¦ ÀÌ¿ëÇØ¼ ÀÌ·ç¾îÁú °ÍÀÌ´Ù.
ÀÌ´Â ¿©·¯ºÐÀÌ GNU/Linux¿Í GCCµµ±¸¿¡ ´ëÇÑ ÀÌÇØ°¡ ºÎÁ·ÇÒ°æ¿ì Ã¥ÀÇ ³»¿ëÀ»
ÀÌÇØÇϴµ¥ ÀÖ¾î ¹®Á¦°¡ µÉ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù. ¸¸¾à Linux¿Í GCC¿¡ »ý¼Ò
ÇÏ´Ù¸é ÀÌÃ¥À» Àбâ Àü¿¡ http://rute.sourceforge.netÀÇ ¹®¼¸¦ Àоî
º¸±â ¹Ù¶õ´Ù. ¿µ¹®À» º¸±â ½È´Ù¸é ¼Á¡¿¡¼ ¸Å¿ì Àß ¹ø¿ªµÈ ¸¹Àº ¸®´ª½º °ü·Ã
¼ÀûÀ¸·Î ¸®´ª½º¿¡ ´ëÇÑ ½ºÅ͵𸦠´ë½ÅÇÒ ¼öµµ ÀÖ´Ù.
¸®´ª½º °ü·Ã ¹®¼¿Í Ã¥Àº ºÐ¸í ¸¹Àº µµ¿òÀ» ÁÖ±ä ÇÏÁö¸¸ ±×¶§ ±×¶§ ´ÚÄ¡´Â
½Ç½Ã°£¼ºÀÇ Àǹ®Á¡µîÀ» ÇØ°áÇϰí Ã¥¿¡¼´Â ¾ò±â Èûµç µµ¿òÀ» ¾ò±â
¿øÇÑ´Ù¸é ¸®´ª½º À¯Àú ±×·ìÀ» Ȱ¿ëÇÏ¸é µÈ´Ù.
kldp¿Í
joinc,
gentoo¿Í °°Àº »çÀÌÆ®¸¦
ÀÌ¿ëÇϱ⠹ٶõ´Ù. Á»´õ ½Ç½Ã°£ÀÇ µµ¿òÀ» ¿øÇÑ´Ù¸é irc¸¦ ÀÌ¿ëÇϱ⠹ٶõ´Ù.
¿©±â¿¡ ÀÖ´Â ÇÁ·Î±×·¥µéÀº RedHat Linux 9.0, Kernel 2.6.x ȯ°æ¿¡¼
ÀÛ¼ºµÇ°í Å×½ºÆ®µÉ °ÍÀÌ´Ù. ´Ù¸¥ ¹èÆ÷ÆÇÀ» »ç¿ëÇϰí ÀÖ´Ù°í ÇØ¼
°ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾øÀ» °ÍÀÌ´Ù. ÆÐŰÁö °ü¸®, ½Ã½ºÅÛ °ü¸®¿Í °ü·ÃµÈ »çÇ×µéÀ»
Á¦¿ÜÇϰí´Â °ÅÀÇ 100% ȣȯÀ» Àå´ãÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.
¿©·¯ºÐÀÇ PC¿¡ Á÷Á¢ ¸®´ª½º¸¦ ¼³Ä¡Çؼ °øºÎ¸¦ ÇÏ´Â°Ô °¡Àå ÁÁÀº ¹æ¹ýÀ̱ä
ÇÏÁö¸¸ ÀÌ°Ô ¿©ÀÇÄ¡ ¾ÊÀ» °æ¿ì ¸®´ª½º °èÁ¤À» ¾òÀ» ¼ö ÀÖ´Â ½Ã½ºÅÛÀ»
¼ö¼Ò¹®ÇØ º¸±â ¹Ù¶õ´Ù. ¿©·¯ºÐ ÁÖÀ§ÀÇ ¸®´ª½º ½Ã½ºÅÛÀ» °¡Áö°í Àִ ģÇÑ
Ä£±¸¿¡°Ô ¹äÇѳ¢ »çÁÖ°í Àý´ë ½Ã½ºÅÛ¿¡¼ ÀÌ»óÇÑ ÇൿÀ» ÇÏÁö ¾Ê°Ú´Ù°í
´ÙÁüÇØ ÁØ´Ù¸é ½±°Ô ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ Ä£±¸°¡ ¾ø´Ù¸é
¾î¿ ¼ö ¾ø´Ù. ¸®´ª½º¸¦ ¼³Ä¡Çϱ⠹ٶõ´Ù. À§¿¡¼ ¾ð±ÞÇß´ø ¸®´ª½º À¯Àú
¸ðÀӵ¼ ½© °èÁ¤À» ¾òÀ» ¼öµµ ÀÖ°ÚÁö¸¸ ¿©·¯ºÐÀÌ ¿À·£½Ã°£µ¿¾È
À¯Àú ¸ðÀÓ¿¡¼ Ȱµ¿À» ÇØ¼ ÃæºÐÇÑ ½Å·Ú¸¦ ½×Àº °æ¿ì°¡ ¾Æ´Ï¶ó¸é °èÁ¤À»
¾ò´Â°Ç ¸Å¿ì Èûµç ÀÏÀÌ µÉ°ÍÀÌ´Ù.
±×·±µ¥ ¸®´ª½º°¡ ¹¹Áö? ¶ó°í ±Ã±ÝÇØ ÇÒ ¼öµµ ÀÖÀ» °Í °°À¸´Ï, °£´ÜÈ÷
¾ð±ÞÇϵµ ³Ñ¾î°¡µµ·Ï ÇϰڴÙ. ¸®´ª½º´Â À¯´Ð½º¿Í ¸Å¿ì ºñ½ÁÇÑ
¿î¿µÃ¼Á¦·Î GNU
ÇÁ·ÎÁ§Æ®ÀÇ ÀϺηΠ°³¹ßµÇ¾îÁö°í ÀÖ´Â °ø°³ ¿î¿µÃ¼Á¦´Ù. ¸®´ª½º ¿î¿µÃ¼Á¦´Â
¸®´ª½º Ä¿³Î°ú ±× ¹ÛÀÇ ´Ù¸¥ ¼ö¸¹Àº GNUÇÁ·ÎÁ§Æ®¿¡ ÀÇÇØ¼ °³¹ßµÈ
ÀÀ¿ëÇÁ·Î±×·¥À¸·Î ±¸¼ºµÈ´Ù. ÀÌ·¯ÇÑ ÀÀ¿ëÇÁ·Î±×·¥ Áß¿¡ GCCµµ±¸°¡
Æ÷ÇԵǾî Àִµ¥, ÀÌ°É ÀÌ¿ëÇØ¼ ´Ù¾çÇÑ (ÇÁ·Î±×·¡¹Ö)¾ð¾î·Î ÀÛµ¿°¡´ÉÇÑ
ÇÁ·Î±×·¥À» ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù.
¸®´ª½º ¿î¿µÃ¼Á¦ÀÇ ÇÙ½ÉÀº Ä¿³Î(kernel)À̸ç, ¾ö°ÝÇÑ Àǹ̷Π¸®´ª½º´Â ÀÌ
Ä¿³ÎÀ» °¡¸£Å²´Ù. Ä¿³ÎÀº ¿î¿µÃ¼Á¦ÀÇ ÇÙ½ÉÀ¸·Î½á ¸ðµç °ÍÀ» Á¦¾îÇÑ´Ù.
ÀÎü·Î ¸»ÇÏÀÚ¸é µÎ³úÂë µÇ´Â ºÎºÐÀÏ °ÍÀÌ´Ù. µÎ³ú´Â ½Å°æÀ¸·Î Àü´ÞµÇ´Â
¿ÜºÎÀÇ ÀÚ±ØÀ» ¹Þ¾ÆµéÀ̰í ÀÚ±ØÀ» ÇØ¼®Çؼ °¢ ±â°üÀ» ¿òÁ÷ÀδÙ.
¹ú·¡°¡ ´«¾ÕÀ¸·Î ´Þ·Áµé¸é ´«À» °¨´Â´Ù°Å³ª, ¶ß°Å¿î ¹°°ÇÀ» Áã¾úÀ» °æ¿ì
¹Ý»çÀûÀ¸·Î ¼ÕÀ» ¿òÃ߸®°Å³ª ÇÏ´Â µîÀÇ ÇൿÀÌ ±×°ÍÀÌ´Ù. Ä¿³ÎÀº
»ç¿ëÀÚÀÇ ¸í·ÉÀ» ¹Þ¾Æµé¿©¼ ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇÏ°í °¢Á¾
ÀåÄ¡(ÀÎü·Î ¸»ÇÏÀÚ¸é ±â°ü)À» Á¦¾îÇÑ´Ù. ¶ÇÇÑ ´ÙÁßÀÇ ÇÁ·Î¼¼½º°¡ ÀÛµ¿ÁßÀÏ
°æ¿ì ÇÁ·Î¼¼½º¸¦ ½ºÄÉÁ층ÇÑ´Ù. ¿¹¸¦ µé¾î Űº¸µå(ÀåÄ¡)¸¦ »ç¿ëÀÚ°¡ ´©¸£¸é
Ä¿³ÎÀº ŰÀÔ·ÂÀ» ¹Þ¾ÆµéÀ̰í ŰÀÔ·ÂÀ» Ű¿¡ ¸ÅÇεǴ ¹®ÀÚ·Î º¯È¯Çؼ ȸ鿡
Ãâ·ÂÇÒ °ÍÀÌ´Ù. ¸¸¾à X Windows ½Ã½ºÅÛÀ̶ó¸é À©µµ¿ì ½Ã½ºÅÛÀº Ä¿³Î·Î ºÎÅÍ
ŰÀÔ·ÂÀ» ÀÐ¾î µéÀ̰í ÇöÀç ¶°ÀÖ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÀÔ·Ââ¿¡ ¹®ÀÚ¸¦
Ãâ·ÂÇÑ´Ù.
Keyboard -> Kernel -> Windowing system -> Application program
|
À§ÀÇ Å°º¸µå ÀÔ·ÂÀ» º¸¸é Ä¿³ÎÀº À©µµ¿ì ½Ã½ºÅÛ°ú ÀåÄ¡ ±×¸®°í ¾ÖÇø®ÄÉÀ̼Ç
ÇÁ·Î±×·¥°£ÀÇ µ¥ÀÌÅÍ È帧À» Á¦¾îÇÑ´Ù. ¿©±â¿¡¼ Ä¿³ÎÀÌ ÀåÄ¡¿Í ÇÁ·Î±×·¥
»çÀÌ, ÇÁ·Î±×·¥°ú ÇÁ·Î±×·¥ »çÀÌÀÇ Á¤º¸ÀÇ È帧À» Á¦¾îÇÔÀ» ¾Ë ¼ö ÀÖ´Ù.
ÇÁ±×·¥ÀÌ ´Ù·ç´Â °¢°¢ÀÇ µ¥ÀÌÅÍ¿Í ÀåÄ¡ÀÇ ±ÇÇÑÀ» °ü¸®Çؼ ¼·ÎÀÇ µ¥ÀÌÅÍ ¿µ¿ªÀ»
ħÀÔÇÏÁö ¾Êµµ·Ï Á¦¾îÇÏ´Â °Í ¿ª½Ã Ä¿³ÎÀÇ Áß¿äÇÑ ±â´É Áß ÇϳªÀÌ´Ù.
ÀÌ»óÀ¸·Î Ä¿³ÎÀº °ð ¸®´ª½º¶ó´Â °É ÀÌÇØÇßÀ» °ÍÀÌ´Ù. ±×·¯³ª Ä¿³Î¸¸ ÀÖ´Ù°í ÇØ¼
¿î¿µÃ¼Á¦°¡ ÀÛµ¿ÇÒ ¼ö ÀÖ´Â °Ç ¾Æ´Ï´Ù. ȸ»ç¸¦ ¿¹·Î µé¾î º¸ÀÚ.
ÀüȰ¡ ³õ¿© ÀÖ°í ÄÄÇ»ÅͰ¡ ÀÖ´Ù°í ÇØ¼ ȸ»ç°¡ µ¹¾Æ°¡´Â °Ç ¾Æ´Ï´Ù. ½ÇÁ¦ ÀÏÀ» ÇÏ´Â
»ç¶÷ÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ÀüÈ¿Í ÄÄÇ»ÅÍ¿Í °°Àº ±â¹Ý ½Ã¼³Àº ¸®´ª½º Ä¿³ÎÀ̸ç
»ç¶÷Àº (GNU)ÀÀ¿ë ¾ÖÇø®ÄÉÀÌ¼Ç º¼ ¼ö ÀÖ´Ù. µÑÀÌ Á¶È¸¦ ÀÌ·ç¾î¾ß ¸ñÀûÀ»
´Þ¼ºÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¿ì¸®´Â Ä¿³ÎÀ̶ó´Â °®Ãß¾îÁø ±â¹Ý ½Ã¼³À§¿¡¼ ÀÛµ¿ÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÒ
°ÍÀ̸ç, ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÀÛ¼ºÀ» À§Çؼ ¾î¼Àºí¸®(assembly)¾î¸¦ »ç¿ëÇÏ´Â ¹ýÀ»
¹è¿ï °ÍÀÌ´Ù. ¾î¼Àºí¸®¾î¸¦ ´Ù·ç±âÀü¿¡ ±âº»ÀÌ µÇ´Â 3°¡Áö ¾ð¾î¿¡ ´ëÇØ¼
¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
- ±â°è¾î(Machine Language)
ÄÄÇ»ÅͰ¡ Á÷Á¢ ÀÌÇØÇÒ ¼ö ÀÖ´Â ¾ð¾î´Ù. ¸ðµç ¸í·ÉÀº ÄÄÇ»ÅͰ¡
ÀÌÇØÇÒ ¼ö ÀÖ´Â ÀÏ·ÃÀÇ ¼ýÀÚ·ÎµÈ ¸í·É¿¡ ÀÇÇØ ÀÌ·ç¾îÁø´Ù.
Ư¼öÇÑ »ç¶÷¸¸ ÀÌÇØÇÒ ¼ö ÀÖ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.
- ¾î¼Àºí¸®¾î(Assembly Language)
±â°è¾î¿Í µ¿ÀÏÇÏÁö¸¸ ÀÌÇØÇϱ⠾î·Á¿î ÀÏ·ÃÀÇ ¼ýÀÚ´ë½Å
»ç¶÷ÀÌ ÀÌÇØÇϱ⠽¬¿î ¹®ÀÚ·Î ÀÌ·ç¾îÁø´Ù.
- °í±Þ¾î(High-Level Language)
Á»´õ ½±°Ô ÇÁ·Î±×·¡¹Ö ÇÒ¼ö ÀÖµµ·Ï ¸¸µé¾îÁø ¾ð¾î·Î º¸´Ù
Àΰ£ÀÇ ¾ð¾î¿¡ ±ÙÁ¢ÇÏ´Ù. Àΰ£ÀÌ ÀÌÇØÇϱ⠽±´Ù´Â ÀåÁ¡ÀÌ ÀÖÀ¸³ª
ÇϳªÀÇ ¾î¼Àºí¸® ¸í·ÉÀ¸·Î ½ÇÇàÇØµµ µÉ°É ¿©·¯¹øÀÇ ¸í·ÉÀ¸·Î
½ÇÇàµÇ¹Ç·Î ºñÈ¿À²ÀûÀÏ ¼ö ¹Û¿¡ ¾ø´Ù.
2. ÄÄÇ»ÅÍ ±¸Á¶ ¾ð¾î¸¦ ÀÌÇØÇÏ·Á¸é ±× ¹Ø¹ÙÅÁÀÌ µÇ´Â ¹®È¸¦ ÀÌÇØÇÏ°í ¿ª»ç¸¦ ÀÌÇØÇØ¾ß ÇϵíÀÌ
ÇÁ·Î±×·¡¹ÖÀ» ÀÌÇØÇØ¼ ÇÁ·Î±×·¥À» ¸¸µé°íÀÚ ÇÑ´Ù¸é ±× ¹Ø¹ÙÅÁÀÌ µÇ´Â ÄÄÇ»ÅÍ¿¡
´ëÇØ¼ ÀÌÇØÇϰí ÀÖ¾î¾ß ÇÑ´Ù. ¹°·Ð ¿©·¯ºÐÀÌ ÀüÀÚ°øÇÐÀ» °øºÎÇÒ ÇÊ¿ä´Â ¾ø°ÚÁö¸¸
Àû¾îµµ ÄÄÇ»ÅÍ¿¡¼ ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô ½ÇÇàµÉ ¼ö ÀÖ´ÂÁö¿Í °°Àº ±âº»ÀûÀÎ °Í¿¡
´ëÇÑ ÀÌÇØ Çϰí ÀÖ¾î¾ß ÇÑ´Ù.
ÇöÀç ÄÄÇ»ÅÍÀÇ ±¸Á¶´Â ±¸Á¶¸¦ ¸¸µç â½ÃÀÚÀÇ À̸§À» µý Von Neumann(Æù ³ëÀ̸¸)À̶ó°í
ºÒ¸®¿ì´Â ±¸Á¶¿¡ ±â¹ÝÀ» µÎ°í ÀÖ´Ù. Æù ³ëÀ̸¸Àº ÄÄÇ»ÅÍÀÇ ±¸Á¶¸¦
CPU(Central Processing Unit)¿Í ¸Þ¸ð¸®(memory)ÀÇ µÎ°³ÀÇ ÁÖ¿ä ºÎºÐÀ¸·Î ³ª´©¾î¼
±¸¼ºÇß´Ù. ÀÌ ±¸Á¶´Â °³ÀÎ ÄÄÇ»ÅÍ, ½´ÆÛ ÄÄÇ»ÅÍ, ¸ÞÀÎ ÇÁ·¹ÀÓ ½ÉÁö¾î´Â ÇÚµåÆù°ú °°Àº
¸ðµç Çö´ëÀûÀÎ ÄÄÇ»ÅͰ¡ äÅÃÇϰí ÀÖ´Ù. °£´ÜÈ÷ ¸»Çؼ "¿¬»ê"°ú "ÀúÀå"ÀÇ µÎ ºÎºÐÀ¸·Î
³ª´©¾ú´Ù.
2.1. ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸® ±¸Á¶ ÄÄÇ»ÅͰ¡ ¸Þ¸ð¸®¸¦ º¸´Â ¹æ½ÄÀ» ½±°Ô ÀÌÇØÇÏ·Á¸é ´Ù¼¼´ë ÁÖÅÿ¡ ºñÄ¡µÇ¾î ÀÖ´Â
¿ìÆíÇÔÀ» »ý°¢ÇϸéµÈ´Ù. ¿ìÆíÇÔÀº ±âº»ÀûÀ¸·Î ÇØ´ç È£¼ö¿¡ »ç´Â »ç¶÷ÀÌ ¿°¶÷ÀÌ
°¡´ÉÇÏ¸ç ¿¶÷ÇØ¾ßÇÒ ¿ìÆíÇÔÀ» ½±°Ô ãÀ» ¼ö ÀÖµµ·Ï ¹øÈ£(º¸Åë È£¼ö)°¡ ¸Þ°ÜÁ®
ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÄÄÇ»ÅͰ¡ ¸Þ¸ð¸®¸¦ º¸´Â °üÁ¡¿ª½Ã ÀÌ¿Í ºñ½ÁÇÏ´Ù. ÄÄÇ»ÅÍ´Â
°¢ ¸Þ¸ð¸® ¿µ¿ªÀ» ½±°Ô ã¾Æ³»¾î¼ µ¥ÀÌÅ͸¦ ÀúÀåÇϰųª °¡Á®¿Ã ¼ö ÀÖµµ·Ï
Çϱâ À§Çؼ ¹øÈ£°¡ ¸Þ°ÜÁ® ÀÖ´Ù. ¿¹¸¦ µé¾î¼ ´ç½ÅÀÇ ÄÄÇ»ÅͰ¡ 256MbyteÀÇ
¸Þ¸ð¸®¸¦ °¡Áö°í ÀÖ´Ù´Â °ÍÀº ´ç½ÅÀÇ ÄÄÇ»ÅͰ¡ 256*¹é¸¸ÀÇ ÀúÀå °ø°£À» °¡Áö°í
ÀÖÀ½À» ÀǹÌÇÑ´Ù. 256*¹é¸¸ °³ÀÇ ¿ìÆíÇÔÀ» °¡Áö°í ÀÖ´Â °ÍÀÌ´Ù. °¢°¢ÀÇ ¿µ¿ªÀº
À¯ÀÏÇÏ°Ô ±¸º°µÉ ¼ö ÀÖ´Â ¹øÈ£°¡ ¸Þ°Ü Áø´Ù.
ÄÄÇ»ÅͰ¡ À§¿Í °°Àº ¹æ¹ýÀ¸·Î ¸Þ¸ð¸®¸¦ °ü¸®ÇÏ´Â ÀÌÀ¯´Â °£´ÜÇÑ °ü¸®°¡ °¡´ÉÇϱâ
¶§¹®ÀÌ´Ù. ¸¸¾à ÄÄÇ»ÅͰ¡ µ¥ÀÌÅÍÀÇ Å©±â¿¡ µû¸¥ °¡º¯Å©±âÀÇ ´Ù¾çÇÑ Å©±âÀÇ ¸Þ¸ð¸®
¿µ¿ªÀÇ Á¶ÇÕÀ» °ü¸®ÇØ¾ß ÇÑ´Ù¸é ÀÌµé ¸Þ¸ð¸®¿µ¿ªÀ» ´Ù·ç±â°¡ ¸Å¿ì ¾î·Á¿ï °ÍÀÌ´Ù.
¸Þ¸ð¸®¿¡´Â ÄÄÇ»ÅÍÀÇ ¿¬»ê¿¡ ÇÊ¿äÇÑ ¸ðµç Á¤º¸°¡ ÀúÀåµÈ´Ù. Áö±Ý ´ç½ÅÀÌ »ç¿ëÇϰí
ÀÖ´Â ÄÄÇ»Å͸¦ ¿¹·Î µé¾îº¸µµ·Ï ÇÏÀÚ. Áö±Ý ´ç½ÅÀÌ »ç¿ëÇÏ´Â ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸®¿¡´Â
´ÙÀ½°ú °°Àº ³»¿ëµéÀÌ ÀúÀåµÇ¾î ÀÖÀ» °ÍÀÌ´Ù.
Ä¿¼ÀÇ ½ºÅ©¸°»ó¿¡¼ÀÇ À§Ä¡
½ºÅ©¸°»ó¿¡ Á¸ÀçÇÏ´Â °¢ À©µµ¿ìÀÇ À§Ä¡¿Í Å©±âµé
»ç¿ëÇϰí ÀÖ´Â ÆùÆ®ÀÇ Á¤º¸µé
°¢ À©µµ¿ì¿¡¼ »ç¿ëÇϰí ÀÖ´Â À§Á¬µé(¹öư, ¹Ú½º, ¸Þ´º)
¾ÆÀÌÄÜÀÇ ±×·¡ÇÈ Á¤º¸
´ëÈ»óÀÚ µî¿¡ Ç¥½ÃµÇ´Â ¸Þ½ÃÁöµé
±âŸ
¸Þ¸ð¸®¿¡ µ¥ÀÌÅͰ¡ ÀÖ´Ù¸é µ¥ÀÌÅ͸¦ ´Ù·ç´Â ÇÁ·Î±×·¥µéµµ ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ¸Þ¸ð¸® µ¥ÀÌÅ͸¦ ¾²°Å³ª Àд ÀÏÀ» ÇÒ °ÍÀÌ´Ù. µ¥ÀÌÅͿʹÂ
Á» ´Ù¸¥ Ư¼ºÀ» °¡Áö°í ÀÖÀ¸¹Ç·Î µ¥ÀÌÅÍ¿Í Á» ´Ù¸£°Ô Ãë±ÞµÉ ¼ö ÀÖÀ»°Å¶ó
»ý°¢µÉ ¼ö ÀÖÁö¸¸ Æù ³ëÀ̸¸ ±¸Á¶¿¡ ÀÇÇØ À̵é ÇÁ·Î±×·¥¿ª½Ã µ¥ÀÌÅÍ¿Í
µ¿ÀÏÇÏ°Ô ¸Þ¸ð¸®¿¡ ÀúÀåµÈ´Ù. Æù ³ëÀ̸¸ ±¸Á¶¸¦ µû¸£´Â ÄÄÇ»ÅÍÀÇ ÀÔÀå¿¡¼
º¸ÀÚ¸é ÇÁ·Î±×·¥ ¿ª½Ã µ¥ÀÌÅÍÀÏ »ÓÀÌ´Ù.
2.2. CPU ¸Þ¸ð¸®¿¡ µ¥ÀÌÅͰ¡ ÀúÀåµÇ¾î ÀÖ´Ù°í´Â ÇÏÁö¸¸ À̰͸¸ °¡Áö°í´Â
¾Æ¹«·± Àǹ̰¡ ¾ø´Ù. ´ÜÁö ºñÆ®ÀÇ ³ª¿ »ÓÀ¸·Î µ¥ÀÌÅ͸¦ ¾µ¸ð ÀÖ´Â Á¤º¸·Î
¹Ù²Ù±â À§Çؼ´Â µ¥ÀÌÅ͸¦ ÀоîµéÀ̰í, ¼öÁ¤Çϰí, ¿Å±â´Â µîÀÇ ÀÏÀ»
ÇØ¾ß¸¸ÇÑ´Ù. ÀÌ·¯ÇÑ ÀÏÀº CPU°¡ ´ã´çÇÏ°Ô µÈ´Ù.
CPU´Â ÇѹøÀÇ ½Ã°£¿¡ ¸Þ¸ð¸®·Î ºÎÅÍ ¸í·É(instruction)À» ÀÐ¾î µéÀ̰í
À̰͵éÀ» ½ÇÇàÇÑ´Ù. À̰ÍÀ» fetch-execute cycle
¶ó°í Çϴµ¥, ÀÌ ¸í·É¿¡´Â ´ÙÀ½°ú °°Àº ¿ä¼ÒµéÀÌ Æ÷ÇԵǾî ÀÖ´Ù.
program counter´Â ÄÄÇ»ÅÍ¿¡°Ô ´ÙÀ½ ¼öÇàÇØ¾ßµÉ
¸í·É(instruction)À» ¾Ë·ÁÁÖ±â À§Çؼ »ç¿ëÇÑ´Ù. ¿ì¸®´Â ¾Õ¼ ÄÄÇ»ÅÍÀÇ
ÀÔÀå¿¡¼ ÇÁ·Î±×·¥°ú µ¥ÀÌÅͰ¡ ¸Þ¸ð¸®¿¡ ÀúÀåµÇ´Â ¹æ½Ä¿¡ ÀÇÇØ¼´Â
¾î¶°ÇÑ Â÷À̵µ ¾ø´Ù°í ¹è¿ü¾ú´Ù. ´ÜÁö ÇØ¼®¿¡ ÀÖ¾î¼ Â÷À̰¡ ÀÖÀ» »ÓÀÌ´Ù.
program counterÀº ½ÇÇàµÉ ´ÙÀ½ ¸í·ÉÀÌ ÀúÀåµÇ¾î ÀÖ´Â ¸Þ¸ð¸®ÁÖ¼Ò°ªÀ»
°¡Áö°í ÀÖ´Ù. instruction decoder´Â ¼öÇàÇØ¾ßµÉ
¸í·ÉÀÇ Çü½ÄÀ» ¾Ë·ÁÁÖ±â À§Çؼ »ç¿ëµÈ´Ù. ¼öÇàÇØ¾ßµÉ ¸í·ÉÀÇ Çü½ÄÀ̶õ
´Ù¸§ ¾Æ´Ñ ´õÇϱâ, »©±â, °öÇϱâ, µ¥ÀÌÅÍ À̵¿°ú °°Àº °ÍµéÀÌ´Ù.
À̻󿡼 ÄÄÇ»ÅÍÀÇ ¼öÇàÀº ¸í·Éµé°ú ¸í·ÉÀÌ ÀúÀåµÈ ¸Þ¸ð¸® À§Ä¡ÀÇ
¸ñ·Ï¿¡ ÀÇÇØ¼ ÀÌ·ç¾î ÁüÀ» ¾Ë ¼ö ÀÖ´Ù.
ÀÌÁ¦ ÄÄÇ»ÅÍ´Â ¾î¶² ÀÏÀ» ¼öÇàÇÒ Áغñ°¡ µÇ¾îÀÖ´Ù. ÀÏÀ» ¼öÇà(°è»ê)Çϱâ
À§Çؼ´Â µ¥ÀÌÅͰ¡ ÀÖ¾î¾ß ÇÑ´Ù. data bus´Â
°è»êÇÒ µ¥ÀÌÅͰ¡ ÀÖ´Â ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ °¡Áø´Ù. data bus¶ó°í ºÒ¸®¿ì´Â
ÀÌÀ¯´Â CPU¿Í Memory»çÀ̸¦ ¿¬°áÇØÁֱ⠶§¹®ÀÌ´Ù. ¹ö½º¶ó´Â°Ç ÇϳªÀÇ
°´Ã¼¿¡ ÇÊ¿ä·Î ÇÏ´Â ¿©·¯°³ÀÇ ´Ù¸¥ °´Ã¼¸¦ ¿¬°áÇÏ´Â ±¸Á¶¸¦ ¸»ÇÑ´Ù.
¿î¼Û¼ö´ÜÀ¸·Î ÀÌ¿ëÇÏ´Â ¹ö½º¸¦ »ý°¢ÇÏ¸é µÉ°ÍÀÌ´Ù.
ÀüÇüÀûÀ¸·Î º¸ÀÚ¸é ¸Þ¸ð¸®´Â CPU(ÀÌÇÏ ÇÁ·Î¼¼¼)ÀÇ ¿ÜºÎ¿¡ À§Ä¡Çϰí ÀÖ´Ù.
±×·¸Áö¸¸ ÇÁ·Î¼¼¼µµ register¶ó°í ºÒ¸®¿ì´Â ºü¸£°Ô
Á¢±Ù °¡´ÉÇÑ(¹°¸®ÀûÀ¸·Î °¡±õ±â ¶§¹®¿¡) ÀÚü ¸Þ¸ð¸®¸¦ °¡Áö°í ÀÖ´Ù.
ÀÌ·¯ÇÑ ·¹Áö½ºÅÍ´Â ÀϹݸñÀû(general-purpose) ·¹Áö½ºÅÍ¿Í
Ưº°¸ñÀû(special-purpose) ·¹Áö½ºÅÍÀÇ µÎ°¡Áö Á¾·ù·Î ³ª´¶´Ù.
ÀÏ¹Ý ¸ñÀû ·¹Áö½ºÅÍ´Â ¸»±×´ë·Î ´õÇϱâ, »©±â, °öÇϱâ, ºñ±³¿Í °°Àº ÀϹÝÀûÀÎ
¸í·ÉÀ» À§Çؼ »ç¿ëµÈ´Ù. ÄÄÇ»ÅÍ´Â Á¦ÇÑµÈ ¸î°³¸¸ÀÇ ÀÏ¹Ý ¸ñÀû ·¹Áö½ºÅ͸¦
°¡Áö°í ÀÖÀ» »ÓÀÌ¸ç ´ëºÎºÐÀº ÁÖ(main)¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÑ´Ù.
ÀÌÁ¦ CPU°¡ ÇÊ¿ä·Î ÇÏ´Â µ¥ÀÌÅ͸¦ °¡Á®¿Ô´Ù¸é decoded instruction¿¡ µû¶ó¼
¼öÄ¡¿¬»ê(arithmetic)°ú ³í¸®¿¬»ê(logic)À» ¼öÇàÇÑ´Ù. À̰͵éÀº ½ÇÁ¦
¼öÇàµÇ´Â ¸í·Éµé·Î½á ¿¬»ê¼öÇà °á°ú´Â data bus¸¦ ÅëÇØ¼ ÁÖ ¸Þ¸ð¸®°ø°£
À̳ª ·¹Áö½ºÅ͸®¿¡ ÀúÀåµÈ´Ù.
CPUÀÇ ÀÌ·¯ÇÑ ÀÛµ¿Àº ¸Å¿ì ½ÉÇÃÇÏ´Ù(¸¸¾à ±×·¸Áö ¾Ê´Ù¸é CPUÁ¦ÀÛ ´Ü°¡°¡
±ØÀûÀ¸·Î ¿Ã¶ó°¥ °ÍÀÌ´Ù). ºñ·Ï Ãʱâ ÇÁ·Î¼¼¼¿¡ ºñÇØ¼ ÇöÀçÀÇ
ÇÁ·Î¼¼½º°¡ ¸Å¿ì ¸¹Àº ¹ßÀüÀ» ÇÏ°í ¸Å¿ì º¹ÀâÇØÁö±â´Â ÇßÁö¸¸
±âº»ÀûÀÎ ÀÛµ¿¹æ½ÄÀº ÃʱâÀÇ ¸ðµ¨À» µû¸£°í ÀÖ´Ù. ´Ù¸¸ ¿©±â¿¡
chache hierarchies, superscalar processors, pipelining, branch prediction,
out-of-order execution, microcode translation, coprocessorsµîÀÇ
(¸Å¿ì »ý¼ÒÇÑ)±â¼úÀÌ Ãß°¡ µÇ¾î¼ ¼º´ÉÀ» Çâ»ó ½ÃÄ×´Ù´Â °Í¸¸ ´Ù¸£´Ù°í
ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¼º´ÉÇâ»ó ±â¼úµéÀº ¿É¼ÇÀ¸·Î ºÙÀº »çÇ×À̶ó°í º¸¸é
µÇ°Ú´Ù. À§ÀÇ ´Ü¾îµéÁß pipelining¿Í coprocessors(¼öÄ¡¿¬»ê ÇÁ·Î¼¼½º)
¿Ü¿¡´Â óÀ½ Á¢Çغ» ´Ü¾îµéÀÌ ¸¹À» °Çµ¥, ±×·¸´Ù°í ÇØ¼ ±×¸® °ÆÁ¤ÇÒ
ÇÊ¿ä´Â ¾ø´Ù. Àú°ÍµéÀ» ¸ð¸¥´Ù°í ÇØµµ CPUÀÇ ±âº»ÀÛµ¿ ¹æ½ÄÀ» ÀÌÇØÇϴµ¥
º° ¹®Á¦´Â ¾ø´Ù. ²À ¾Ë¾Æ¾ß °Ú´Ù¸é ÀÎÅͳÝÀ» ÅëÇØ¼ CPU¿¡ ´ëÇÑ ´õ¿í
ÀÚ¼¼ÇÑ ³»¿ëÀ» ã¾Æ º¸±æ ¹Ù¶õ´Ù.
2.3. ¸î °¡Áö ¿ë¾îµé ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸®´Â °íÁ¤µÈ Å©±â¸¦ °¡Áö´Â ¿¬¼ÓµÈ ¼ýÀÚ¸¦ °¡Áö´Â ÀúÀå°ø°£ÀÇ
¿¬¼ÓÀÌ´Ù. ÀÌµé ¼ýÀÚ´Â ÀúÀå°ø°£ÀÇ À§Ä¡¸¦ °¡¸®Å°´Âµ¥ À̸¦
'''ÁÖ¼Ò(address)'''¶ó°í ÇÑ´Ù. °íÁ¤µÈ Å©±â¸¦ °¡Áö´Â ´ÜÀÏ °ø°£À»
X86 ÇÁ·Î¼¼¼¿¡¼´Â '''byte'''¶ó°í ºÎ¸£¸ç 0¿¡¼ 255»çÀÌÀÇ °ªÀ» °¡Áø´Ù.
ÁÖ¼Ò°ø°£ÀÇ Å©±â°¡ 0¿¡¼ 255ÀÇ °ªÀ» °¡Áø´Ù°í Çß´Ù.
¾Æ¸¶µµ ȸ鿡 Ç¥½ÃµÇ´Â ¹®ÀÚ¿Í ±×¸²À» Ç¥ÇöÇϱâ À§Çؼ´Â ÈξÀ Å« °ªÀÌ
ÇÊ¿äÇÒ °ÍÀÌ´Ù. ÀÌ·±°ÍµéÀº ¾î¶»°Ô Ç¥ÇöÇÒ±î ? ÀÌ·¯ÇÑ Ç¥ÇöÀº
±×·¡ÇÈ Ä«µå(graphics card)°¡ ÀÖÀ½À¸·Î °¡´ÉÇØ Áø´Ù. ±×·¡ÇÈ Ä«µå´Â
¿¬¼ÓµÈ ¿©·¯°³ÀÇ °ªµéÀ» ÇØ¼®Çؼ ȸ鿡 Ãâ·Â½ÃŲ´Ù. ȸ鿡
µ¥ÀÌÅ͸¦ Ãâ·ÂÇÒ ¶§´Â ÀоîµéÀÎ °ªÀ» ASCII Äڵ忡 ¸ÊÇÎ ½ÃÄѼ ¿©±â¿¡
ÀÖ´Â °ªÀ» ȸ鿡 »Ñ·ÁÁÖ°Ô µÈ´Ù. ¿¹¸¦ µé¾î ÀоîµéÀÎ °ªÀÌ 65¶ó¸é 'A'°¡
ȸ鿡 Ãâ·ÂµÈ´Ù. ȸ鿡 "HELLO"¸¦ Ãâ·ÂÇϱâ À§Çؼ´Â
72, 69, 76, 76, 79ÀÇ ¿¬¼ÓµÈ °ªµéÀ» ÇÊ¿ä·Î ÇÑ´Ù. ´ÙÀ½Àº ASCII ÄÚµåÇ¥ÀÌ´Ù.
ºÐ¸í 0¿¡¼ 255±îÁöÀÇ °ªÀ̶ó°í Çߴµ¥ ¿Ö 127±îÁö ¹Û¿¡ ¾øÁö? ¶ó°í »ý°¢ÇÒ
¼ö ÀÖÀ» °Í °°´Ù. ½ÇÁ¦ ȸéÃâ·Â°ú Á¦¾î¸¦ À§Çؼ´Â 0-127±îÁöÀÇ °ªÀ»
»ç¿ëÇÑ´Ù. 128¿¡¼ 255´Â Extended ASCII Codes¶ó°í ºÒ¸®¿ì¸ç ¿µ¹®¿ÜÀÇ
´Ù¸¥ ¹®ÀÚµé(ƯÈ÷ 2¹ÙÀÌÆ® ¹®ÀÚ)°ú Ư¼ö ¹®ÀÚµéÀ» ³ªÅ¸³»±â À§Çؼ »ç¿ë
ÇÑ´Ù.
±×·¸´Ù¸é 255º¸´Ù ´õÅ« °ªÀº ¾î¶»°Ô ÇØ¾ß ´Ù·ê ¼ö ÀÖÀ»±î ? À̰ÍÀº ¹ÙÀÌÆ®¸¦
µÎ°³ ÀÌ»ó °áÇÕÇÔÀ¸·Î¼ °¡´ÉÇØ Áø´Ù. µÎ ¹ÙÀÌÆ®¶ó¸é 0¿¡¼ 65536±îÁö Ç¥Çö
°¡´É ÇÏ´Ù. 4 ¹ÙÀÌÆ®·Î ÇÒ°æ¿ì 0¿¡¼ 4294967295±îÁöÀÇ °ªÀ» Ç¥½ÃÇÒ ¼ö
ÀÖÀ» °ÍÀÌ´Ù. Å« ¼ö¸¦ Ç¥ÇöÇϱâ À§Çؼ ¹ÙÀÌÆ® Á¶ÇÕÀ» ÇØ¾ßÇÑ´Ù¸é ÇÁ·Î±×·¡¹Ö
ÇÒ ¶§ ²Ï³ª ±ÍÂúÀ» °Å¶ó°í »ý°¢ÇÒ ¼ö ÀÖÁö¸¸ ´ÙÇàÀ̵µ ÄÄÇ»ÅÍ´Â 4¹ÙÀÌÆ®¸¦ ±âº»´ÜÀ§·Î
¹¾î¼ °ü¸®Çϰí ÀÖÀ¸´Ï Å©°Ô °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù.
¾Õ¼ ¿ì¸®´Â ÄÄÇ»ÅͰ¡ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â ·¹Áö½ºÅͶó°í ºÒ¸®¿ì´Â ÀúÀå°ø°£¿¡
´ëÇØ¼ ¾Ë¾Æ º¸¾Ò´Ù. ·¹Áö½ºÅÍ´Â ÄÄÇ»ÅͰ¡ (ºü¸¥)°è»êÀ» ÇϱâÀ§ÇÑ ¿ëµµ·Î
»ç¿ëÇÑ´Ù. ¿©·¯ºÐÀÇ Ã¥»óÀ¸·Î ºñÀ¯ÇØ º¸ÀÚ. ¿©·¯ºÐÀÇ Ã¥»ó¿¡´Â ÀÛ¾÷¿¡ »ç¿ëÇϱâ
À§ÇÑ ¸¹Àº Ã¥, ¹®¼, º¸°í¼µéÀÌ ÇÑ ±ÍÅüÀ̸¦ Â÷ÁöÇϰí ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ºÐ¸í
¿©·¯ºÐÀÌ Áö±Ý ó¸®ÇؾßÇÒ Àϰú °ü·ÃµÈ ¹®¼´Â ¿©·¯ºÐ°ú °¡±î¿î °÷¿¡ À§Ä¡Çϰí
ÀÖÀ» °ÍÀÌ´Ù. ¾Æ¸¶µµ ¸ð´ÏÅÍ ¿·À̳ª, Ã¥¹ÞÀÌ Á¤µµ°¡ µÉ°Çµ¥, ÀÌ·¸°Ô ÇÏ´Â ÀÌÀ¯´Â
ÀÛ¾÷¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ Á»´õ »¡¸® ã±â À§ÇؼÀÌ´Ù. ÀÌ·¯ÇÑ Àå¼Ò°¡ ÄÄÇ»ÅÍÀÇ
·¹Áö½ºÅÍ¿¡ ÇØ´çÇÑ´Ù. ·¹Áö½ºÅÍ¿¡´Â ÄÄÇ»ÅͰ¡ ÇöÀç ÀÛ¾÷ÁßÀÎ µ¥ÀÌÅͰ¡ ³õ¿©¼
Á»´õ ºü¸¥ ÀÛ¾÷ÀÌ °¡´ÉÇϵµ·Ï ÇÑ´Ù.
¾Æ¸¶µµ ¿©·¯ºÐÀÇ ´ëºÎºÐÀº X86ÇÁ·Î¼¼½º¸¦ »ç¿ëÇÏ´Â ÄÄÇ»Å͸¦ »ç¿ëÇϰí ÀÖÀ» °ÍÀÌ´Ù.
x86 ÇÁ·Î¼¼½º´Â 4¹ÙÀÌÆ® Å©±âÀÇ ·¹Áö½ºÅ͸¦ °¡Áø¸ç À̸¦ word
¶ó°í ÇÑ´Ù. Áï 1¿öµå´Â 4¹ÙÀÌÆ®°¡ µÈ´Ù. ·¹Áö½ºÅÍÀÇ Å©±â¸¦ 4¹ÙÀÌÆ®·Î Á¤ÇѰÇ
ÄÄÇ»ÅͰ¡ °è»êÀ» Çϱâ À§ÇÑ °¡Àå ÆíÇÑ ÀÚ·áÀÇ Å©±âÀ̱⠶§¹®ÀÌ´Ù. 4¹ÙÀÌÆ®´Â
40¾ïÁ¤µµÀÇ Å©±â¸¦ °¡Áø´Ù.
ÁÖ¼Ò(address)´Â ·¹Áö½ºÅÍÀÇ Å©±â¿¡ ¸Âµµ·Ï 4¹ÙÀÌÆ®(1¿öµå)ÀÇ Å©±â¸¦ °¡Áø´Ù.
ÁÖ¼Ò°¡ 4¹ÙÀÌÆ® Å©±â¸¦ °¡Áö°Ô µÇ¹Ç·Î ÃÖ´ë 4294967296¹ÙÀÌÆ® ¸¸ÅÀ» ´Ù·ê ¼ö
ÀÖÀ» °ÍÀÌ´Ù. À̰ÍÀº 4±â°¡ ¹ÙÀÌÆ®ÀÇ Å©±â·Î ÀϹÝÀûÀÎ ÄÄÇ»ÅͰ¡ Á¦¾î°¡´ÉÇÑ
¹°¸®ÀûÀÎ ¸Þ¸ð¸®ÀÇ Å©±â°¡ µÈ´Ù.
ÁÖ¼Ò´Â °á±¹ µ¥ÀÌÅͰ¡ ÀúÀåµÈ ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ °¡¸®Å°°Ô µÇ´Âµ¥, ÀÌ·¯ÇÑ
°¡¸®Å²´Ù´Â Ư¡ ¶§¹®¿¡ pointers¶ó°í ºÎ¸£±âµµ ÇÑ´Ù.
2.4. interpreting Memory ÄÄÇ»ÅÍ´Â ¸Å¿ì ¾ö°ÝÇÏ°Ô ÀÛµ¿µÇ´Â ³í¸®±â°è´Ù. ¶§¹®¿¡ ÄÄÇ»Å͸¦ ´Ù·ç´Â ÇÁ·Î±×·¡¸Ó
¿ª½Ã ¸Å¿ì ¾ö°ÝÇØÁú ¼ö ¹Û¿¡ ¾ø´Ù. ÄÄÇ»Åʹ ȥÀÚ¼´Â ¾î¶°ÇÑ Àϵµ ¼öÇàÇÒ
¼ö ¾øÀ¸¸ç ¹Ýµå½Ã ÇÁ·Î±×·¥ÀÌ ÀÖ¾î¾ß Çϸç, ÇÁ·Î±×·¥¿ª½Ã ¾ö°ÝÇÑ ±ÔÄ¢À» µû¸£µµ·Ï
ÀÛ¼ºµÇ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ÄÄÇ»ÅͰ¡ ¿øÇÏ´Â ÀÏÀ» ÇÏ´Â °É º¸°í ½Í´Ù¸é
¿©·¯ºÐÀº ÄÄÇ»ÅÍ¿¡°Ô ÄÄÇ»ÅͰ¡ ¼öÇàÇØ¾ß ÇÒ ÀÏÀ» ¸íÈ®ÇÏ°Ô ¸í·ÉÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
ÄÄÇ»ÅͰ¡ ´ë·« ¾Ë¾Æ¼ ÇØÁٰŶó°í ±â´ëÇÏÁö ¸»¶ó. ÄÄÇ»ÅÍ´Â ¹®ÀÚ°Ç, ±×¸²À̰Ç,
À½¾ÇÀÌ°Ç À¥ÆäÀÌÁö°Ç ´ÜÁö ¼ýÀÚ·Î ÀúÀåÇÒ »ÓÀ̸ç, ¿¬¼ÓµÈ ¼ýÀÚÀÇ ³ª¿·Î
º¼ »ÓÀÌ´Ù. ¹®ÀÚ, ±×¸², À½¾ÇµéÀ» µéÀ» ¼ö ÀÖ´Â°Ç ÀÌ·¯ÇÑ ¼ýÀÚÀÇ ³ª¿À» ÇØ¼®ÇÒ¼ö
ÀÖ´Â (ÇÁ·Î±×·¡¸Ó°¡ ÀÛ¼ºÇÑ)Ưº°ÇÑ ÇÁ·Î±×·¥ÀÌ ÀÖ¾î¾ßÁö °¡´ÉÇÏ´Ù.
¸Þ¸ð¸®¿¡ °í°´Á¤º¸¸¦ ÀúÀåÇÏ´Â °É ¿¹·Î µé¾îº¸ÀÚ. ¿©·¯ºÐÀº °í°´ÀÇ À̸§°ú
ÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§Çؼ °¢°¢ 10°³¿Í 50°³ Á¤µµÀÇ ASCII ¹®ÀÚ¸¦ »ç¿ëÇØ¾ß Çϴ°É
½±°Ô »ý°¢ÇØ ³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. °í°´ÀÇ ³ªÀÌ¿Í °í°´ÀÇ ¾ÆÀ̵𸦠ÀúÀåÇϱâ À§Çؼ´Â
¼ýÀÚ°¡ ÇÊ¿äÇÔÀ» ¾Ë¾Æ ³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ °æ¿ì ¸Þ¸ð¸® ºí·°¿¡´Â ´ÙÀ½°ú °°Àº
ÇüÅ·Π°í°´ÀÇ Á¤º¸°¡ ÀúÀåµÉ ¼ö °ÍÀÌ´Ù.
·¹ÄÚµåÀÇ ½ÃÀÛ :
°í°´ÀÇ À̸§ (10 ¹ÙÀÌÆ®) = ·¹ÄÚµåÀÇ ½ÃÀÛ
°í°´ÀÇ ÁÖ¼Ò (50 ¹ÙÀÌÆ®) = ·¹ÄÚµåÀÇ ½ÃÀÛ + 10 ¹ÙÀÌÆ®
°í°´ÀÇ ³ªÀÌ (4 ¹ÙÀÌÆ®) = ·¹ÄÚµåÀÇ ½ÃÀÛ + 10 + 50
°í°´ÀÇ ¾ÆÀ̵ð (4 ¹ÙÀÌÆ®) = ·¹ÄÚµåÀÇ ½ÃÀÛ + 10 + 50 + 4
|
°í°´ µ¥ÀÌÅͰ¡ ÀúÀåµÈ ·¹ÄÚµåÀÇ ÁÖ¼Ò(address)¸¦ ¾Ë°í ÀÖ´Ù¸é ¿ì¸®´Â °£´ÜÇÑ
¿¬»ê(µ¡¼À)À» ÅëÇØ¼ °í°´ ·¹Äڵ忡¼ ¿øÇÏ´Â °¡Á®¿Ã ¼ö ÀÖ´Ù. ±×·¯³ª À§ÀÇ
¹æ¹ýÀ¸·Î µ¥ÀÌÅ͸¦ ÀúÀåÇÏ´Â ¹æ½ÄÀº ÇѰ¡Áö ´ÜÁ¡À» °¡Áö°í ÀÖ´Ù. À§ÀÇ ¿¹¿¡¼´Â
°í°´ÀÇ ÁÖ¼Ò°¡ 50¹ÙÀÌÆ®·Î Á¦ÇѵǾî Àִµ¥, ÀÌ·± ÀÌÀ¯·Î 50¹ÙÀÌÆ® º¸´Ù
´õ Å« ÁÖ¼Ò°¡ ÀÔ·ÂµÈ °æ¿ì 50¹ÙÀÌÆ® ÀÌÈÄÀÇ ÁÖ¼Ò µ¥ÀÌÅÍ´Â ºÐ½ÇÇØ ¹ö¸°´Ù.
À§ÀÇ µ¥ÀÌÅÍ ÀúÀ广½Ä¿¡ µû¸¥ Á¦ÇÑÀ» ¾ø¾Ö±â À§Çؼ µ¥ÀÌÅÍÀÇ À§Ä¡¸¸À»
°¡¸®Å°´Â(Æ÷ÀÎÆ®)ÇÏ´Â ¹æ¹ýÀÌ »ç¿ëµÈ´Ù. °í°´ÀÇ À̸§À» ¿¹·Î µéÀÚ¸é °í°´ÀÇ
À̸§ÀÇ ½ÇÁ¦ µ¥ÀÌÅÍ´Â ¸Þ¸ð¸®ÀÇ ÀÓÀÇÀÇ ¿µ¿ª¿¡ ÀúÀåµÇ°í ·¹Äڵ忡´Â ´ÜÁö
°í°´ÀÇ µ¥ÀÌÅͰ¡ ÀúÀåµÈ ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò °ª¸¸À» ¸í½ÃÇÏ´Â ¹æ¹ýÀÌ´Ù.
ÀÌ °æ¿ì ¸Þ¸ð¸®´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÉ °ÍÀÌ´Ù.
·¹ÄÚµåÀÇ ½ÃÀÛ
°í°´ÀÇ À̸§ Æ÷ÀÎÅÍ(4 ¹ÙÀÌÆ®) = ·¹ÄÚµåÀÇ ½ÃÀÛ
°í°´ÀÇ ÁÖ¼Ò Æ÷ÀÎÅÍ(4 ¹ÙÀÌÆ®) = ·¹ÄÚµåÀÇ ½ÃÀÛ + 4
°í°´ÀÇ ³ªÀÌ (4 ¹ÙÀÌÆ®) = ·¹ÄÚµåÀÇ ½ÃÀÛ + 4 + 4
°í°´ÀÇ ¾ÆÀ̵ð (4 ¹ÙÀÌÆ®) = ·¹ÄÚµåÀÇ ½ÃÀÛ + 4 + 4 + 4
|
ÀÌ·¸°Ô µÇ¸é °í°´ÀÇ ½ÇÁ¦ µ¥ÀÌÅÍ´Â ¸Þ¸ð¸®ÀÇ ÀÓÀÇÀÇ À§Ä¡¿¡ ÀúÀåµÉ ¼ö ÀÖÀ½À¸·Î
ÀԷ°¡´ÉÇÑ ÁÖ¼ÒÀÇ ±æÀÌ¿¡ Á¦ÇÑÀ» ¹ÞÁö ¾Ê¾Æµµ µÈ´Ù.
2.5. µ¥ÀÌÅÍ Á¢±Ù ¹æ¹ý ÇÁ·Î¼¼½º´Â addressings mode¶ó°í ºÒ¸®¿ì´Â µ¥ÀÌÅÍ¿¡ Á¢±ÙÇÏ´Â
¸î °¡Áö ¹æ½ÄÀ» °¡Áö°í ÀÖ´Ù. °¡Àå °£´ÜÇÑ mode´Â
immediate¸ðµå¶ó°í ºÎ¸®´Â °ÍÀ¸·Î µ¥ÀÌÅÍ Á¢±ÙÀÌ
¸í·É(instruction)Àڽſ¡°Ô¼ ÀÌ·ç¾îÁö´Â ¹æ½ÄÀÌ´Ù.
3. ù¹øÂ° ÇÁ·Î±×·¥ ¸¸µé±â À̹ø Àå¿¡¼´Â ¸®´ª½º ¾î¼Àºí¸® ÇÁ·Î±×·¥À» ¸¸µå´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¼ °ÍÀÌ´Ù.
¿©±â¿¡ ´õºÒ¾î ¾î¼Àºí¸® ÇÁ·Î±×·¥ÀÇ ±¸Á¶¿Í ¾î¼Àºí¸® ÇÁ·Î±×·¡¹ÖÀ» ÀÛ¼ºÇϴµ¥
ÇÊ¿äÇÑ ¾î¼Àºí¸® ¸í·É¾îµé¿¡ ´ëÇØ¼µµ ¾Ë¾Æº¼ °ÍÀÌ´Ù.
¿©·¯ºÐÀÌ ÁÖ·Î Áß/°í±Þ ¾ð¾î¸¸À» ´Ù·ç¾î ¿Ô´Ù¸é, ¾Æ¸¶µµ À̵é°ú´Â ÀüÇô´Ù¸¥
Àú¼öÁØÀÇ ¾î¼Àºí¸®¾î¿¡ ´çȲÇÒ °ÍÀÌ´Ù. ¾î¼Àºí¸®¾î¿¡ Àͼ÷ÇØÁö´Â ¹æ¹ýÀº
´Ù¸¥ ¾ð¾î¿¡ Àͼ÷ÇØÁö±â À§Çؼ »ç¿ëÇß´ø ¹æ¹ýµé°ú µ¿ÀÏÇÏ´Ù. Áï ²ÙÁØÈ÷
Äڵ带 Á¢ÇÏ°í ¸¹Àº ½Ã°£¿¡ °ÉÃļ ¿¬½ÀÇÏ°í »ý°¢Çϰí ÀÎÅͳÝȤÀº ¼ÀûÀ»
ÅëÇØ¼ °ü·Ã Á¤º¸¸¦ ¼öÁýÇϰí ÀÚ½ÅÀÇ °ÍÀ¸·Î ¸¸µå´Â °ÍÀÌ´Ù. ¸¹Àº ½Ã°£ÀÌ ÇÊ¿äÇϸç
½ÃÇàÂø¿À ¿ª½Ã °Þ°Ô µÇ°ÚÁö¸¸ ÀÌ·¯ÇÑ ¸ðµç °ÍµéÀÌ ¾î¼Àºí¸®¾î¸¦ ¿©·¯ºÐÀÇ °ÍÀ¸·Î
¸¸µå´Âµ¥ ¹Ýµå½Ã ÇÊ¿äÇÑ µµ¿òÀÌ µÇ¾îÁÙ °ÍÀÌ´Ù.
3.1. Entering in the Program °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µå´Â °ÍºÎÅÍ ½ÃÀÛÇØ º¸µµ·Ï ÇÏÀÚ. óÀ½À¸·Î ¸¸µé
ÇÁ·Î±×·¥Àº ¾Æ¹«·± ÇÏ´ÂÀÏÀÌ ¾ø´Â -½ÇÇà ÈÄ ¹Ù·Î Á¾·áÇØ ¹ö¸®´Â- ¾îÀÌ ¾ø´Â
ÇÁ·Î±×·¥ÀÌÁö¸¸ ¾î¼Àºí¸®¾î¿Í ¸®´ª½º ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ±âº»ÀûÀÎ ¹æ¹ýÀ»
º¸¿©ÁØ´Ù. ¿©·¯ºÐÀÌ ÁÁ¾ÆÇÏ´Â ¿¡µðÅÍ·Î ¾Æ·¡ÀÇ ¿¹Á¦¸¦ ÆíÁýÇÑ ´ÙÀ½
exit.s À̸§À» °¡Áö´Â ÆÄÀÏ·Î ÀúÀåÇϵµ·Ï ÇÑ´Ù. Áö±Ý ´çÀå ¾Æ·¡ÀÇ ¿¹Á¦ Äڵ尡
ÀÌÇØµÇÁö ¾Ê´Â´Ù°í ÇØ¼ °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¿ì¼±Àº ¾Æ·¡ÀÇ Äڵ带 ¸¸µé°í
ÄÄÆÄÀÏ ÇØ¼ ½ÇÇà ½Ã۴µ¥¿¡¸¸ ½Å°æ¾²µµ·Ï ÇÑ´Ù. ½ÇÁ¦ Äڵ忡 ´ëÇÑ
»ó¼¼ÇÑ ¼³¸íÀº 4절¿¡¼ ´Ù·ê °ÍÀÌ´Ù.
# ½ÃÀÛ ÈÄ ¹Ù·Î Á¾·áÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À¸·Î Á¾·á ÇÒ¶§
# ÇÁ·Î±×·¥ÀÇ ¸®ÅϰªÀ» ¸®´ª½º Ä¿³Î¿¡ Àü´ÞÇÑ´Ù.
#
# ÀÔ·Â : ¾øÀ½
#
# Ãâ·Â : ÄÚµåÀÇ Á¾·á°ªÀ» ¸®ÅÏÇÑ´Ù.
# ÇÁ·Î±×·¥ÀÇ Á¾·á°ªÀº ½©¿¡¼ ´ÙÀ½°ú °°ÀÌ È®ÀÎ °¡´ÉÇÏ´Ù.
# echo $?
#
# º¯¼ö :
# %eax´Â ½Ã½ºÅÛ È£Ãâ(system call)¹øÈ£¸¦ ÀúÀåÇÑ´Ù.
# %ebx´Â Á¾·á°ªÀ» ÀúÀåÇÑ´Ù.
.section .data
.section .text
.global _start
_start:
movl $1, %eax # ¸®´ª½º Ä¿³Î¿¡ exit(2)½Ã½ºÅÛ ÄÝÀ» ¿äûÇÑ´Ù.
# exit(2)ÀÇ ½Ã½ºÅÛ ÄÝ ¹øÈ£´Â 1¹øÀÌ´Ù.
movl $0, %ebx # ÇÁ·Î±×·¥ÀÌ Á¾·áÇÏ¸é¼ ¿î¿µÃ¼Á¦¿¡ ³Ñ°ÜÁÙ
# Á¾·á°ªÀÌ´Ù.
# ÇÁ·Î±×·¥ Á¾·áÈÄ ½©»ó¿¡¼
# echo $? ·Î È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.
# °ªÀ» ¹Ù²Ù¾î °¡¸é¼ Å×½ºÆ® ÇØº¸µµ·Ï ÇÏÀÚ.
int $0x80 # exit ½Ã½ºÅÛÄÝÀ» ½ÇÇàÇÑ´Ù.
|
À§¿Í °°Àº ¹®ÀåµéÀ» ¿ì¸®´Â ¼Ò½ºÄÚµå(source code)¶ó°í ºÎ¸£¸ç, ¼Ò½ºÄڵ尡
ÀúÀåµÈ ÆÄÀÏÀ» ¼Ò½ºÆÄÀÏ À̶ó°í ºÎ¸¥´Ù. ¼Ò½ºÄÚµå´Â
Àΰ£ÀÌ ½±°Ô ÀÐÀ»¼ö ÀÖµµ·Ï ¸¸µé¾îÁø ÇÁ·Î±×·¥ÀÇ ¾ç½ÄÀÌ´Ù. ±×·¯³ª
¼Ò½ºÄÚµå´Â ÇÁ·Î±×·¥ÀÇ ¾ç½ÄÀÏ »Ó ±× ÀÚü·Î ½ÇÇà°¡´ÉÇÑ ÇÁ·Î±×·¥Àº ¾Æ´Ï´Ù.
Àΰ£ÀÌ ÀÌÇØÇϱâ´Â ½±Áö¸¸ ÄÄÇ»ÅÍ´Â Àΰ£ÀÇ ¹®ÀåÀ» ÀÌÇØÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.
±×·¡¼ ¼Ò½ºÄڵ带 ÄÄÇ»ÅͰ¡ ÀÌÇØÇØ¼ ½ÇÇà °¡´ÉÇϵµ·Ï ±â°èÀÇ ¾ð¾î·Î
¹ø¿ª(transform)ÇÏ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷À» À§Çؼ
assemble¿Í link°¡ »ç¿ëµÈ´Ù.
¸ÕÀú assemble¸¦ ÀÌ¿ëÇØ¼ ¼Ò½ºÄڵ带 ±â°è¸¦ À§ÇÑ
¸í·ÉÀ¸·Î º¯°æÇØ¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ º¯°æ(ȤÀº ¹ø¿ª) °úÁ¤À» Assembling¶ó°í
ÇÑ´Ù. ÀÌ·¯ÇÑ ¾î¼Àºí¸µÀ» À§Çؼ as°¡ Á¦°øµÈ´Ù.
as´Â ¼Ò½ºÆÄÀÏÀÎ exit.s¸¦ ¹ø¿ªÇؼ ±× °á°ú¸¦
exit.o¶ó´ÂÆÄÀÏ¿¡ ¾´´Ù. exit.o¿Í °°Àº ¹ø¿ªµÈ °á°ú¸¦ ´ã°í ÀÖ´Â ÆÄÀÏÀ»
object file¶ó°í ºÎ¸¥´Ù. ¿ÀºêÁ§Æ® ÄÚµå´Â ±â°è¾î·Î
ÀÌ·ç¾îÁ® ÀÖ´Ù. ¿ÀºêÁ§Æ® Äڵ尡 ±â°è¾î·Î ÀÌ·ç¾îÁ® ÀÖÀ¸´Ï ÀÌ ÀÚü·Î ¿ÏÀüÇÑ
ÇÁ·Î±×·¥À̶ó°í »ý°¢ÇÒ ¼ö ÀÖ°ÚÁö¸¸ ±×·¸Áö´Â ¾Ê´Ù. ´ëºÎºÐÀÇ
±Ô¸ð°¡ ÀÖ´Â ÇÁ·Î±×·¥µéÀº ¿©·¯°³ÀÇ ¼Ò½ºÆÄÀÏ·Î ÀÌ·ç¾î Áö°í ÀÌµé ¼Ò½ºÆÄÀϵéÀº
°¢°¢ º°°³ÀÇ ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» ¸¸µé¾î ³½´Ù. ±×·¯¹Ç·Î ÀÌ·¯ÇÑ
¿©·¯°³ÀÇ ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» ÇÕÃļ ÇϳªÀÇ ½ÇÇàÆÄÀÏ·Î ¸¸µé¾î¾ß ÇÏ´Â
ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. linker¶ó´Â ÇÁ·Î±×·¥À»
ÀÌ¿ëÇÏ¸é ¿©·¯°³ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» Çϳª·Î ÇÕÃļ Ä¿³Î¿¡¼ ½ÇÇà°¡´ÉÇÑ
ÇÁ·Î±×·¥À» ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù. ¸®´ª½º´Â ld¶ó´Â
linkerÇÁ·Î±×·¥À» Á¦°øÇÑ´Ù. ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸µÅ©
½ÃÄѼ ¿ÏÀüÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù.
À§ÀÇ ¸í·ÉÀº ¿ÀºêÁ§Æ® ÆÄÀÏÀº exit.o¸¦ ¸µÅ©½ÃÄѼ ½ÇÇàÆÄÀÏÀÎ exit¸¦
¸¸µé¾î ³½´Ù. ¸¸¾à À§ÀÇ ¸µÅ© °úÁ¤Áß ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é ÇÁ·Î±×·¥ÀÇ ¼Ò½ºÄڵ带
À߸ø ÀÛ¼ºÇßÀ» °æ¿ì°¡ ´ëºÎºÐÀÌ´Ù. ÀÌ·± °æ¿ì ¿©·¯ºÐÀº ¼Ò½ºÄڵ带 ÁÖÀÇ
±í°Ô »ìÆì¼ ¹®Á¦°¡ µÈ ºÎºÐÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¼Ò½ºÄڵ忡 ´ëÇÑ ¼öÁ¤ÀÌ
ÀÌ·ç¾î Á³´Ù¸é ´Ù½Ã assemble °ú link°úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù.
¾Æ¹«·± ¹®Á¦°¡ ¾øÀÌ ¸µÅ©±îÁö ¼º°øÇß´Ù¸é ´ÙÀ½°ú °°ÀÌ exit
[1]
ÇÁ·Î±×·¥À» ½ÇÇà ½Ãų ¼ö ÀÖ´Ù.
./´Â ÄÄÇ»ÅÍ¿¡°Ô ½ÇÇà½ÃÄÑ¾ß ÇÏ´Â ÇÁ·Î±×·¥ÀÌ ÀϹÝÀûÀÎ
ÇÁ·Î±×·¥ ½ÇÇà °æ·Î(PATH)°¡ ¾Æ´Ñ ÇöÀç µð·ºÅ丮¿¡ ÀÖÀ½À» ¾Ë·ÁÁÖ±â
À§Çؼ »ç¿ëÇÑ´Ù. À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà ½ÃÄѺ¸¸é ¾Æ¹«·± º¯Èµµ ¾øÀÌ
´ÙÀ½ ÇÁ·ÒÇÁÆ®°¡ ¶³¾îÁö´Â °É È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÁ·Î±×·¥Àº ÇÏ´ÂÀÏÀÌ
¾Æ¹« °Íµµ ¾ø´Â °Í °°Áö¸¸ ³»ºÎÀûÀ¸·Î Á¾·áÇÏ¸é¼ Á¾·á°ªÀ» Ä¿³Î¿¡ µÇµ¹·Á
Áִµ¥, ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î exit ÇÁ·Î±×·¥ÀÇ Á¾·á°ªÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
¾Æ¸¶µµ 0ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù. À̰ÍÀº ¿ì¸®°¡ ¸¸µç exitÇÁ·Î±×·¥ »Ó¸¸ ¾Æ´Ï¶ó
´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥¿¡ °øÅëÀûÀ¸·Î Àû¿ëµÈ´Ù. ¸ðµç ÇÁ·Î±×·¥Àº Á¤»óÀûÀ¸·Î
ÁÖ¾îÁø ÀÏÀ» ÇØ°áÇϰí Á¾·á ÇßÀ» ¶§´Â 0À» ¸®ÅÏÇÏ°í ½ÇÆÐÇßÀ» °æ¿ì 0ÀÌ¿ÜÀÇ
´Ù¸¥ ¼ýÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥ Á¾·á°ªÀ» ÀÌ¿ëÇØ¼ ÇÁ·Î±×·¡¸Ó´Â
½ÇÇà½ÃÄ×´ø ÇÁ·Î±×·¥ÀÌ ÀÏÀ» Á¦´ë·Î ¼öÇàÇß´ÂÁö ¾Æ´Ï¸é ¾î¶² ¿À·ù°¡ ¹ß»ýÇß´Â
Áö¸¦ È®ÀÎÇÒ ¼ö ÀְԵȴÙ. 0Àº Á¤»óÁ¾·á, 1Àº ÆÄÀÏ¿±â ½ÇÆÐ, 2´Â À߸øµÈ
°è»ê µîÀ¸·Î Á¤ÀÇÇØ¼ °¢ »óȲ¿¡ ¸Â°Ô Á¾·á°ªÀ» ³Ñ±â°í Á¾·áÇÏ¸é µÈ´Ù.
3.2. ¾î¼Àºí¸® ÇÁ·Î±×·¥ÀÇ °³¿ä exit.s¸¦ º¸¸é ¸¹Àº ÁÙÀÌ #ó¸® µÇ¾î ÀÖ´Â°É º¼ ¼ö ÀÖ´Ù.
À̰ÍÀº ÁÖ¼®À̶ó°í ºÒ¸®¿î´Ù. ÁÖ¼®Àº ¾î¼Àºí·¯¿¡ ÀÇÇØ¼ ÇØ¼® µÇÁö ¾Ê´Â
ºÎºÐÀ¸·Î ÁÖ·Î ÇÁ·Î±×·¡¸Ó¿¡°Ô ÇÁ·Î±×·¥ Äڵ忡 ´ëÇÑ ¼³¸í, ÈùÆ®µîÀ»
¸í½ÃÇØ¼ ÇÁ·Î±×·¡¸Ó°¡ Á»´õ ½±°Ô Äڵ带 ÆÄ¾ÇÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ
»ç¿ëµÈ´Ù. Àß ÀÛ¼ºµÈ ÁÖ¼®Àº ÇÁ·Î±×·¥À» ¸¸µé¾î³½ ´ç»çÀÚ »Ó¸¸ ¾Æ´Ï¶ó
ÇÁ·Î±×·¥À» Àоî¾ß ÇÏ´Â ´Ù¸¥ (ÆÀµ¿·áµî°ú °°Àº)ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸¹Àº µµ¿òÀ»
ÁØ´Ù. Àß ÀÛ¼ºµÈ ÁÖ¼®Àº ´ÙÀ½°ú °°Àº ¿ä¼ÒµéÀ» °¡Áø´Ù.
¸î °³ÀÇ ÁÖ¼®ÈÄ¿¡ ´ÙÀ½°ú °°Àº ÁÙÀÌ µîÀåÇÑ´Ù.
ÅØ½ºÆ® ¼½¼ÇÀÌ ½ÃÀÛÇÔÀ» ¾Ë¸°´Ù. ÅØ½ºÆ® ¼½¼Ç¿¡´Â ÇÁ·Î±×·¥ ¸í·É
(¾î¼Àºí¸® Äڵ尡 À§Ä¡ÇÑ´Ù)
_start:
ÀÌÁ¦ ½ÇÁ¦ÀûÀΠĿǻÅÍ ¸í·ÉÀÌ µîÀåÇÑ´Ù. óÀ½ µîÀåÇÑ ¸í·ÉÀº
´ÙÀ½°ú °°´Ù.
ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ¾úÀ» ¶§ À̸í·ÉÀº ¼ýÀÚ1À» %eax ·¹Áö½ºÅÍ¿¡ ³Ö¾î¶ó°í
ÇØ¼®ÇÑ´Ù. ¾î¼Àºí¸®¾î¿¡ »ç¿ëµÇ´Â ¸¹Àº ¸í·ÉÀº ¿ÀÆÛ·£µå(operands)¸¦
°¡Áø´Ù. À§ÀÇ movl¸í·ÉÀº source¿Í
destination µÎ°³ÀÇ ¿ÀÆÛ·£µå¸¦ °¡Áø´Ù.
ÀÌ °æ¿ì source´Â ¼ýÀÚ 1ÀÌ µÇ°í destinationÀº %eax·¹Áö½ºÅͰ¡
µÈ´Ù. ¿ÀÆÛ·£µå´Â ¼ýÀÚ, ÂüÁ¶ ¸Þ¸ð¸® À§Ä¡ ȤÀº ·¹Áö½ºÅͰ¡
¿Ã ¼ö ÀÖ´Ù. ¸í·ÉÀº ±× Á¾·ù¿¡ µû¶ó¼ °¢°¢ ´Ù¸¥ Çü½ÄÀÇ ¿ÀÆÛ·£µå¸¦
°¡Áö°Ô µÈ´Ù. °¢ ¸í·ÉÀÌ °¡Áú ¼ö ÀÖ´Â ¿ÀÆÛ·£µåÀÇ Á¤º¸´Â
Appendix B¸¦ Âü°íÇϱ⠹ٶõ´Ù.
¸í·É¿¡ µû¶ó¼ ¿ÀÆÛ·£µåÀÇ Çü½ÄÀÌ ´Þ¶óÁö±ä ÇÏÁö¸¸, ´ëºÎºÐÀÇ
¸í·ÉÀº 2°³ÀÇ ¿ÀÆÛ·£µå¸¦ °¡Áø´Ù. ù¹øÂ°·Î µîÀåÇÏ´Â ¿ÀÆÛ·£µå¸¦
source ¿ÀÆÛ·£µå, µÎ¹øÂ°·Î µîÀåÇÏ´Â ¿ÀÆÛ·£µå¸¦ destination ¿ÀÆÛ·£µå
¶ó°í ÇÑ´Ù. ÀÌ·±·ùÀÇ ¸í·ÉÀ¸·Î´Â addl, subl, imulµîÀÌ ÀÖ´Ù.
ÀÌµé ¸í·ÉÀº °¢°¢ "´õÇϱâ","»©±â","°öÇϱâ" ¿¬»êÀ» Çϸç
source ¿ÀÆÛ·£µå·Î ºÎÅÍ destination ¿ÀÆÛ·£µå·Î ¿¬»êÀ» ÇÏ°í °á°ú´Â
destination ¿ÀÆÛ·£µå¿¡ ÀúÀåµÈ´Ù.
x86ÇÁ·Î¼¼½º´Â movl¸í·É¿¡ ÀÌ¿ëÇÒ¼ö ÀÖ´Â ¿©·¯°³ÀÇ general-purpose
·¹Áö½ÃÆ®·² °¡ÁöÀÖ´Ù.
À̵é gerneal-purpose ·¹Áö½ºÅÍ¿Í ÇÔ²² ¸î°³ÀÇ special-purpose
·¹Áö½ºÅ͵µ °¡Áö°í ÀÖ´Ù.
ÀÌµé ·¹Áö½ºÅÍÁß¿¡´Â %eip¿Í %eflags¿Í °°Àº Ưº°ÇÑ ¸í·É¿¡¸¸
Á¢±Ù°¡´ÉÇÑ ·¹Áö½ºÅ͵éÀÌ ÀÖ´Ù. ¿ì¼±Àº ÀÌÁ¤µµ¸¸ ¼³¸íÇϵµ·Ï ÇϰڴÙ.
´õ ÀÚ¼¼ÇÑ ³»¿ëÀº ³ªÁß¿¡ ¼³¸íÇÒ ±âȸ°¡ ÀÖÀ» °ÅÀÌ´Ù.
ÀÌÁ¦ movl¸í·ÉÀº ¼ýÀÚ 1À» %eax·¹Áö½ºÅÍ·Î
¿Å±â´Â ÀÛ¾÷À» ¼öÇàÇÔÀ» ÀÌÇØÇßÀ» °ÍÀÌ´Ù. 1¾Õ¿¡ º¸¸é ´Þ·¯Ç¥½Ã°¡
Àִµ¥, ÀÌ´Â immediate mode addressingÀ» ÀÌ¿ëÇÒ °ÍÀ» ¸í½ÃÇϱâ
À§Çؼ »ç¿ëÇÑ´Ù. ´Þ·¯Ç¥½Ã°¡ ¾ø´Ù¸é direct addressingÀ» ÀÌ¿ëÇϰÔ
µÇ°í ÁÖ¼Ò 1¿¡ ÀÖ´Â ¾î¶² °ªÀ» ÀÐ¾î µéÀÌ°Ô µÈ´Ù. ¿ì¸®´Â ½ÇÁ¦ ¼ýÀÚ
1À» ÀоîµéÀ̱⸦ ¿øÇϹǷΠimmeiate mode¸¦ »ç¿ëÇß´Ù.
¿ì¸®°¡ ¼ýÀÚ 1À» %eax¿¡ ¿Å±ä ÀÌÀ¯´Â ƯÁ¤ÀÛ¾÷À» À§Çؼ Linux
Ä¿³ÎÀ» Áغñ½Ã۱â À§ÇÔÀÌ´Ù. ¼ýÀÚ 1Àº ½Ã½ºÅÛ ÄÝ(system call)
¹øÈ£ 1¹øÀÎ exit¸¦ °¡¸®Å²´Ù. ½Ã½ºÅÛÄÝÀº
¿î¿µÃ¼Á¦¿¡ ¾î¶² µµ¿òÀ» ¿äûÇϱâ À§Çؼ »ç¿ëµÇ´Â °ÍÀÌ´Ù. ½Ã½ºÅÛÄÝ¿¡
´ëÇØ¼´Â Á¶¸¸°£ ÀÚ¼¼È÷ ´Ù·ç°Ô µÉ °ÍÀÌ´Ù. ÆÄÀÏÀ» ¿°Å³ª
¸Þ¸ð¸® ÇÒ´çÀ» ¿äûÇϰųª Çϱâ À§Çؼ´Â ÇØ´ç ½Ã½ºÅÛ ÄÝ¿¡ ¸ÅÇεǴÂ
¹øÈ£¸¦ %eax¿¡ ½áÁÖ¸é µÈ´Ù. ÀÌµé ½Ã½ºÅÛ ÄÝ ¹øÈ£´Â ¿î¿µÃ¼Á¦¸¶´Ù
¾à°£¾¿ ´Ù¸£´Ù.
¿î¿µÃ¼Á¦¿¡ ¾î¶² ÀÏÀ» ¿äûÇϱâ À§Çؼ ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÑ´Ù°í
Çߴµ¥, ½Ã½ºÅÛÄÝ ¹øÈ£ ¸¸À¸·Î ÇÒ ¼ö ÀÖ´Â ÀÏÀº Á¸ÀçÇÏÁö ¾Ê´Â´Ù.
¾î¶² ¿äûÀ» ¼öÇàÇϵµ·Ï Çϱâ À§Çؼ´Â Ä¿³Î¿¡ Á»´õ ¸¹Àº Á¤º¸¸¦
¾Ë·ÁÁà¾ß ÇÑ´Ù. ÆÄÀÏÀ» ¿©´Â °ÍÀ» ¿¹·Î µé¾îº¸¸é "ÆÄÀÏÀ» ¿¾î¶ó"¶ó´Â
¿äû ¿Ü¿¡µµ ÆÄÀÏÀ̸§ÀÌ ¹«¾ðÁö, ¾î¶² »óÅ·Π¿°ÇÁö µîÀ» Ä¿³Î¿¡°Ô
¾Ë·ÁÁÖ¾î¾ß¸¸ ÇÑ´Ù. ÀÌ·¯ÇÑ ºÎ°¡ÀûÀÎ Á¤º¸¸¦ parameters(ÀÎÀÚ)¶ó°í
ºÎ¸£¸ç ÀÌµé °ª ¿ª½Ã ·¹Áö½ºÅ͸¦ ÅëÇØ¼ Ä¿³Î¿¡ Àü´ÞµÈ´Ù.
exit ½Ã½ºÅÛÄÝÀÇ °æ¿ì ÄÁ³ÎÀº ÀÎÀÚ·Î Á¾·á°ªÀ» ¿ä±¸ÇÑ´Ù. ÀÌ °ªÀº
%ebx¿¡¼ ÀÐÇô Áø´Ù. ÀÌ Á¾·á °ªÀº ½Ã½ºÅÛ¿¡ ¸®ÅϵǾîÁú °ÍÀ̰í
¿©·¯ºÐÀº echo $?¸¦ ÅëÇØ¼ ¸®ÅϰªÀ» ÀÐÀ» ¼ö
ÀÖ°Ô µÈ´Ù. %ebx¿¡ 0À» ¿Ã¸®±â À§Çؼ´Â ´ÙÀ½°ú °°Àº Äڵ尡 ÇÊ¿äÇÏ´Ù.
¸®´ª½º´Â ½Ã½ºÅÛÄÝÀ» ¸¸µé±â Àü¿¡ ÀÎÀÚÀÇ °ªÀ» Àбâ À§Çؼ
·¹Áö½ºÅÍÀÇ °ªÀ» ¿ä±¸ÇÑ´Ù. %eax´Â ¾ðÁ¦³ª ½Ã½ºÅÛÄÝ ¹øÈ£¸¦ ¿Ã¸®±â
À§Çؼ »ç¿ëµÇ¸ç ÀÎÀÚ¸¦ ¿Ã¸®±â À§Çؼ ´Ù¸¥ ·¹Áö½ºÅ͵éÀ» »ç¿ëÇϰÔ
µÈ´Ù. exit ½Ã½ºÅÛÄÝ¿¡¼ º¸¸é Á¾·á »óŸ¦ ÀúÀåÇϱâ À§Çؼ
%ebx¸¦ ÇÊ¿ä·Î ÇÔÀ» ¾Ë ¼ö ÀÖ´Ù. °¢°¢ÀÇ ½Ã½ºÅÛÄÝÀÌ ÇÊ¿ä·Î ÇÏ´Â
ÀÎÀÚÀÇ °¹¼ö°¡ ¼·Î ´Ù¸£´Ù. À̵鿡 ´ëÇÑ Á¤º¸´Â Appendix C¸¦
Âü°íÇϱ⠹ٶõ´Ù.
´ÙÀ½À¸·Î ¾Æ·¡¿Í °°Àº »ó´çÈ÷ ¼ö»óÇÑ ¸í·ÉÀÌ ³»·ÁÁø´Ù.
int ´Â C¿¡¼ Á¤¼öÇüÀ» ³ªÅ¸³»´Â int°¡ ¾Æ´Ï´Ù.
interruptÀÇ ÁÙÀÓ¸»ÀÌ´Ï È¥µ¿ÇÏÁö ¾Êµµ·Ï ÇÏÀÚ.
0x80Àº »ç¿ëÇÒ ÀÎÅÍ·´Æ®ÀÇ ¹øÈ£´Ù.
ÇÁ·Î±×·¥ÀÇ ¼öÇàÁß interrupt°¡ °É¸®°Ô µÇ¸é
ÇÁ·Î±×·¥ÀÇ Á¦¾î°¡ Ä¿³Î·Î ³Ñ¾î°¡°Ô µÇ°í Ä¿³ÎÀº ÇÁ·Î±×·¥ÀÌ ¿äûÇÑ
½Ã½ºÅÛÄÝÀ» ¼öÇàÇÏ°Ô µÈ´Ù. À̰ÍÀº ¹èÆ®¸Ç¿¡°Ô ±¸Á¶¿äûÀ» Çϱâ À§Çؼ
½ÅÈ£¸¦ º¸³»´Â °úÁ¤°ú °°´Ù. ¿©·¯ºÐÀº Çʿ信 ÀÇÇØ¼ ¹èÆ®¸Ç¿¡°Ô
½ÅÈ£¸¦ º¸³»°í ¹èÆ®¸ÇÀº ¿©·¯ºÐÀ» ±¸Á¶ÇÏ·¯ ¿Â´Ù. ±¸Á¶°¡ µÈÈÄ¿¡´Â ?
¹°·Ð ÀÏ»ó»ýȰ·Î µÇµ¹¾Æ °¡°Ô µÉ°ÍÀÌ´Ù. ¸¶Âù°¡Áö·Î
Ä¿³ÎÀÌ ÇÊ¿äÇÑ ÀÏÀ» ¸¶Ä¡°Ô µÇ¸é Á¦¾î±ÇÀº ÇÁ·Î±×·¥À¸·Î ´Ù½Ã ³Ñ¾î
°¡°Ô µÈ´Ù. ¸¸¾à interrupt ½ÅÈ£¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é ¾î¶°ÇÑ ½Ã½ºÅÛ
Äݵµ ¼öÇàµÇÁö ¾ÊÀ» °ÍÀÌ´Ù.
ÀÌÁ¦ ³²Àº ÀÏÀº Äڵ带 assemble½Ã۰í, ¸µÅ© ½ÃŰ°í ½ÇÇàÇÏ´Â
ÀÏÀÌ´Ù. Å×½ºÆ®¸¦ À§Çؼ ¾î¼Àºí¸® ÄÚµåÀÇ %ebx¸¦ ´Ù¸¥ °ªÀ¸·Î
¹Ù²ÛÈÄ echo $?ÀÇ Ãâ·Â°ªÀÌ º¯ÇÏ´Â°É È®ÀÎÇØ
º¸±â ¹Ù¶õ´Ù. ´ç¿¬ÇÏÁö¸¸ %ebx°ªÀ» º¯°æÇÑ´ÙÀ½¿¡´Â
assemble->¸µÅ©->½ÇÇà °úÁ¤À» °ÅÃÄ¾ß º¯°æµÈ ³»¿ëÀÌ Àû¿ëµÈ´Ù.
3.3. Planning the Program À̹ø ÇÁ·Î±×·¥Àº Á»´õ º¹ÀâÇÑ ÀÏÀ» ÇϰԵȴÙ. ¿©·¯°³ÀÇ ¼ýÀÚ°¡
ÁÖ¾îÁö°í ÀÌÁß °¡Àå Å« ¼ýÀÚ¸¦ ã´Â ÀÏÀ» ÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù.
ÄÄÇ»ÅÍ´Â ÇÁ·Î±×·¡¸Ó°¡ ÇÊ¿äÇÑ ¸ðµç°ÍÀ» ¼¼¹ÐÇÏ°Ô ÁöÁ¤ÇØÁà¾ß ÇÏ´Â
±â°è´Ù. ±×·¯¹Ç·Î ¿øÇϴµ¥·Î ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇϱ⠿øÇÏ´Ù¸é
ÀÛ¼ºÀü¿¡ ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¸í¼¼¼¸¦ ¸¸µé¾î ÁÖ¾î¾ß ÇÑ´Ù.
¿ì¸®°¡ ¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº ¸í¼¼¿¡ ´ëÇÑ Á¤Àǰ¡
ÀÖ¾î¾ß ÇÒ °ÍÀÌ´Ù.
¼ýÀÚÀÇ ¸ñ·ÏÀ» ¾îµð¿¡ ÀúÀåÇÒ °ÍÀΰ¡.
°¡Àå Å« ¼ýÀÚ¸¦ ã±â À§Çؼ ¾î¶°ÇÑ ÇÁ·Î½ÃÁ®¸¦ ÇÊ¿ä·Î Çϴ°¡.
ÇÁ·Î½ÃÁ®¸¦ ¼öÇàÇϱâ À§Çؼ ¾î´ÀÁ¤µµÀÇ °ø°£À» ÇÊ¿ä·Î Çϴ°¡
°ø°£Àº ·¹Áö½ºÅÍ¿¡¼ È®º¸ÇÒ °ÍÀΰ¡ ¾Æ´Ï¸é ¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÒ
°ÍÀΰ¡.
¿©·¯ºÐÀº ¸î°³ÀÇ ¼ýÀÚ Áß¿¡¼ °¡Àå Å« ¼ýÀÚ¸¦ ã´Â ÀÏÀ» Çϱâ À§Çؼ
¾î¶² °èȹÀ» ¼¼¿î´Ù°Å³ª ÇÏÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ·± ÀÏÀº ±×³É ´ÚÄ¡¸é
Çѹø¿¡ ¾²À¹ º¸°í °¡Àå Å« ¼ýÀÚ¸¦ °ñ¶ó ³¾ °ÍÀÌ´Ù. ¹°·Ð ¼ýÀÚÀÇ
¸ñ·ÏÀÌ ¸¹´Ù¸é ¾à°£ÀÇ °èȹÀ» ¼¼¿ö¾ß ÇϰÚÁö¸¸ Å« ¹®Á¦°¡ µÇÁö´Â
¾ÊÀ» °ÍÀÌ´Ù - ½Ã°£ÀÌ Á» °É¸®±ä ÇϰÚÁö¸¸ -. ¿ì¸®ÀÇ µÎ³ú°¡ °æÇè°ú
ÇнÀ¿¡ ÀÇÇØ¼ °ÅÀÇ ¹Ý»çÀûÀ¸·Î ±×·¯ÇÑ ÀÏÀ» ó¸®Çϱ⠶§¹®ÀÌ´Ù.
¿©·¯°³ÀÇ ¼ýÀÚ ¸ñ·ÏÁß¿¡ °¡Àå Å« ¼ýÀÚ¸¦ ã¾Æ¾ß ÇÑ´Ù¸é, ºÐ¸í ¿©·¯ºÐÀº
¾Õ¿¡¼ ¼ýÀÚ¸¦ ÀÐ¾î °¡¸é¼ ¾ÕÀÇ ¼ýÀÚ º¸´Ù ´õ Å©´Ù¸é ±×°ÍÀ» ¸Ó¸®¿¡
»õ°Ü µÎ°í, ¸Ó¸®¿¡ »õ°ÜµÐ ¼ýÀÚ º¸´Ù ´õ Å« ¼ýÀÚ°¡ ³ª¿Â´Ù¸é ¼ýÀÚ¸¦
¹Ù²ãÄ¡±â ÇÒ °ÍÀÌ´Ù. °á±¹ ¸¶Áö¸· ¼ýÀÚ±îÁö ¸ðµÎ È®ÀÎÇÑ´Ù¸é ¸Ó¸®¿¡
³²¾Æ ÀÖ´Â ¼ö°¡ °¡Àå Å« ¼ö°¡ µÈ´Ù. ÀÌ·¯ÇÑ °úÁ¤Àº °ÅÀÇ ÀÚµ¿À¸·Î
ÀÌ·ç¾îÁø´Ù.
ÄÄÇ»ÅÍÀÇ °æ¿ì ÀÌ·¯ÇÑ °úÁ¤À» ´Ü°èº°·Î ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ
´Ü°è¸¦ ¸íÈ®È÷ Á¤ÀÇ Çϱâ À§Çؼ ¾à°£ÀÇ °èȹÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù.
¿ì¼± °¡Àå Å« ¼ýÀÚ¸¦ °í¸£±â À§Çؼ »ç¿ëµÉ ¼ýÀÚÀÇ ¸ñ·ÏÀÌ ÀÖÀ» °ÍÀ̸ç
ÀÌµé ¼ýÀÚÀÇ ¸ñ·ÏÀº ¸Þ¸ð¸® °ø°£¿¡ ÀúÀåµÇ¾î¾ß ÇÒ °ÍÀÌ´Ù. À̵éÀº
data_items°¡ °¡¸®Å°´Â ¸Þ¸ð¸®¿¡ ÀúÀåÇϵµ·Ï
°èȹÇϰڴÙ. ¿ì¸®´Â ¶ÇÇÑ ¼ýÀÚ¸ñ·Ï¿¡¼ ÇöÀç À§Ä¡¸¦ ÀÐ¾î ¿Ã ¼ö ÀÖ¾î¾ß
ÇÑ´Ù. ±×·¡¾ß °ËÅäÇØ¾ßÇÒ ¼ýÀÚ¸¦ ÀÐ¾î ¿Ã ¼ö Àֱ⠶§¹®ÀÌ´Ù. ±×¸®°í
°¡ÀåÅ« ¼ýÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£µµ ¸¶·ÃµÇ¾î¾ß ÇÑ´Ù. ÀÌµé ¼ýÀÚ
Á¤º¸¸¦ ÀúÀåÇϱâ À§Çؼ ´ÙÀ½°ú °°Àº ·¹Áö½ºÅ͸¦ »ç¿ëÇϵµ·Ï °èȹÇß´Ù.
%edi ´Â ¸ñ·Ï¿¡¼ ÇöÀçÀÇ À§Ä¡¸¦ ÀúÀåÇÑ´Ù.
%ebx ´Â ÇöÀç ¸ñ·Ï¿¡¼ °¡Àå Å« ¼ýÀÚ¸¦ ÀúÀåÇÑ´Ù.
%eax ´Â °ËÅäÇÒ ¼ýÀÚ¸¦ ÀúÀåÇϱâ À§Çؼ »ç¿ëÇÑ´Ù.
ÇÑ °¡Áö ¿¹¿ÜÀûÀ¸·Î ó¸®ÇؾßÇÒ ¼ýÀÚ°¡ Àִµ¥, ¹Ù·Î ¸ñ·ÏÀÇ °¡Àå
óÀ½ °¡Á®¿Â ¼ýÀÚÀÌ´Ù. ÀÌ ¼ýÀÚ´Â ´Ù¸¥ ¾î¶² ¼ýÀڿ͵µ ºñ±³ÇÒ ¼ö
¾øÀ¸¹Ç·Î ÀÚµ¿ÀûÀ¸·Î °¡Àå Å« ¼ýÀÚ°¡ µÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ
¼Õ½¬¿î ¼öÇàÀ» À§Çؼ ÇöÀç À§Ä¡°¡ °¡¸®Å°´Â ¼ýÀÚ¸¦ 0À¸·Î Çϸé
µÈ´Ù. ±×·¯¸é ¸ñ·ÏÀÇ Ã³À½ ¼ýÀÚ´Â 0°ú ºñ±³µÇ°í ÇöÀç ½ÃÁ¡¿¡¼ °¡Àå
Å« ¼ýÀÚ·Î %ebx¿¡ ÀúÀåµÉ °ÍÀÌ´Ù. ±× ´ÙÀ½¿¡´Â ¸ñ·ÏÀÇ ´ÙÀ½ ¼ýÀÚ¿Í
¹è±³ÇÏ¸é µÈ´Ù. ÀÌ·¯ÇÑ °úÁ¤À» ¼ø¼´ë·Î ±â¼úÇØ º¸µµ·Ï ÇÏÀÚ.
¸ñ·ÏÀÇ Ã³À½ ¼ýÀÚ°¡ 0ÀÎÁö È®ÀÎÇÑ´Ù.
¸¸¾à 0À̶ó¸é Á¾·á(exit)ÇÑ´Ù.
ÇöÀç À§Ä¡¸¦ 1Áõ°¡ ½ÃŲ´Ù(%edi)
´ÙÀ½ °ªÀ» ÀÐ¾î ¿Í¼ %eax ·¹Áö½ºÅÍ¿¡ °ªÀ» ÀúÀåÇÑ´Ù.
ÇöÀç °ª %eax¿Í °¡Àå Å« °ª %ebx¸¦ ºñ±³ÇÑ´Ù.
¸¸¾à ÇöÀç °ªÀÌ ÃÖ±ÙÀÇ °¡Àå Å« °ª º¸´Ù Å©´Ù¸é ÇöÀç °ªÀ»
%ebx¿¡ ÀúÀåÇÑ´Ù.
¹Ýº¹ÇÑ´Ù.
À̰ÍÀ» ÇÁ·Î½ÃÁ®(procedure, ÀÇ»çÁøÇà)À̶ó°í ÇÑ´Ù. ÇÁ·Î½ÃÁ®¸¦
ÀÛ¼ºÇÏ´Ù º¸¸é ¸Å¿ì ÀÚÁÖ ¸¸¾à(if)¶ó´Â ´Ü¾î°¡
µîÀåÇÔÀ» º¼ ¼ö ÀÖ´Ù. À̰ÍÀº ÁøÇà(È帧)À» ºÐ±â ½Ã۱â À§Çؼ
»ç¿ëÇÑ´Ù. if ´ÙÀ½¿¡ ÁÖ¾îÁø Á¶°ÇÀ» ¸¸Á·ÇÏ´À³Ä ±×·¸Áö ¾Ê´À³Ä¿¡
µû¶ó¼ ¼öÇàÇÏ´Â ¸í·ÉÀÌ ´Þ¶óÁö°Ô µÈ´Ù.
2 ¹øÀ» º¸¸é %eaxÀÇ °ªÀÌ 0ÀÎÁö ¾Æ´ÑÁö¿¡ µû¶ó È帧À» ºÐ±â ½Ã۰í
ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. %eax°¡ 0À̶ó´Â °ÍÀº ¿ì¸®°¡ óÀ½ ¼³Á¤Çß´ø
µ¥·Î ¸ñ·ÏÀ» ³¡À» ³ªÅ¸³»´Â °ÍÀ̹ǷΠ´õÀÌ»ó È帧À» ÁøÇà ½Ãų
Çʿ䰡 ¾ø±â ¶§¹®ÀÌ´Ù. 0ÀÌ ¾Æ´Ï¶ó¸é ¸ñ·ÏÀÇ ´ÙÀ½ °ªÀ» °¡¸®Å°µµ·Ï
Çϰí 4, 5, 6À» ÁøÇàÇϸé¼
ÀÌÀüÀÇ °¡Àå Å«°ª°ú ºñ±³Çؼ ´õ Å« °ªÀ» %ebx¿¡ ÀúÀåÇÑ´Ù.
±×¸®°í ÇÁ·Î±×·¥Àº ¾ÆÁ÷ ¸ñ·ÏÀÇ ¸¶Áö¸·±îÁö ¼ýÀÚµéÀ» Á¶»çÇÏÁö ¾Ê¾Ò
À¸¹Ç·Î ´Ù½Ã 2 ¹øÀ¸·Î °¡¼ Áö±Ý±îÁöÀÇ ºñ±³ÀÛ¾÷À» ¹Ýº¹ÇÑ´Ù.
if ÀÇ È帧À» ºÐ±âÇѴٴ Ư¼º ¶§¹®¿¡
È帧Á¦¾î(flow control)¸í·ÉÀ̶ó°í
ºÎ¸¥´Ù. ÀÌÀü¿¡ ´Ù·ç¾ú´ø ù¹øÂ° ¾î¼Àºí¸® ÇÁ·Î±×·¥Àº ¾î¶°ÇÑ
È帧Á¦¾î ¸í·Éµµ Æ÷ÇÔÇϰí ÀÖÁö ¾Ê¾Ò´Ù. ´ÜÁö ÇϳªÀÇ È帧¸¸ÀÌ
Á¸ÀçÇß¾ú±â ¶§¹®ÀÌ´Ù. ±×·¯³ª ÀÌ ÇÁ·Î±×·¥Àº Á»´õ ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î
µ¥ÀÌÅ͸¦ ´Ù·ç¾î¾ß Çϱ⠶§¹®¿¡ È帧Á¦¾î ¸í·ÉÀÌ ÇÊ¿äÇØ Áö°Ô µÈ´Ù.
È帧Á¦¾î ¸í·É ¿Ü¿¡µµ ÀÌÇÁ·Î±×·¥ÀÌ ¿Ï¼ºµÇ±â À§ÇØ 2°³ÀÇ ´Ù¸¥
»õ·Î¿î ¸í·ÉµéÀÌ »ç¿ëµÉ °ÍÀÌ´Ù. conditional jump¿Í unconditional jump°¡
±×°ÍÀε¥, conditional jump´Â Á¶°Ç Á¡ÇÁ·Î Á¶°ÇÀ» ¸¸Á·ÇÏ´ÂÁö¸¦ ÆÇ´ÜÇØ¼
ƯÁ¤ ·çƾÀ¸·Î À̵¿Çϱâ À§Çؼ »ç¿ëÇÑ´Ù. uncoditional jump´Â ¹«Á¶°Ç Á¡ÇÁ·Î
Á¶°ÇÀÇ ¸¸Á·°ú °ü°è¾øÀÌ ÁöÁ¤ÇÑ ·çƾÀ¸·Î À̵¿½ÃŲ´Ù. À̵é jump¿¡ ´ëÇÑ
ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ Àå¿¡¼ ´Ù·ç°Ô µÉ °ÍÀÌ´Ù.
È帧Á¦¾î¸¦ À§ÇØ »ç¿ëµÇ´Â ¶Ç´Ù¸¥ ÀåÄ¡´Â ·çÇÁ(loop)ÀÌ´Ù. ·çÇÁ´Â
¹Ýº¹ÀûÀ¸·Î ½ÇÇàµÇ´Â ÄÚµåÀÇ Á¶°¢À» ¸»ÇÑ´Ù. ¿¹¸¦ µé¾î ¿ì¸®°¡
ÀÛ¼ºÇÒ ÇÁ·Î±×·¥Àº óÀ½¿¡ 0°ú ¸ñ·ÏÀÇ Ã¹¹øÂ° °ªÀ» ºñ±³Çؼ
°¡Àå Å«°ªÀ¸·Î ¸ñ·ÏÀÇ Ã¹¹øÂ° °ªÀ» ÃÖ°í°ªÀ¸·Î µî·Ï½Ã۰í
±× ´ÙÀ½¿¡´Â ¸ñ·ÏÀÇ µÎ¹øÂ° °ª°ú ÇöÀç ÃÖ°í°ªÀ» ºñ±³ÇÏ´Â ½ÄÀ¸·Î
µ¿ÀÏÇÑ ÀÏÀ» °è¼Ó(¸ñ·ÏÀÇ ¸¶Áö¸· ¼ýÀÚÀÎ 0¿¡ µµ´ÞÇÒ ¶§±îÁö) ¹Ýº¹ÇÒ °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¹Ýº¹ÀÛ¾÷ÀÇ Ã³¸®¸¦ À§Çؼ ·çÇÁ¸¦ »ç¿ëÇÏ°Ô µÈ´Ù.
·çÇÁÀÇ ¹Ýº¹À» À§Çؼ ¿©±â¿¡¼´Â unconditional jump¸¦ »ç¿ëÇϰí ÀÖ´Ù.
·çÇÁ ÄÚµå ¿µ¿ªÀÇ ¸¶Áö¸·¿¡ µµ´ÞÇÏ¸é ¹«Á¶°Ç ·çÇÁ ÄÚµåÀÇ Ã³À½À¸·Î µ¹¾Æ°£´Ù.
·çÇÁÄÚµåÀÇ Ã³À½¿¡¼´Â ¸ñ·Ï¿¡¼ ¼ýÀÚ¸¦ °¡Á®¿À°í 0ÀÎÁö ¾Æ´ÑÁö¸¦ ÆÇ´ÜÇÑ´ÙÀ½
0À̶ó¸é ·çÇÁ¸¦ ºüÁ®³ª°¡±â À§Çؼ jump¸¦ ½ÃµµÇÒ °ÍÀÌ´Ù. À̶§ÀÇ jump´Â Á¶°ÇÀÇ
ÆÇ´ÜÈÄ¿¡ ÀÌ·ç¾î Áö¹Ç·Î conditional jump°¡ ÇÊ¿äÇÏ°Ô µÈ´Ù.
´ÙÀ½Àå¿¡¼´Â Áö±Ý±îÁöÀÇ °èȹÀ» ½ÇÁ¦ ÇÁ·Î±×·¥ÀÇ ÀÛ¼º¿¡ Àû¿ëÇÒ °ÍÀÌ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº °£´ÜÇÏÁö¸¸ ÇÁ·Î±×·¥À¸·Î½á °¡Á®¾ßÇÒ ´ëºÎºÐÀÇ ±âº»¿ä°ÇÀ»
°¡Áö°í ÀÖÀ¸¹Ç·Î Á¦´ë·Î ÀÌÇØÇÑ´Ù¸é ¾ÕÀ¸·Î ÀÌ ¹®¼¸¦ Àдµ¥ Å« µµ¿òÀÌ
µÉ°ÍÀÌ´Ù.
3.4. ÃÖ´ë ¼ýÀÚ Ã£±â ÄÚµåÀÇ À̸§Àº maximum.s·Î ÇÑ´Ù.
# data_items¿¡ ÀÖ´Â ¼ýÀÚÀÇ ¸ñ·ÏÁß °¡Àå Å«
# µ¥ÀÌÅ͸¦ ¾ò¾î¿Í¼ ¸®ÅÏÇÑ´Ù.
#
# º¯¼öµé : ÇÁ·Î±×·¥ÀÇ ÀÛµ¿À» À§Çؼ »ç¿ëµÇ´Â ·¹Áö½ºÅ͵é
# %edi - µ¥ÀÌŸ ¸ñ·Ï¿¡¼ Á¶»çÇÒ ¼ýÀÚÀÇ À妽º ÀúÀå¿ë
# %ebx - °¡Àå Å« ¼ýÀÚ ÀúÀå¿ë
# %eax - ÇöÀç ºñ±³ÇÒ ¼ýÀÚ ÀúÀå¿ë
#
# The following memory locations are used:
#
# data_items - ºñ±³ÇÒ ¼ýÀÚµ¥ÀÌÅ͵é 0Àº ¸¶Áö¸·À» ³ªÅ¸³½´Ù.
#
.section .data
data_items: # ¼ýÀÚ µ¥ÀÌÅ͵é
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
.section .text
.globl _start
_start:
movl $0, %edi # move 0 into the index register
movl data_items(,%edi,4), %eax # load the first byte of data
movl %eax, %ebx # since this is the first item, %eax is
# the biggest
start_loop: # start loop
cmpl $0, %eax # check to see if we ve hit the end
je loop_exit
incl %edi # load next value
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax # compare values
jle start_loop # jump to loop beginning if the new
# one isn t bigger
movl %eax, %ebx # move the value as the largest
jmp start_loop # jump to loop beginning
loop_exit: # %ebx is the return value,
# and it already has the number
movl $1, %eax #1 is the exit() syscall
int $0x80
|
ÀÌÁ¦ ¾î¼Àºí°ú ¸µÅ©¸¦ ÀÌ¿ëÇØ¼ ½ÇÇàÆÄÀÏÀ» »ý¼ºÇÏÀÚ.
# as maximum.s -o maximum.o
# ld maximum.o -o maximum
|
½ÇÇà ÈÄ °á°ú¸¦ È®ÀÎÇØº¸µµ·Ï ÇÏÀÚ.
222°¡ Ãâ·ÂµÈ°ÍÀ¸·Î À§ÀÇ ÇÁ·Î±×·¥ÀÌ ÃÖ´ë ¼ýÀÚ¸¦ Á¦´ë·Î °ñ¶ó³½ °É
È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·³ À§ÀÇ Äڵ带 ÇÑÁÙ¾¿ ºÐ¼®ÇØ º¸µµ·Ï ÇÏÀÚ.
µ¥ÀÌÅÍ ¼½¼Ç¿¡¼ °¡Àå ¸ÕÀú ¸¸³ª´Â ÄÚµå´Â ¾Æ·¡¿Í °°´Ù.
data_items: # ¼ýÀÚ µ¥ÀÌÅ͵é
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
|
data_items´Â ¼ýÀÚ µ¥ÀÌÅ͵éÀÌ ÀúÀåµÈ À§Ä¡¿¡
´ëÇÑ ÂüÁ¶¶óº§ÀÌ´Ù. ½ÇÁ¦ µ¥ÀÌÅͰ¡ Á¤ÀÇµÈ Äڵ忡¼´Â .long ¸¦ ÀÌ¿ëÇØ¼
ÀúÀåµÉ µ¥ÀÌÅÍÀÇ Çü(type)¸¦ ¸í½ÃÇϰí ÀÖ´Ù. ±×·¡¾ß Á¦´ë·ÎµÈ ¸Þ¸ð¸® ÇÒ´çÀÌ
ÀÌ·ç¾îÁú ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÀÌÁ¦ºÎÅÍ data_items´Â µ¥ÀÌÅÍÀÇ Ã¹¹øÂ° ¿µ¿ªÀ»
°¡¸®Å²´Ù. data_items°¡ µ¥ÀÌÅÍÀÇ Ã¹¹øÂ° ¿µ¿ªÀ» °¡¸®Å°°í Àֱ⠶§¹®¿¡
¿ì¸®´Â data_items¿¡ ´ëÇÑ °£´ÜÇÑ ¿¬»êÀ¸·Î ¼ýÀÚ µ¥ÀÌÅ͵éÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.
¿¹¸¦ µé¾î¼ movl data_items, %eax ¸í·ÉÀ» ³»¸®¸é 3ÀÌ %eax ·¹Áö½ºÅÍ¿¡
ÀúÀåµÈ´Ù. ¾î¼Àºí¸®¾î´Â .long ¿Ü¿¡µµ ´ÙÀ½°ú °°Àº ¿©·¯°¡Áö µ¥ÀÌÅÍÇüÀ»
Á¦°øÇÑ´Ù.
- .byte
1byteÀÇ µ¥ÀÌÅͰªÀ» ¸í½ÃÇÑ´Ù. 0-255¹üÀ§ÀÇ °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
- .int
2byteÀÇ µ¥ÀÌÅͰªÀ» ¸í½ÃÇÑ´Ù. 0-65535¹üÀ§ÀÇ °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
- .long
4byteÀÇ µ¥ÀÌÅͰªÀ» ¸í½ÃÇÑ´Ù. 0-4294967295¹üÀ§ÀÇ °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
- .ascii
¸Þ¸ð¸®¿¡ ¹®ÀÚ¿À» Á÷Á¢ ÀúÀåÇϱâ À§Çؼ »ç¿ëÇÑ´Ù. °¢°¢ÀÇ ¹®ÀÚ´Â
1byteÀÇ °ø°£À» Â÷ÁöÇÑ´Ù. ¸¸¾à .ascii "Hello there\0" ·Î
Á¤ÀÇ Çß´Ù¸é ¾î¼Àºí·¯´Â 12byteÀÇ °ø°£À» È®º¸Çϰí È®º¸µÈ °ø°£¿¡ À§ÀÇ
¹®ÀÚ¿À» ÀúÀåÇÏ°Ô µÈ´Ù. ù¹øÂ° À§Ä¡¿¡´Â H°¡
µÎ¹øÂ° À§Ä¡¿¡´Â e°¡ ÀúÀåµÈ´Ù. Á¦ÀÏ ¸¶Áö¸·¿¡´Â
'\0'ÀÌ ÀúÀåµÇ´Âµ¥, ÀÌ °ªÀº ȸ鿡 Ãâ·ÂµÇÁö ¾Ê°í ´ÜÁö ¹®ÀÚ¿ÀÇ
¸¶Áö¸· À̶ó´Â °ÍÀ» ¾Ë·ÁÁÖ±â À§Çؼ »ç¿ëÇÑ´Ù. À̿ܿ¡µµ Åǰú
°³Ç๮ÀÚ¸¦ Ç¥½ÃÇϱâ À§Çؼ '\t'¿Í '\n'°°Àº ¹®Àڵ鵵 »ç¿ëµÈ´Ù.
À§ÀÇ ¿¹Á¦ÀÇ °æ¿ì ¾î¼Àºí·¯´Â ¼ýÀÚÀÇ ¸ñ·ÏÀ» ÀúÀåÇϱâ À§Çؼ 4byte * 14 ¸¸ÅÀÇ
¸Þ¸ð¸® °ø°£À» È®º¸°Ô µÈ´Ù.
¼ýÀÚÀÇ ¸ñ·ÏÀ» ÀúÀåÇϴµ¥ ÀÖ¾î¼ ¸¶Áö¸·¿¡ 0À» »ç¿ëÇß´Ù´Â °ÍÀ» ÁÖ¸ñÇϱâ
¹Ù¶õ´Ù. ÀÌ ÇÁ·Î±×·¥¿¡¼´Â ¼ýÀÚ ¸ñ·ÏÀÇ ¸¶Áö¸·À̶ó´Â °ÍÀ» ¾Ë·ÁÁÖ±â
À§Çؼ 0À» »ç¿ëÇϰí ÀÖ´Ù. ¼ýÀÚ ¸ñ·ÏÀÇ °¹¼ö¸¦ ¸íÈ®È÷ Çϱâ À§Çؼ
À̹ۿ¡µµ ¼ýÀÚ ¸ñ·ÏÀÇ Ã³À½¿¡ Àüü ¼ýÀÚÀÇ °¹¼ö¸¦ Àû¾îÁشٰųª ÇÁ·Î±×·¥³»¿¡
Àüü ¼ýÀÚÀÇ °¹¼ö¸¦ Á÷Á¢ ³Ö´Â ¹æ¹ýÀÌ ÀÖÀ» ¼ö ÀÖ´Ù. ÀÌ ¿Ü¿¡µµ ¿©·¯°¡Áö
¹æ¹ýÀ» ÅëÇØ¼ ¼ýÀÚÀÇ °¹¼ö¸¦ ¸í½ÃÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ Ã³·³ ¸ñ·ÏÀÇ ³¡À» ³ªÅ¸³»±â À§Çؼ ¿©·¯°¡Áö ¹æ¹ýµéÀÌ µ¿¿øµÇ´Â ÀÌÀ¯´Â
ÄÄÇ»ÅÍÀÇ °æ¿ì ¿ì¸®°¡ ¸íÈ®ÇÏ°Ô ³¡À» ÁöÁ¤ÇØ ÁÖ±â Àü¿¡´Â
¸ñ·ÏÀÇ ³¡ÀÌ ¾îµòÁö ÃøÁ¤ ÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.
ÀÌÁ¦.globl¿¡ ´ëÇØ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. À̰ÍÀº
¾î¶°ÇÑ µ¥ÀÌÅ͵µ °¡ÁöÁö ¾ÊÀ¸¸ç ´ÜÁö ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵Ǵ ½ÇÇà À§Ä¡¸¦
¾Ë·ÁÁÖ±â À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. Linux´Â ÇÁ·Î±×·¥À» ½ÃÀÛÇϱâ À§Çؼ
¾îµðºÎÅͰ¡ ½ÇÇ࿵¿ªÀÎÁö¸¦ ¾Ë°í ÀÖ¾î¾ß Çϸç _start ºÎÅÍ ½ÇÇàÇÑ´Ù.
.globlÀº _start¸¦ ÂüÁ¶½ÃŲ´Ù.
.globlÀ» »ý·«ÇÒ °æ¿ì ¸µÅ©½Ã ´ÙÀ½°ú °°Àº ¿¡·¯°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù.
# ld maximum.o -o maximum
ld: warning: cannot find entry symbol _start; defaulting to 08048074
|
ÀÌ °É·Î ÇØ¼ ¿ì¸®°¡ »ç¿ëÇÒ ¸ðµç µ¥ÀÌÅÍÀÇ Áغñ¸¦ ¸¶ÃÆÀ¸´Ï, ÀÌÁ¦ º»°ÝÀûÀ¸·Î
µ¥ÀÌÅ͸¦ ÀÌ¿ëÇØ¼ ÇÊ¿äÇÑ ÀÛ¾÷(°¡Àå Å« ¼ýÀÚ¸¦ °¡·Á³»´Â)À» ÇØ¾ß ÇÑ´Ù.
À§ Äڵ带 º¸¸é # º¯¼öµé¶ó°í µÇ¾î ÀÖ´Â ÁÖ¼®À»
º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌµé º¯¼ö´Â ÀÛ¾÷À» À§Çؼ »ç¿ëµÇ´Â µ¥ÀÌÅ͵éÀ»
ÀúÀåÇϱâ À§ÇÑ ¿ë±â·Î »ç¿ëÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº º¯¼öµéÀÌ
»ç¿ëµÈ´Ù.
ÃÖ±ÙÀÇ ÃÖ´ë°ªÀ» ÀúÀåÇϱâ À§ÇÑ º¯¼ö
¼ýÀÚ ¸ñ·Ï¿¡¼ °¡Á®¿Í¾ßÇÒ ¼ýÀÚÀÇ À§Ä¡¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö
¼ýÀÚ ¸ñ·Ï¿¡¼ °¡Á®¿Â ¼ýÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö
¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥Àº ¸Å¿ì °£´ÜÇϹǷΠ´ÜÁö ¸î°³ÀÇ º¯¼ö¸¸ ÇÏ¿ëÇÏ¸é µÇ¸ç,
·¹Áö½ºÅ͸®¸¸À¸·Î ÀÌµé º¯¼ö¸¦ ´ã¾Æ³¾ ¼ö ÀÖ´Ù. ±×·¯³ª ÇÁ·Î±×·¥ÀÌ Ä¿Áö°í
°Å±â¿¡ µû¶ó¼ ´Ù·ç¾î¾ßÇÏ´Â µ¥ÀÌÅ;çÀÌ Ä¿Áú °æ¿ì ·¹Áö½ºÅ͸¸À¸·Î ¸ðµç
ÀÛ¾÷À» ÇÒ ¼ö ¾ø°Ô µÈ´Ù. ¿©±â¿¡ ´ëÇØ¼´Â ³ªÁß¿¡ ´Ù·ç°Ô µÉ°ÍÀÌ´Ù.
ÀÌ ÇÁ·Î±×·¥¿¡¼ °¡Àå Å« ¼ýÀÚ¸¦ ÀúÀåÇϱâ À§Çؼ %ebx¸¦ »ç¿ëÇß´Ù. %edi´Â
ÇöÀç °¡Á®¿Í¾ßÇÒ ¼ýÀÚÀÇ À§Ä¡(index)¸¦ ÀúÀåÇϱâ À§Çؼ »ç¿ëÇÑ´Ù. %edi¸¦
ÀÌ¿ëÇØ¼ ¿ì¸®´Â data_items·Î ºÎÅÍ ¸î ¹øÂ° ¼ýÀÚ¸¦ Àоî¿Í¾ß ÇÒÁö¸¦
°áÁ¤ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ÇÁ·Î±×·¥ÀÌ ¸· ½ÃÀÛÇßÀ» ¶§´Â data_itemsÀÇ Ã¹¹øÂ°
¼ýÀÚ¸¦ °¡Á®¿Í¾ß µÇ¹Ç·Î %edi´Â 0ÀÌ ÀԷµȴÙ. ù¹øÂ° ¼ýÀÚ¸¦ °¡Á®¿Ô´Ù¸é
%edi¿¡´Â 1ÀÌ µé¾î°¡°í, ´ÙÀ½ ¼ýÀÚ¸¦ °¡Á®¿Ã ¶§´Â data_itemsÀÇ µÎ¹øÂ°
¼ýÀÚ¸¦ °¡Á®¿À°Ô µÈ´Ù.
%edi´Â µ¥ÀÌÅÍ ¸ñ·ÏÀÇ ¸î¹øÂ° µ¥ÀÌÅ͸¦ °¡Á®¿Í¾ß ÇÏ´ÂÁö¸¸À» ¾Ë·ÁÁÖ´Â
À妽º ÀÌ´Ù. ¿ì¸®´Â ÀÌ À妽º °ªÀ» ÀÌ¿ëÇØ¼ data_items·Î ºÎÅÍ °ªÀ»
°¡Á®¿Í¾ß Çϴµ¥ ´ÙÀ½°ú °°Àº °°´ÜÇÑ ¿¬»êÀÌ »ç¿ëµÈ´Ù.
movl data_items(,%edi,4), %eax
|
´ÙÀ½Àº ¸ñ·ÏÀ¸·Î ºÎÅÍ ¼ýÀÚ¸¦ °¡Á®¿À°í ÃÖ°í°ªÀ» ÀúÀåÇÏ´Â ·çƾÀÌ´Ù.
data_items´Â ¿ì¸®°¡ °è»ê¿¡ »ç¿ëÇÒ ¼ýÀÚ ¸ñ·ÏÀÇ
ù¹øÂ° ¼ýÀÚ¸¦ °¡¸£Å²´Ù.
¼ýÀÚ¸ñ·ÏÀÇ ¼ýÀÚµéÀº .long ÇüÀ̹ǷΠ4byteÀÇ Å©±â¸¦ Â÷ÁöÇÑ´Ù.
°¢ ¼ýÀÚ°¡ Â÷ÁöÇÏ´Â °ø°£ÀÌ 4byteÀÎ °ÍÀ» ÀÌ¿ëÇØ¼ ´ÙÀ½ ¼ýÀÚ¸¦
°¡Á®¿Ã ¼ö ÀÖ´Ù.
¿ì¸®´Â Áö±Ý ¼ýÀÚ¿Í ´ÙÀ½ ¼ýÀÚ¸¦ ºñ±³Çؼ ÃÖ°í Å« ¼ýÀÚ¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.
°¡Àå Å« ¼ýÀÚ´Â ¿ì¸®°¡ ÁغñÇÑ ·¹Áö½ºÅÍ¿¡ º¹»çÇÑ´Ù.
´Ù½Ã óÀ½À¸·Î µÇµ¹¾Æ °£´Ù.
À§ÀÇ ·çƾÀ» º¸¸é óÀ½À¸·Î µÇµ¹¾Æ °£´Ù°í µÇ¾î ÀÖ´Ù. óÀ½À̶ó ÇÔÀº
·çÇÁÀÇ Ã³À½ÀÎ start_loopÀÌ µÈ´Ù. ·çÇÁÀÇ Ã³À½À¸·Î
µÇµ¹¾Æ °£´Ù. ·çÇÁÀÇ Ã³À½¿¡´Â ´ÙÀ½°ú °°Àº ¸í·ÉÀÌ µé¾î °£´Ù.
cmpl $0, %eax
je end_loop
|
cmplÀº 2°³ÀÇ °ªÀ» ºñ±³Çϱâ À§ÇÑ ¸í·ÉÀÌ´Ù.
¿©±â¿¡¼ ¿ì¸®´Â 0°ú %eax¿¡ ÀúÀåµÈ °ªÀ» ºñ±³Çϰí ÀÖ´Ù. ºñ±³¸¦ Çß´Ù¸é
ºñ±³¿¡ ´ëÇÑ °á°ú°¡ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ °á°ú´Â %eax·¹Áö½ºÅͰ¡ ¾Æ´Ñ
%eflags·¹Áö½ºÅÍ¿¡ µé¾î°£´Ù. ÀÌ ·¹Áö½ºÅÍ´Â
»óÅÂ(status) ·¹Áö½ºÅͶó°íµµ ºÒ¸®¿ì¿î´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº
³ªÁß¿¡ ´Ù·çµµ·Ï ÇϰڴÙ. ¾î¶µç ºñ±³µÈ °á°ú´Â %eflags¿¡ ÀúÀåµÇ°í
ÀúÀåµÈ °ªÀº ´ÙÀ½ Äڵ忡¼ Á¡ÇÁ¸¦ ÇÒÁö ¾ÈÇÒÁö¸¦ ÆÇ´ÜÇϱâ À§Çؼ »ç¿ëµÈ´Ù.
¿©±â¿¡¼´Â je°¡ »ç¿ëµÇ°í Àִµ¥, je´Â °ªÀÌ °°À» °æ¿ì¸¦ ÂüÀ¸·Î ÆÇ´ÜÇÑ´Ù.
±×·¡¼ %eaxÀÇ °ªÀÌ 0À¸·Î ¼·Î °°´Ù¸é end_loop·Î Á¡ÇÁ¸¦ ÇÏ°Ô µÇ°í, ±×·¸Áö
¾Ê´Ù¸é ±×³É ´ÙÀ½ ¶óÀÎÀ¸·Î ³Ñ¾î°¡°Ô µÈ´Ù. ¿©±â¿¡¼´Â Á¡ÇÁ¸¦ À§ÇÑ ºñ±³ ¸í·ÉÀ¸·Î
je¸¦ »ç¿ëÇϰí Çߴµ¥, À̿ܿ¡µµ ´Ù¾çÇÑ ºñ±³Á¡ÇÁ ¸í·ÉµéÀÌ
Á¸ÀçÇÑ´Ù.
- je
µÎ°³ÀÇ °ªÀÌ °°À¸¸é Á¡ÇÁÇ϶ó.
- jg
µÎ¹øÂ° °ªÀÌ Ã¹¹øÂ° °ªº¸´Ù Å©¸é Á¡ÇÁÇ϶ó.
- jge
µÎ¹øÂ° °ªÀÌ Ã¹¹øÂ° °ªº¸´Ù Å©°Å³ª °°À¸¸é Á¡ÇÁÇ϶ó.
- jl
µÎ¹øÂ° °ªÀÌ Ã¹¹øÂ° °ªº¸´Ù ÀÛÀ¸¸é Á¡ÇÁÇ϶ó.
- jle
µÎ¹øÂ° °ªÀÌ Ã¹¹øÂ° °ªº¸´Ù ÀÛ°Å´Ù °°´Ù¸é Á¡ÇÁÇ϶ó.
- jmp
¹«Á¶°Ç Á¡ÇÁÇÑ´Ù.
À̵é Á¡ÇÁ¿Í °ü·ÃµÈ ¸í·ÉµéÀÇ ¸ñ·ÏÀº Appendix B¸¦ Âü°íÇϱ⠹ٶõ´Ù.
¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥¿¡¼´Â 0°ú %eaxÀÇ °ªÀÌ °°À» °æ¿ì Á¡ÇÁÇϵµ·Ï
ÄÚµùµÇ¾î ÀÖ´Ù. %eax°¡ 0°ú °°´Ù¸é Áï ¸ñ·ÏÀÇ ¸¶Áö¸· À̶ó¸é loop_exit·Î
Á¡ÇÁÇÑ´Ù.
¸¸¾à ¼ýÀÚ¸ñ·Ï¿¡¼ °¡Á®¿Â ¼ýÀÚ°¡ 0ÀÌ ¾Æ´Ï¶ó¸é ´ÙÀ½ ¸í·ÉÀÌ ½ÇÇàµÈ´Ù.
incl %edi
movl data_item(,%edi,4), %eax
|
ÀÌÀüÀÇ ³»¿ëµéÀ» ÁÖÀÇ ±í°Ô Àоî¿Ô´Ù¸é %edi°¡ data_itemsÀÇ ¸ñ·ÏÀÇ
À妽º¸¦ ÀúÀåÇϰí ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇÒ °ÍÀÌ´Ù. ÀÌÁ¦ ´ÙÀ½ µ¥ÀÌÅÍ °ªÀ»
À妽º ÇØ¾ß ÇϹǷΠ%edi¸¦ 1¸¸Å Áõ°¡ ½ÃÄ×´Ù. ÀÌÂë µÇ¾ú´Ù¸é movl·Î ÇÏ´Â
ÀÏÀ» ÁüÀÛÇßÀ» °ÍÀÌ´Ù. data_item¿¡¼ %edi À§Ä¡¸¸Å À̵¿Çؼ µ¥ÀÌÅ͸¦
°¡Á®¿À°í À̰ÍÀ» %eax¿¡ º¹»çÇÏ´Â ÀÏÀ» ÇÑ´Ù. data_item¿¡ ÀÖ´Â °¢ µ¥ÀÌÅÍÀÇ
Å©±â´Â 4¹ÙÀÌÆ® À̹ǷΠ4¹ÙÀÌÆ®¸¸ÅÀ» %eax¿¡ º¹»çÇϰí ÀÖ´Ù.
cmpl %ebx, %eax
jle start_loop
|
ÀÌÁ¦ %ebx¿Í %eax¸¦ ºñ±³ÇÑ´Ù. %ebx´Â ÇöÀç±îÁö ã¾Æ³½ °¡ÀåÅ« ¼ýÀÚ°¡ µé¾î
ÀÖ´Ù. ¸¸¾à ÇöÀç °ªÀÌ ÀÌÀü ÃÖ°í°ªº¸´Ù À۰ųª °°´Ù¸é
start_loop·Î Á¡ÇÁÇÑ´Ù.
movl %eax, %ebx
jmp start_loop
|
¸¸¾à ÇöÀç °ªÀÌ ÀÌÀü ÃÖ°í°ªº¸´Ù Å©´Ù¸é %ebx¿¡ º¹»çÇϰí
start_loop·Î Á¡ÇÁÇÑ´Ù.
ÀÌÁ¦ 0À» ¸¸³¯¶§±îÁö À§ÀÇ ·çƾÀ» ¹Ýº¹ÇÑ´Ù. ¸¸¾à 0À» ¸¸³ª¸é
loop_exit·Î Á¡ÇÁÇÑ´Ù. ¸¶Áö¸· ºÎºÐ¿¡¼
ÀÌ ÇÁ·Î±×·¥Àº ¸®´ª½º Ä¿³ÎÀÇ exit¸¦ È£ÃâÇÏ°Ô µÈ´Ù. ½Ã½ºÅÛÄÝÀÇ È£ÃâÀº
%eax¿¡ ÀúÀåµÇ¾î ÀÖ´Â ¹øÈ£¸¦ ÅëÇØ¼ È£ÃâµÈ´Ù. exit½Ã½ºÅÛÄÝÀÇ ¹øÈ£´Â
1¹øÀ̹ǷΠ´ÙÀ½°ú °°Àº Äڵ尡 ÇÊ¿äÇÏ´Ù.
À̰ÍÀ¸·Î ¿ì¸®°¡ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¸ðµç ¼³¸íÀ» ¸¶ÃÆ´Ù. ¸Å¿ì
°£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ¿´Áö¸¸ »ó´çÈ÷ ¸¹Àº °ÍÀ» ¹è¿ï¼ö ÀÖ¾ú´Ù. °£´ÜÇÑ
ÇÁ·Î±×·¥ À̹ǷΠÀÌÇØ¿¡´Â Å« ¾î·Á¿òÀÌ ¾ø¾úÀ» °ÍÀÌ´Ù. ÀÌÇØ°¡ µÇÁö
¾Ê´Â ºÎºÐÀÌ ÀÖ´Ù¸é ÁÖ¼®°ú ÇÔ²² ÇÁ·Î±×·¥À» ÁÖÀÇ ±í°Ô ÀÐ¾î º¸±â
¹Ù¶õ´Ù. Á»´õ ¿Ïº®ÇÏ°Ô ÀÌÇØÇÏ°í ½Í´Ù¸é ÇÁ·Î±×·¥ÀÇ °¢ ½ºÅܺ°·Î
·¹Áö½ºÅÍÀÇ °ªÀÇ º¯È¸¦ ±â·ÏÇØ°¡¸é¼ Äڵ带 È®ÀÎÇØ º¸±â
¹Ù¶õ´Ù.
3.5. Addressing mode ¿ì¸®´Â 2Àå¿¡¼ ¾î¼Àºí¸®¾î°¡ 2°¡Áö Á¾·ùÀÇ µ¥ÀÌÅÍ Á¢±Ù ¹æ¹ý
(Data Accessing Methods)¸¦ °¡Áø´Ù´Â °ÍÀ» ¹è¿ü´Ù. À̹ø Àå¿¡¼´Â
ÀÌ·¯ÇÑ ¾î¼Àºí¸®¾î¿¡¼ Á¦°øÇÏ´Â ¾îµå·¹½º ±â¹ÝÀÇ µ¥ÀÌÅÍ Á¢±Ù ¹æ¹ý¿¡
´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
¸Þ¸ð¸® ÁÖ¼Ò¸¦ ÂüÁ¶ÇÏ´Â ÀϹÝÀûÀÎ Çü½ÄÀº ´ÙÀ½°ú °°´Ù.
ADDRESS_OR_OFFSET(%BASE_OR_OFFSET, %INDEX, MULTIPLIER)
|
À§ÀÇ ¸ðµç ÇʵåµéÀº Çʼö»çÇ×ÀÌ ¾Æ´Ñ ¿É¼Ç»çÇ×µéÀÌ´Ù. ´ÙÀ½Àº
À§ÀÇ ÇʵåµéÀÇ °ªÀ» ÀÌ¿ëÇØ¼ ÁÖ¼Ò¸¦ °è»êÇØ³»´Â ¹æ¹ýÀÌ´Ù.
FINAL ADDRESS = ADDRESS_OR_OFFSET + %BASE_OR_OFFSET + MULTIPLIER * %INDEX
|
ADDRESS_OR_OFFSET¿Í MULTIPLIER
¸ðµÎ »ó¼ö·Î ·¹Áö½ºÅÍ´Ù. ¸¸¾à ¾î¶² °ªµµ ¾ø´Ù¸é, 0ÀÌ »ç¿ëµÈ´Ù.
Addressing mode´Â 2ÀåÀÇ Data Accessing Method¿¡¼ ÀÌ¹Ì ¾ð±ÞÇÑÀûÀÌ
ÀÖÁö¸¸ º¹½ÀÂ÷¿ø¿¡¼ °£´ÜÈ÷ ¼³¸íÇϵµ·Ï ÇϰڴÙ.
- direct addressing mode
À̰ÍÀº ´ÜÁö ADDRESS_OR_OFFSET ¸¸ »ç¿ëÇÑ´Ù. ´ÙÀ½Àº »ç¿ë¿¹ÀÌ´Ù.
%eax¿¡´Â ¸Þ¸ð¸® ÁÖ¼Ò ADDRESSÀÇ °ªÀÌ Á÷Á¢ º¹»çµÈ´Ù.
- index addressing mode
ADDRESS_OR_OFFSET°ú %INDEX°¡ ¸ðµÎ »ç¿ëµÈ´Ù. À妽º ·¹Áö½ºÅÍ¿¡´Â
¾î¶² Á¾·ùÀÇ ÀϹݸñÀû(general-purpose) ·¹Áö½ºÅÍ¶óµµ »ç¿ëÇÒ
¼ö ÀÖ´Ù. À妽º ·¹Áö½ºÅÍ¿¡´Â 1, 2, 4ÀÇ ¹è¼ö°¡ ¿Ã ¼ö Àִµ¥,
ÀÌ·¸°Ô µÇ¹Ç·Î½á byte, double-byte, wordsÀÇ ¾î¶°ÇÑ À妽º¶óµµ
½±°Ô °è»êÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î¼ ¹®ÀÚ¿ÀÌ µé¾î ÀÖ´Â
string_start º¯¼ö°¡ Àִµ¥ ¿©±â¿¡¼ 3¹øÂ° ¹®ÀÚ¸¦ °¡Á®¿À°í
½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ Äڵ带 ¸¸µé¸é µÈ´Ù.
movl string_start(,%ecx,1), %eax
|
¹°·Ð À̰æ¿ì %ecx¿¡´Â À妽º°ªÀÎ 3ÀÌ µé¾îÀÖ¾î¾ß ÇÒ°ÍÀÌ´Ù.
ADDRESS_OR_OFFSET Çʵ尡 ºñ¾î ÀÖÀ¸¹Ç·Î ¿©±â¿¡´Â 0ÀÌ µé¾î°£´Ù.
Áï string_startÀÇ Ã³À½ÁÖ¼Ò¸¦ °¡¸®Å²´Ù. À妽ºÀÎ %ecx°¡ 3À̹ǷÎ
string_startÀÇ 3¹øÂ° ÁÖ¼Ò¸¦ °¡¸®Å°°í, MULTIPLIER°¡ 1À̹ǷÎ
1byte¸¸Å %eax·Î º¹»çµÈ´Ù.
- (°£Á¢)indirect addressing mode
·¹Áö½ºÅÍÀÇ ÁÖ¼Ò·Î ºÎÅÍ °ªÀ» Á÷Á¢ ÀоîµéÀδÙ. ¿¹¸¦µé¾î
%eaxÀÇ °ªÀ» %ebx·Î º¹»çÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
- base-pointer addressing mode
·¹Áö½ºÅÍÁÖ¼Ò °ª¿¡ »ó¼ö°ªÀ» ´õÇÑ´Ù´Â °ÍÀ» Á¦¿ÜÇϰí´Â
°£Á¢ÁÖ¼Ò ÁöÁ¤¹æ½Ä°ú ¸Å¿ì ºñ½ÁÇÑ ¹æ½ÄÀÌ´Ù. ¿¹¸¦ µé¾î ´ç½ÅÀÌ
¾î¶² ·¹ÄÚµå·Î ºÎÅÍ 4¹ÙÀÌÆ®ÀÇ
- immediate mode
Immediate mode´Â ¸Å¿ì °£´ÙÇÏ´Ù. ¿øÇÏ´Â °ªÀ» ·¹Áö½ºÅͳª ¸Þ¸ð¸® ¿µ¿ªÀ¸·Î
Á÷Á¢ ÀúÀåÇÏ´Â ¹æ½ÄÀÌ´Ù. ¿¹¸¦ µé¾î %eax¿¡ 12¶ó´Â °ªÀ» ÀúÀåÇϱ⠿øÇÑ´Ù¸é
´ÙÀ½°ú °°ÀÌ Immediate mode¸¦ ÀÌ¿ëÇØ¼ °£´ÜÇÏ°Ô Ã³¸®ÇÒ ¼ö ÀÖ´Ù.
Immediate mode¸¦ ÀÌ¿ëÇÒ ¶§ ¼ýÀÚ ¾Õ¿¡ ´Þ·¯($)Ç¥½Ã°¡ »ç¿ëµÇ°í ÀÖÀ½À»
ÁÖ¸ñÇϵµ·Ï ÇÏÀÚ. ¸¸¾à ´Þ·¯Ç¥½Ã¸¦ »ý·«ÇÏ°Ô µÉ°æ¿ì direct addressing mode·Î
¿¬»êÀ» ½ÃµµÇÏ°Ô µÈ´Ù. ÀÌ·¸°Ô µÇ¸é 12°¡ %eax¿¡ ÀúÀåµÇ´Â°Ô ¾Æ´Ï°í 12ÀÇ
¸Þ¸ð¸® À§Ä¡¿¡ ÀÖ´Â °ªÀÌ ÀúÀåµÇ¾î¼ ÀüÇô ¾û¶×ÇÑ °á°ú¸¦ °¡Á®¿À°Ô µÈ´Ù.
- register addressing mode
°£´ÜÇÏ°Ô ÇϳªÀÇ ·¹Áö½ºÅ͸¦ ´Ù¸¥ ·¹Áö½ºÅÍ·Î º¹»çÇϱâ À§Çؼ
»ç¿ëÇÑ´Ù.
¸Þ¸ð¸®ÀÇ µ¥ÀÌÅ͸¦ Á¦¾îÇϴµ¥ ÀÖ¾î¼ À§ÀÇ ¸ðµåµé Áß Çϳª°¡ »ç¿ëµÇ¹Ç·Î
¾îµå·¹½Ì ¸ðµå¿¡ ´ëÇØ¼ ÀÌÇØÇÏ´Â °ÍÀº ¸Å¿ì Áß¿äÇÏ´Ù. Immediate mode¸¦ Á¦¿ÜÇÑ
¸ðµç ¸ðµåµéÀº ¼Ò½º(source)³ª ¸ñÀûÁö ¿ÀÆÛ·£µå¸¦ ¸ðµÎ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é Immediate
mode´Â ´ÜÁö ¼Ò½º ¿ÀÆÛ·£µå¸¸ ÀÌ¿ëÇÑ´Ù.
°¢°¢ÀÇ ¸ðµåµéÀ» ÀÌ¿ëÇØ¼ ¸Þ¸ð¸® º¹»ç¿Í °°Àº ÀÏÀ» ÇÏ´Ù º¸¸é..
´Ù¾çÇÑ Å©±âÀÇ µ¥ÀÌÅ͸¦ º¹»çÇØ¾ß ÇÏ´Â °æ¿ì°¡ »ý±æ °ÍÀÌ´Ù.
¾î¼Àºí¸®´Â ÀÌ·¯ÇÑ °æ¿ì¸¦ ´ëºñÇÏ¿©¼ ÀÚÁÖ »ç¿ëÇÏ´Â µ¥ÀÌÅÍ Å©±â¿¡ ´ëÇØ¼
»ç¿ë°¡´ÉÇÑ ¸í·ÉµéÀ» ÁغñÇϰí ÀÕ´Ù. ¿öµå ´ÜÀ§ÀÇ µ¥ÀÌÅÍ º¹»ç¸¦
¿øÇÑ´Ù¸é movl¸¦ »ç¿ëÇϰí, ¹ÙÀÌÆ® ´ÜÀ§·ÎÀÇ
º¹»ç¸¦ ¿øÇÏ´Ù¸é movb¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª
¾Õ¿¡¼ ´Ù·ç¾ú´Ù ½ÃÇÇ µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§ÇÑ ÃÖ¼Ò´ÜÀ§·Î ·¹Áö½ºÅ͸¦
»ç¿ëÇϴµ¥ Å©±â°¡ ¿öµå´ÜÀ§ÀÌ´Ù. ±×·¯¹Ç·Î ¹ÙÀÌÆ®´ÜÀ§·Î ´Ù·ç°íÀÚ
ÇÒ°æ¿ì ·¹Áö½ºÅÍÀÇ ÀÏÁ¤¿µ¿ª¸¸À» »ç¿ëÇÒ ¼ö ÀְԵȴÙ(¾î¶»°Ô º¸¸é ³ª¸ÓÁö
°ø°£À» ³¶ºñÇÏ´Â °á°ú¸¦ °¡Á®¿Â´Ù°í º¼ ¼ö ÀÖ´Ù).
%eax¸¦ ¿¹·Î µé¾îº¸µµ·Ï ÇÏÀÚ. ¸¸¾à 2¹ÙÀÌÆ®ÀÇ Å©±â¸¦ º¹»çÇϰíÀÚ ÇÒ¶§
%ax¸¦ »ç¿ëÇÑ´Ù. %ax´Â least-significant halt °£´ÜÈ÷ ¸»Çؼ
4¹ÙÀÌÆ® Å©±âÀÇ ¿öµå(Áï %eaxÀ¸)¿¡¼ÀÇ ÇÏÀ§ 2¹ÙÀÌÆ®ÀÇ ¿µ¿ªÀ» °¡¸®Å²´Ù.
%ax´Â ´Ù½Ã 1¹ÙÀÌÆ®¾¿ 2°³·Î ³ª´· ¼ö ÀÖ´Ù. %al°ú %ah°¡ ±×°ÍÀ¸·Î
%alÀº %axÀÇ ¸¶Áö¸· ¹ÙÀÌÆ® %ah´Â %axÀÇ Ã³À½ ¹ÙÀÌÆ®¸¦ °¡¸®Å²´Ù.
4. ÇÔ¼ö¿¡ ´ëÇØ¼ ´Ù·ç±â4.1. º¹ÀâÇÑ ÇÁ·Î±×·¥ ´Ù·ç±â
2절¿¡¼ ´Ù·ç¾ú´ø ÇÁ·Î±×·¥Àº ¾î¼Àºí¸®ÀÇ ±âº»ÀûÀÎ
¼³¸íÀ» À§ÇÑ ¸Å¿ì ´Ü¼øÇÑ ÄÚµåµé·Î ÀÌ·ç¾îÁ® ÀÖÀ¸¸ç ´ÜÁö ÇϳªÀÇ ¼½¼Ç¸¸À»
°¡Áö°í ÀÖ´Ù. ÇÁ·Î±×·¥ÀÌ ´Ü¼øÇÏ´Ù¸é °ü°è ¾øÁö¸¸. ¸¸¾à Á» ±Ô¸ðÀÖ´Â
ÇÁ·Î±×·¥À» ¸¸µé¾î¾ß ÇÑ´Ù¸é ¼öõ, ¼ö¸¸¶óÀÎÀ» ÀÛ¼ºÇØ¾ß µÉÁöµµ ¸ð¸¥´Ù.
ÀÌ·± ÇÁ·Î±×·¥À» ÇϳªÀÇ ¼½¼ÇÀ¸·Î À¯ÁöÇϸé À¯Áöº¸¼ö°¡ ¸Å¿ì Èûµé °ÍÀÌ´Ù.
ƯÈ÷ ¿©·¯¸íÀÇ ÇÁ·Î±×·¥ÀÌ ÇϳªÀÇ ÇÁ·ÎÁ§Æ®¿¡ Âü°¡ÇÒ °æ¿ì ÇÁ·Î±×·¥ÀÇ
À¯Áö º¸µÎ´Â ´õ¿í Èûµé°Ô µÉ°ÍÀÌ´Ù.
ÀÌ·¸°Ô ÇÁ·Î±×·¥ÀÇ Å©±â°¡ Ä¿Áö°Å³ª µÎ¸íÀÌ»óÀÇ ÇÁ·Î±×·¡¸Ó°¡ Âü°¡ÇÒ ¶§´Â
Äڵ带 ÇÏ´ÂÀÏ¿¡ µû¶ó¼ ¸î°³ÀÇ Á¶°¢À¸·Î ³ª´©¾î¼ °ü¸®ÇÏ¸é µÉ°ÍÀÌ´Ù.
¹°·Ð À̰æ¿ì ³ªÁß¿¡ Á¶°¢À» Çϳª·Î ÇÕÄ¡±â ÆíÇϵµ·Ï Àß Á¤ÀǵÈ
ÀÎÅÍÆäÀ̽º¸¦ ¸¸µé°í ¿©±â¿¡ µû¶ó¼ ÀÚ½ÅÀÌ ¸ÃÀº Äڵ带 ÀÛ¼ºÇϵµ·Ï
ÇØ¾ß ÇÑ´Ù. ÀÌ·¸°Ô ÇÏ¸é °¢ ÇÁ·Î±×·¡¸Ó´Â ÀÚ½ÅÀÌ ¸ÃÀº ¿µ¿ª¸¸À»
µ¶¸³ÀûÀ¸·Î Å×½ºÆ® ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÇÁ·Î±×·¡¹ÖÀÇ ÁýÁßµµ¸¦ ³ôÀÏ ¼ö
ÀÖ°Ô µÇ°í, ´Ù¸¥ ÇÁ·Î±×·¡¸Ó¿Í Á»´õ È¿À²ÀûÀ¸·Î Çù¾÷ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
ÀÌ·¯ÇÑ µ¶¸³ÀûÀÎ °³¹ßÀ» À§Çؼ ÇÁ·Î±×·¡¸Ó´Â ÇÔ¼ö¶ó°í
ºÒ¸®¿ì´Â ¿©·¯°³ÀÇ ÄÚµåÁ¶°¢À» ¸¸µé°Ô µÈ´Ù. ¿öµå ÇÁ·Î¼¼¼¸¦ ¸¸µç´Ù°í
°¡Á¤Çغ¸ÀÚ. ±×·³ "°¡" °³¹ßÀÚ´Â »ç¿ëÀÚÀÇ Å°ÀÔ·ÂÀ» ó¸®ÇÏ´Â
handle_type_chracter ÇÔ¼ö¸¦ ¸¸µéµµ·Ï ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â À¯ÀúÀÇ Å°ÀÔ·ÂÀ»
ÀÐ¾î µé¿©¼ ±× °ªÀ» ȸ鿡 Ãâ·ÂÇÏ´Â ÀÏÀ» ÇÑ´Ù. "³ª"¶ó´Â °³¹ßÀÚ´Â
check_chracter_spell À̶ó´Â ¿ÀŸ°Ë»ç ÇÔ¼ö¸¦ ¸¸µéµµ·Ï ÇÑ´Ù.
ÀÌ ÇÔ¼ö´Â handle_type_chracter¿¡ ÀÇÇØ¼ ÀÔ·ÂµÈ ¹®ÀÚ¸¦ °Ë»çÇØ¼
¿ÀŸ°¡ ¹ß»ýÇÏ´ÂÁö¸¦ È®ÀÎÇÏ´Â ÀÏÀ» ÇÑ´Ù. ÇÔ¼ö´Â ÀÌ·¸°Ô
ÁÖ¾îÁö´Â µ¥ÀÌÅÍ¿Í ÀÌÀÇ Ã³¸®ÇÏ´Â ·çƾ´ÜÀ§·Î ¸¸µé¾î Áö°Ô µÈ´Ù.
Á» ±Ô¸ðÀÖ´Â ÇÁ·Î±×·¥µéÀº ¼ö¹é¿¡¼ ¼öõÀÇ ÀÌ·¯ÇÑ Á¶±×¸¶ÇÑ ÇÔ¼öµé·Î
ÀÌ·ç¾îÁö°Ô µÈ´Ù. ÀÌ·¯ÇÑ ÇÔ¼öµé Áß¿¡´Â °³¹ßÀÚ°¡ Çʿ信 ÀÇÇØ¼ ±×¶§ ±×¶§
¸¸µé¾î Áö´Â °Íµéµµ ÀÖÁö¸¸ ½Ã½ºÅÛ¿¡ ÀÇÇØ¼ Á¦°øµÇ´Â ÇÔ¼öµéµµ ÀÖ´Ù.
´ç¿¬ÇÏÁö¸¸ ÀÌ¹Ì ¸¸µé¾îÁø ÇÔ¼ö´Â »ç¿ëÀÚ°¡ ´Ù½Ã ¸¸µé¾î¼ »ç¿ëÇÒ ¼ö ¾ø´Ù.
ÀÌ·± ½Ã½ºÅÛ¿¡¼ Á¦°øÇÏ´Â ÇÔ¼öµéÀ» ¿ø½Ã(primitive)ÇÔ¼ö¶ó°í ºÎ¸¥´Ù.
¿¹¸¦ µé¾î ±×·¡ÇÈ À¯Àú ÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù°í
°¡Á¤ÇØ º¸ÀÚ. ¿©±â¿¡´Â ¸Þ´º¸¦ »ý¼ºÇϱâ À§ÇÑ ÇÔ¼ö°¡ ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ ÇÔ¼öµéÀº ±ÛÀÚ¸¦ ¾²°Å³ª, ¾ÆÀÌÄÜÀ» ¹èÄ¡Çϰųª, ¹è°æÀÇ »öÀ» ¼³Á¤Çϰųª
¸¶¿ì½ºÀÇ À§Ä¡¸¦ °è»êÇÏ´Â ÇÔ¼öµéÀÌ ÀÖÀ» °ÍÀÌ´Ù. ±×¶ó³ª ÀÌ·¯ÇÑ ÇÔ¼öµé
¿Ü¿¡µµ ±âº»ÀûÀ¸·Î ¼±À» ¸¸µé°Å³ª, Á¡À» Âï°Å³ª ÇÏ´Â µîÀÇ °¡Àå ±âº»ÀûÀÎ
ÇÔ¼öµéÀÌ ÀÖÀ» °ÍÀ̰í À̰͵éÀº ¿î¿µÃ¼Á¦ ¼öÁØ¿¡¼ Áö¿øÇÏ°Ô µÉ°ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ÇÔ¼ö¸¦ primitiveÇÔ¼ö¶ó°í º¸¸é µÈ´Ù. ÃÖÁ¾ÀûÀ¸·Î ¿©·¯ºÐÀÌ
Å« ±Ô¸ðÀÇ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù¸é ÀÌ·¯ÇÑ primitiveÇÔ¼öµéÀ» °¡Áø ÀÛÀº
(»ç¿ëÀÚ °¡ ¸¸µç)ÇÔ¼öµéÀÇ ¸ðÀÓÀ¸·Î ÀÌ·ç¾î Áú °ÍÀÌ´Ù. ÀÌ»ó ÀϹÝ
GUI ¾ÖÇø®ÄÉÀ̼ÇÀ» ¿¹·Î µé¾î¼ ¼³¸íÇߴµ¥, GUI ¿¡¼ÀÇ primitive´Â
¾î¼Àºí¸®¿¡¼´Â ½Ã½ºÅÛÄÝÀÌ´Ù. ¿©±â¿¡¼´Â ½Ã½ºÅÛÄÝ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ
³»¿ëÀ» ´Ù·çÁø ¾ÊÀ» °ÍÀÌ´Ù. ½Ã½ºÅÛ ÄÝ¿¡ ´ëÇÑ ³»¿ëÀº
¸®´ª½º ½Ã½ºÅÛ ÄÝ Äü ·¹ÆÛ·±½º¿Í
¸®´ª½º ¾î¼Àºí¸® ÇÏ¿ìÅõ¸¦ Âü°íÇØ º¸±â ¹Ù¶õ´Ù.
4.2. ÇÔ¼ö ¸¸µé±â ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¿ä¼Òµé¿¡ ÀÇÇØ¼ ¸¸µé¾îÁø´Ù.
- ÇÔ¼ö À̸§
¾î¼Àºí¸®¾î¿¡¼ ÇÔ¼öÀÇ À̸§Àº ÇÔ¼öÀÇ Äڵ尡 ½ÃÀÛÇÏ´Â
ÁÖ¼Ò¸¦ °¡¸®Å°´Â ½Éº¼(symbol)·Î ¼±¾ðµÇ¸ç, ½Éº¼Àº ÇÔ¼öÀÇ À̸§
´ÙÀ½¿¡ ÄÝ·Ð(":")À» ºÙÀÌ´Â °É·Î ¼±¾ðµÈ´Ù. ÀÌ µÚ¿¡ ÀÖ´Â ÄÚµå´Â
¸ðµÎ ÇÔ¼öÀÇ Äڵ尡 µÈ´Ù. Á¡ÇÁ¸¦ À§Çؼ »ç¿ëµÇ´Â ¶óº§°ú
¸Å¿ì ºñ½ÁÇÏ°Ô »ç¿ëµÈ´Ù.
- ÇÔ¼ö ÀÎÀÚ
ÇÔ¼ö ÀÎÀÚ(parameter)Àº ÇÔ¼ö°¡ ó¸®ÇØ¾ß ÇÏ´Â µ¥ÀÌÅÍ ¾ÆÀÌÅÛÀÌ´Ù.
¿¹¸¦ µé¾î »çÄ¢¿¬»êÀ» ¼öÇàÇÏ´Â ÇÔ¼ö°¡ ÀÖ´Ù°í °¡Á¤ÇØ º¸ÀÚ.
»çÄ¢¿¬»êÀ» À§Çؼ´Â 2°³ÀÇ ÇÇ¿¬»êÀÚ°¡ ÇÊ¿äÇÏ´Ù. ±×·¯¹Ç·Î
ÇÔ¼ö¿¡ 2°³ÀÇ (¼ýÀÚ)µ¥ÀÌÅ͸¦ ³Ñ°ÜÁÙ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
ÀÌ ÇÔ¼ö´Â 2°³ÀÇ µ¥ÀÌÅ͸¦ ³Ñ°Ü ¹Þ±â À§Çؼ 2°³ÀÇ ÀÎÀÚ¸¦
ÇÊ¿ä·Î ÇÏ°Ô µÈ´Ù.
- Áö¿ª º¯¼ö
Áö¿ªº¯¼ö´Â ÇÔ¼ö¿¡¼Å ¿¬»êÀ» À§ÇØ »ç¿ëµÇ´Â µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ
À§Çؼ ÇÔ¼ö¾È¿¡¼¸¸ »ç¿ëµÇ´Â º¯¼ö´Ù.
- Àü¿ª º¯¼ö
Àü¿ªº¯¼ö´Â ÇÔ¼ö¿ÜºÎ¿¡¼ °ü¸®µÇ¾î Áö´Â µ¥ÀÌÅÍ ÀúÀ念¿ªÀÌ´Ù.
¿¹¸¦ µé¾î °£´ÜÇÑ ÅØ½ºÆ® ÆíÁý±â¸¦ ¸¸µé°æ¿ì ÆíÁý±â¿¡¼ ºÒ·¯µéÀÎ
ÆÄÀÏÀÇ ³»¿ëÀº ÀúÀå, ÆíÁý, ã±â, ġȯµî°ú °ü·ÃµÈ ´Ù¾çÇÑ ÇÔ¼ö¿¡¼
»ç¿ëµÉ °ÍÀ̹ǷΠ¸ðµç ÇÔ¼ö¿¡ °ÉÃļ (Àü¿ªÀû)À¸·Î °ü¸®µÇ¾îÁ®¾ß ÇÒ
Çʿ䰡 ÀÖ´Ù. ¸¸¾à Àü¿ª º¯¼ö°¡ ¾Æ´Ï¶ó¸é °¢ ÇÔ¼ö¸¶´Ù ÆÄÀÏÀ» ¿¾î¼
³»¿ëÀ» ¸Þ¸ð¸®¿¡ ÀúÀåÇϰí ÀÛ¾÷À» ÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿î Äڵ尡 Ãß°¡ µÇ¾î¾ß
ÇÒ °ÍÀÌ´Ù.
- ¸®ÅÏ ÁÖ¼Ò
"¸®ÅÏ °ª"°ú È¥µ¿ÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. ¸®ÅÏ ÁÖ¼Ò´Â º¸ÀÌÁö ¾Ê´Â ÀÎÀÚ·Î
»ç¿ëµÇ¸ç ÇÔ¼ö¿¡¼ Á÷Á¢´Ù·çÁö ¸øÇÏ´Â °ªÀÌ´Ù. ¸®ÅÏ ¾îµå·¹½º´Â ÇÔ¼ö°¡
Á¾·áµÈ ¿ÏÀüÈ÷ Á¾·áµÈ ÈÄ ½ÇÇàµÇ¾î¾ßÇÒ ¿µ¿ªÀÇ ÁÖ¼Ò°ªÀ» ¾Ë·ÁÁØ´Ù.
´ëºÎºÐÀÇ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼ ¸®ÅÏ ÁÖ¼Ò´Â ÀÚµ¿ÀûÀ¸·Î °è»êµÇ¾î¼
»ç¿ëÇϹǷΠÇÁ·Î±×·¡¸Ó°¡ Ưº°È÷ ½Å°æ¾µ Çʿ䰡 ¾ø´Ù. ¹Ý¸é
¾î¼Àºí¸®¾î¿¡¼ÀÇ °æ¿ì call¸í·ÉÀ» ÀÌ¿ëÇØ¼
Á¦¾î¸¦ ÇØÁÖ¾î¾ß ÇÑ´Ù.
- ¸®ÅÏ °ª
ÇÔ¼ö¿¡¼ ÀÏÀ» ¼öÇàÇÑ ÈÄÀÇ °á°ú¸¦ ¸ÞÀÎ ÇÁ·Î±×·¥¿¡ Àü´ÞÇϱâ À§Çؼ
»ç¿ëÇÑ´Ù. ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¹Ö ¾ð¾î´Â ÇϳªÀÇ ÇÔ¼ö¿¡ ´ëÇØ¼ ´ÜÁö
ÇϳªÀÇ °ª¸¸À» ¸®ÅÏÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÑ´Ù.
ÀÌµé Æ¯Â¡µéÀº ¾î¼Àºí¸®¾î»Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ ¸ðµç ¾ð¾îµéµµ °øÅëÀûÀ¸·Î °¡Áö°í ÀÖ´Ù.
º¯¼ö¸¦ ¸¸µé¾î¼ ÀúÀåÇϰí, ÀÎÀÚ¸¦ »ç¿ëÇϰí, °ªÀ» ¸®ÅÏÇϴ ǥÇöÇÏ´Â ¹æ¹ýÀº
¾ð¾î¸¶´Ù ´Ù¸£±ä ÇÏÁö¸¸ ¾ð¾î¿¡ °ü°è¾øÀÌ °øÅëÀûÀ¸·Î »ç¿ëµÇ¾î Áø´Ù. ±×·¯¹Ç·Î
¾ð¾î¿¡ °ü°è¾øÀÌ ÀϹÝÀûÀ¸·Î Ç¥ÇöÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ Ç¥ÇöÀÇ ¹æ¹ýÀ»
calling convention¶ó°í ºÎ¸¥´Ù.
calling conventionÀº ¸Å¿ì ´Ù¾çÇϸç, ÀڽŸ¸ÀÇ calling conventionÀ» ¸¸µé¾î¼
»ç¿ëÇÒ ¼ö µµ ÀÖ´Ù. ±×·¸±ä ÇÏÁö¸¸ ´Ù¸¥ ¸¸µé¾îÁø ÇÔ¼ö°¡ ´Ù¸¥ ¾ð¾î·Î Æ÷ÆÃµÇ´Â
°ÍÀ» °í·ÁÇØ¾ß µÇ´Â °æ¿ìµµ ÀÖÀ¸¹Ç·Î °¡´ÉÇϸé Ç¥ÁØÀûÀÎ calling conventionÀ»
µû¸£´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. ¿©±â¿¡¼´Â C ¾ð¾îÀÇ calling conventionÀ» µû¸¦ °ÍÀÌ´Ù.
¿Ö³ÄÇÏ¸é °¡Àå ³Î¸® »ç¿ëµÇ¾îÁö´Â ¾ð¾îÀÌ¸ç ¶ÇÇÑ °¡Àå ¸¹Àº ¿¹Á¦ Äڵ带 °¡Áö°í
Àֱ⠶§¹®ÀÌ´Ù.
 | °ú°Å¿¡´Â ÆÄ½ºÄ®, CÀÇ calling conventionÀ» ÁÖ·Î »ç¿ëÇßÁö¸¸
Áö±ÝÀº »óȲÀÌ Á»´Þ¶óÁ®¼ java, c++, pythonµîÀÇ ´Ù¾çÇÑ
calling conventionÀÌ »ç¿ëµÇ¾îÁö°í ÀÖ´Ù.
|
4.3. C calling conventionÀ» ÀÌ¿ëÇÑ ¾î¼Àºí¸®¾î ÇÔ¼ö¼³¸í ¸¸¾à ´ç½ÅÀÌ ÄÄÇ»ÅÍÀÇ ½ºÅÃÀÌ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö¿¡ ´ëÇÑ ÀÌÇØ¸¦ °¡Áö°í ÀÖÁö
¾Ê´Ù¸é ¾î¼Àºí¸®¾î¿¡¼ ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. ¿ì¸®°¡ ÄÄÇ»ÅÍ¿¡¼
ÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é, ÇÁ·Î±×·¥Àº °¢°¢ÀÇ ÇÔ¼ö¸¦ ¼öÇàÇϱâ À§Çؼ ½ºÅÿµ¿ªÀ»
È®º¸ÇÑ´Ù. ½ºÅÃÀº ¸»±×´ë·Î ´õ¹Ì¶õ ¶æÀε¥, ´ç½ÅÀÇ ÀÛ¾÷Ã¥»óÀ§¿¡ ³õÀÎ
ó¸®ÇØ¾ßµÉ ¼·ù´õ¹Ì¸¦ ¿¬»óÇÏ¸é µÈ´Ù. ´ç½ÅÀº ó¸®ÇؾßÇÒ ¼·ù¸¦ ¼·ù´õ¹Ì¿¡
¿Ã·Á³õ°í ó¸®ÇØ¾ßµÉ °æ¿ì °¡Àå À§¿¡ ÀÖ´Â ¼·ùºÎÅÍ Ã³¸®ÇÏ°Ô µÉ°ÍÀÌ´Ù.
ó¸®µÈ ¼·ù´Â ´Ù¸¥ ÇÑÂÊÀ¸·Î Ä¡¿ì°Å³ª.. ±âºÐ³ª»Û ¼·ùÀÇ °æ¿ì ½º·¹±âÅë¿¡
¹ö¸± °ÍÀÌ´Ù.
ÄÄÇ»Å͵µ ¸¶Âù°¡Áö·Î ÀÌ·¯ÇÑ ½ºÅÃÀ» °¡Áö°í ÀÖ´Ù. ÄÄÇ»ÅÍ¿¡¼ ½ºÅÃÀº ¸Þ¸ð¸®ÀÇ
óÀ½À§Ä¡¿¡ Á¸ÀçÇÑ´Ù. ´ç½ÅÀº pushl¸í·ÉÀ» ÀÌ¿ëÇØ¼ ½ºÅÃÀÇ
°¡Àå À§¿¡ °ªÀ» ¹Ð¾î ³ÖÀ» ¼ö ÀÖ´Ù. ½ºÅÃÀÇ °¡Àå À§¿¡´Â ·¹Áö½ºÅÍ¿Í ´Ù¸¥ °ªµéÀÌ
µé¾î °¥ ¼ö ÀÖ´Ù. ¿ì¸®´Â ¸»ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. "¿Ö ÇÏÇÊ °¡Àå À§¿¡ ÀúÀåÇØ¾ßÇÏÁÒ?"
±× ÀÌÀ¯´Â °£´ÜÇÏ´Ù. Á¢½Ã¸¦ ¾Ä±â À§Çؼ ½×¾Æ µÎ¾úÀ» ¶§ À§¿¡¼ ºÎÅÍ ²¨³»¼
¾Ä´Â ÀÌÀ¯¸¦ »ý°¢Çغ¸¸é µÈ´Ù. ȤÀº Ã¥»ó¿¡ ½×¿©ÀÖ´Â ¼·ùÀÇ Ã³¸®¸¦ »ý°¢ÇØ º¸¶ó.
À§¿¡¼ ºÎÅÍ ²¨³»¾î¼ ó¸®ÇÏ´Â°Ô ¾Æ·¡, ȤÀº Áß°£¿¡¼ ²¨³»¾î¼ ó¸®ÇÏ´Â °Íº¸´Ù
ÈξÀ ½±´Ù. ÄÄÇ»ÅÍ¿¡¼ÀÇ ¸Þ¸ð¸® °ü¸® ¿ª½Ã À§¿¡ÀÖ´Â °ÍºÎÅÍ ²¨³»¾î¼ °¡Á®¿À´Â°Ô
±¸Á¶»ó ÈξÀ ½±µµ·Ï µÇ¾î ÀÖ´Ù. pushlÀ» ÀÌ¿ëÇØ¼ ½ºÅÃÀÇ °¡Àå À§¿¡ µ¥ÀÌÅ͸¦
¿Ã·È´Ù¸é, ÀÌ µ¥ÀÌÅÍ´Â poplÀ» ÅëÇØ¼ °¡Á®¿Ã ¼ö ÀÖ´Ù. popl¸í·ÉÀ» ÀÌ¿ëÇϸé
½ºÅÃÀÇ °¡Àå À§¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ °¡Á®¿À°Ô µÈ´Ù.
½ºÅÿ¡ °ªÀ» ¹Ð¾î ³Ö°ÔµÇ¸é ÇöÀç ½ºÅÃÀÇ Á¦ÀÏ ÀºÎºÐÀÇ ÁÖ¼Ò¸¦ °è»êÇØ¼ ±× À§Ä¡¿¡
°ªÀ» Ãß°¡ÇÑ´Ù. ½ºÅÃÀÇ Á¦ÀÏ À§ÀÇ À§Ä¡°ªÀº %esp ·¹Áö½ºÅ͸¦ ÅëÇØ¼ ¾Ë¾Æ¿Ã ¼ö
ÀÖ´Ù. Âü°í·Î ½ºÅÃÀº ¾ðÁ¦³ª ¿¬¼ÓÀûÀ¸·Î À§Ä¡ÇÏ°Ô µÇ¹Ç·Î µ¥ÀÌÅÍÀÇ Å©±â¸¸ ¾Ë°í
ÀÖ´Ù¸é À§Ä¡¸¦ Á¤È®ÇÏ°Ô °è»êÇÒ ¼ö ÀÖ´Ù.
pushlÀ» ÅëÇØ¼ ½ºÅØ¿¡ ¾î¶² °ªÀ» ³Ö°Ô µÇ¸é ½ºÅÃÀÇ Á¦ÀÏ À§¸¦ °¡¸£Å°´Â Æ÷ÀÎÅÍ¿¡
4°¡ ´õÇØÁ®¾ß ÇÑ´Ù. °í·Î %esp¿¡¼ 4¸¦ »©¸é °¡Àå ÃÖ±Ù¿¡ ÀúÀåµÈ µ¥ÀÌÅ͸¦ Àоî¿Ã
¼ö ÀÖ°Ô µÈ´Ù. (ÀúÀåµÇ´Â µ¥ÀÌÅÍ´Â ¿öµå(word)Áï 4¹ÙÀÌÆ®ÀÓÀ» ±â¾ïÇ϶ó).
¸¸¾à ½ºÅÃÀ¸·Î ºÎÅÍÀÇ µ¥ÀÌÅÍ »èÁ¦´Â popl¸í·ÉÀ» ¼öÇàÇϸé
µÈ´Ù. pushl°ú poplÀº ÇϳªÀÇ ¿ÀÆÛ·£µå¸¸À» °¡Áø´Ù.
¸¸¾à ½ºÅÃÀÇ °¡ÀåÀ§¿¡ Á¢±ÙÇÏ±æ ¿øÇÑ´Ù¸é, %esp ·¹Áö½ºÅ͸¦
indirect ¾îµå·¹½º ¸ðµå·Î Á¢±ÙÇÏ¸é µÈ´Ù. ´ÙÀ½Àº ½ºÅÃÀÇ °¡Àå À§¿¡ ÀÖ´Â °ªÀ»
%eax ·¹Áö½ºÅÍ·Î ¿Å±â´Â ¿¹ÀÌ´Ù.
movl (%esp), %eax
# ȤÀº
movl %esp, %eax
|
À§ÀÇ ¿¹´Â indirect ¸ðµå À̹ǷΠ%eax¿¡´Â ½ºÅÃÀÇ À§¿¡ ÀÖ´Â °ªÀÌ ¾Æ´Ñ ½ºÅÃÀÇ
À§ÀÇ À§Ä¡ÁÖ¼Ò°¡ ÀúÀåµÈ´Ù. ¸¸¾à ÁÖ¼Ò¿¡ ÀúÀåµÈ °ªÀ» °¡Á®¿À±æ ¿øÇÑ´Ù¸é
¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù.
À§ÀÇ ¿¹Á¦¸¦ º¸¸é base pointer ÁÖ¼Ò¸ðµå¸¦ ÀÌ¿ëÇØ¼ °¡Á®¿À°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.
%esp¿¡¼ 4¸¸Å À̵¿ÇÑ À§Ä¡¿¡ ÀúÀåµÈ °ªÀ» %eax¿¡ º¹»çÇÑ´Ù.
C¾ð¾îÀÇ calling convention¿¡¼ ½ºÅÃÀº ÇÔ¼öÀÇ ·ÎÄú¯¼ö, ÀÎÀÚ, ¸®ÅÏÁÖ¼ÒµéÀ»
±¸ÇöÇϴµ¥ Áß¿äÇÏ°Ô »ç¿ëµÈ´Ù.
À§ÀÇ ¸í·ÉÀº %esp·Î ºÎÅÍ 8À» »«´Ù(word´Â 4¹ÙÀÌÆ® Å©±â¸¦ °¡ÁüÀ» ±â¾ïÇ϶ó).
ÀÌ·±½ÄÀÇ »ç¿ëÀº ÇÔ¼ö¸¦ È£ÃâÇØ¼ ½ºÅÿ¡ °ªÀ» ÀúÀåÇϴµ¥, ÀÌ·± Àú·± °ÅÃßÀå
½º·¯¿î °Íµé(·¹Áö½ºÅÍ ÁÖ¼Òµî..)À» ÀÌ¿ëÇÏÁö ¾Ê°íµµ °£´ÜÈ÷ »ç¿ëÇÒ ¼ö
ÀÖ´Ù´Â ÀåÁ¡À» °¡Áø´Ù. ÀÏ´Ü ÇÔ¼ö°¡ È£ÃâµÇ¾î¼ ½ºÅÃÀÌ ÇÒ´çµÇ¸é ÇÔ¼ö°¡
Á¾·áÇÒ¶§±îÁö °è¼Ó ³²¾Æ ÀÖ°Ô µÈ´Ù. ¿ì¸®°¡ ÇÔ¼ö¿¡¼ ¸®ÅÏÇϸé
½ºÅà ÇÁ·¡ÀÓ°ú ¿©±â¿¡ ÀÖ´Â º¯¼ö°¡ Á¦°ÅµÈ´Ù. ÀÌ·¸°Ô ƯÁ¤ÇÑ ÇÔ¼öÀÇ ³»ºÎ¿¡¼¸¸
»ç¿ëµÇ´Â Ư¡À¸·Î À̵éÀ» ·ÎÄú¯¼ö¶ó°í ºÎ¸¥´Ù. ¿ì¸®°¡
2 wordÀÇ ·ÎÄà ÀúÀå¼Ò¸¦ ¸¸µé¾ú°í ½ºÅÃÀº ´ÙÀ½°ú °°ÀÌ º¸ÀÏ °ÍÀÌ´Ù.
Parameter #N <--- N*4+4(%ebp)
...
Parameter 2 <--- 12(%ebp)
Parameter 1 <--- 8(%ebp)
Return Address <--- 4(%ebp)
Old %ebp <--- (%ebp)
Local Variable 1 <--- -4(%ebp)
Local Variable 2 <--- -8(%ebp) and (%esp)
|
ÀÌÁ¦ ¿ì¸®´Â base pointer addressing ¹æ¹ýÀ» ÀÌ¿ëÇØ¼ %ebp·Î ºÎÅÍ ¿øÇÏ´Â ¸ðµç
°ª¿¡ Á¢±ÙÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¹°·Ð ¿©·¯ºÐÀº base pointer addressing ¸ðµå¸¦
À§Çؼ ´Ù¸¥ ·¹Áö½ºÅ͸¦ ÀÌ¿ëÇÒ ¼öµµ ÀÖ±äÇÏÁö¸¸, ÀϹÝÀûÀº x86¿¡¼ %ebp·¹Áö½ºÅͰ¡
°¡Àå ºü¸¥ °ü°è·Î %ebp°¡ ¼±È£µÈ´Ù.
À̹øÀåÀ» ÅëÇØ¼ ¿ì¸®´Â Àü¿ªº¯¼ö¿Í static º¯¼ö¸¦ ¸Þ¸ð¸®»ó¿¡¼ ¾î¶»°Ô
Á¢±ÙÇÒ ¼ö ÀÖ´ÂÁö¸¦ ¹è¿ü´Ù. Àü¿ªº¯¼ö¿Í staticÀÇ Â÷ÀÌÁ¡Àº static°¡ ¿ÀÁ÷
ÇÔ¼ö³»¿¡¼¸¸ »ç¿ëµÇ°í Àü¿ªº¯¼ö´Â ¿©·¯ÇÔ¼ö¿¡¼ »ç¿ëµÉ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.
´Ù¸¥ ¸ðµç ¾ð¾î¿¡¼¿Í ¸¶Âù°¡Áö·Î ¾î¼Àºí¸®¾î¿¡¼µµ ÀÌµé º¯¼ö¸¦ ´Ù·ç´Â ¹æ¹ýÀº
µ¿ÀÏÇÏ´Ù.
ÇÔ¼ö´Â ½ÇÇàµÉ¶§ ±âº»ÀûÀ¸·Î 3°¡ÁöÀÏÀ» ÇØÁÖ¾î¾ß ÇÑ´Ù. ù¹øÂ°·Î %eax¿¡ ¸®ÅÏ °ªÀ»
ÀúÀåÇÑ´Ù. µÎ¹øÂ°·Î È£ÃâµÇ±â Àü¿¡ ½ºÅÃÀ» ÃʱâÈ(reset)ÇÑ´Ù. ¸¶Áö¸·À¸·Î
¸®ÅÏÀÇ Á¦¾î´Â ret ¸í·ÉÀ» ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù. À̰ÍÀº
½ºÅÃÀÇ Á¦ÀÏ À§ÀÇ °ªÀ» °¡Á®¿À´Â(pop)ÇÏ´Â ÀÏÀ» Çϰí, ¸í·ÉÀÇ Æ÷ÀÎÅÍÀÎ %eip¸¦
¼³Á¤ÇÑ´Ù.
ÇÔ¼ö´Â ¸®ÅÏÇÒ ¶§ ±×°ÍÀ» È£ÃâÇÑ Äڵ忡°Ô Á¦¾î±ÇÀ» µÇµ¹·Á ÁÖ¾î¾ß¸¸ Çϴµ¥,
±×·¯±â À§Çؼ´Â ¹Ýµå½Ã ÀÌÀüÀÇ ½ºÅÃÇÁ·¹ÀÓÀ» º¹±¸ÇØ ÁÖ¾î¾ß¸¸ ÇÑ´Ù. ±×·¯³ª
ret ¸í·ÉÀº ÀÌ·¯ÇÑ ÀÏÀ» ÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇÏ¸é ¿ì¸®ÀÇ ÃÖ±Ù ½ºÅÃÇÁ·¹ÀÓ¿¡ ÀÖ´Â
¸®ÅÏ ÁÖ¼Ò´Â ½ºÅÃÀÇ Á¦ÀÏ À§¸¦ °¡¸®Å°Áö ¾Ê±â ¶§¹®ÀÌ´Ù. ±×·¯¹Ç·Î
ÇÔ¼ö¸¦ ¼öÇàÇϱâ Àü¿¡ ¸®ÅÏÇÒ ½ºÅÃÆ÷ÀÎÅÍÀÎ %esp¿Í º£À̽º Æ÷ÀÎÅÍ %ebp¸¦
¸®¼ÂÇØÁÖ¾î¾ß ÇÑ´Ù. ±×·¯¹Ç·Î ÇÔ¼ö·Î ºÎÅÍ ¸®ÅÏÇϱâ À§Çؼ ´ÙÀ½°ú °úÁ¤ÀÌ
ÇÊ¿äÇÏ°Ô µÈ´Ù.
movl %ebp, %esp
popl %ebp
ret
|
ÇÔ¼ö°¡ ¸®ÅÏÇÒ ¶§ ¿©·¯ºÐÀÌ »ç¿ëÇß´ø ¸ðµç ·ÎÄú¯¼ö´Â óºÐµÇ¾î ¹ö¸®°Ô µÊÀ»
ÁÖ¸ñÇϱ⠹ٶõ´Ù. ¿Ö³ÄÇÏ¸é ¿©·¯ºÐÀÌ ½ºÅà Æ÷ÀÎÅ͸¦ µÚ·Î À̵¿ÇÏ°Ô µÇ¸é,
±× ¾ÕÀÇ ½ºÅÃÀ» ´Ù¸¥ °ªµéÀÌ µ¤¾î½á ¹ö¸®±â ¶§¹®ÀÌ´Ù. °á±¹ Áö¿ª º¯¼öµéÀº
ÇÔ¼ö°¡ »ý¼ºµÇ¾î¼ ÀÛµ¿Çϰí ÀÖÀ» ¶§¸¸ À¯È¿ÇÏ°Ô µÈ´Ù. ÇÔ¼ö°¡ ¸®ÅÏÇÏ°Ô µÇ¸é
ÀÌÁ¦ ÇÁ·Î±×·¥ÀÇ Á¦¾î±ÇÀº ÇÔ¼ö¸¦ È£ÃâÇÑ ÄÚµå·Î ³Ñ¾î¿À°í, Á¦¾î±ÇÀ» °¡Áø ÄÚµå´Â
%eax¸¦ ÀÌ¿ëÇØ¼ ¸®ÅϰªÀ» °Ë»çÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
page 47¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ÇØ¼®ÀÌ ÇÊ¿ä.
4.4. ÇÔ¼ö ¿¹Á¦ ÀÌÁ¦ ½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼ ¾î¶»°Ô ÇÔ¼ö¸¦ È£ÃâÇÏ´ÂÁö ¿¹¸¦ µé¾î¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
¿ì¸®´Â power(°ÅµìÁ¦°ö)¿¬»êÀ» ÇÏ´Â ÀÌ´Ù. power ÇÔ¼ö´Â
2°³ÀÇ ¼ýÀÚ¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ¿¹¸¦ µé¾î 2, 3ÀÌ µé¾î °¬´Ù¸é 2 * 2 * 2 ¿¬»êÀ» ÇϰÔ
µÇ°í 8À» ¸®ÅÏÇÏ°Ô µÈ´Ù.
´ÙÀ½ ÄÚµå´Â ¿ÏÀüÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ÆÄÀÏÀÇ À̸§Àº power.s·Î ÇϰڴÙ.
# ÇÏ´ÂÀÏ : 2^3 + 5^2ÀÇ °ªÀ» °è»êÈÄ µÇµ¹·ÁÁØ´Ù.
#
.section .data
.section .text
.globl _start
_start:
pushl $3 # µÎ¹øÂ° ÀÎÀÚ¿¡ 3À» ³Ö´Â´Ù.
pushl $2 # ù¹øÂ° ÀÎÀÚ¿¡ 2¸¦ ³Ö´Â´Ù.
call power # power ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
addl $8, %esp # ½ºÅÃÀÇ Æ÷ÀÎÅ͸¦ À̵¿ÇÑ´Ù.
pushl %eax # ÇÔ¼öÈ£Ãâ °á°ú°ªÀ» ÀúÀåÇÑ´Ù.
pushl $2 # µÎ¹øÂ° ÀÎÀÚ¿¡ 2¸¦ ³Ö´Â´Ù.
pushl $5 # ù¹øÂ° ÀÎÀÚ¿¡ 5¸¦ ³Ö´Â´Ù.
call power # power ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
addl $8, %esp # ½ºÅÃÆ÷ÀÎÅ͸¦ À̵¿ÇÑ´Ù.
popl %ebx # µÎ¹øÂ° È£ÃâÇÑ powÇÔ¼öÀÇ ¸®ÅϰªÀº
# ÀÌ¹Ì %eax¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.
# ¿ì¸®´Â ù¹øÂ° powÇÔ¼öÀÇ °á°ú°ªÀ» ½ºÅÿ¡¼
# °¡Á®¿Â´ÙÀ½ %ebx¿¡ ÀúÀåÇÑ´Ù.
addl %eax, %ebx # °¢ °á°ú°ªµéÀ» ´õÇÑ´Ù.
# ´õÇÑ °á°ú°ªÀº %ebx¿¡ ÀúÀåµÈ´Ù.
movl $1, %eax # exit (%ebx °ªÀÌ ¸®ÅϵȴÙ)
int $0x80 # exit ½Ã½ºÅÛ È£ÃâÀ» À§Çؼ ÀÎÅÍ·´Æ®¸¦ °Ç´Ù.
# ÇÔ ¼ö ¸í : power
# ÇÏ ´Â ÀÏ : ÁÖ¾îÁö´Â ÀÎÀÚ¸¦ ÀÌ¿ëÇØ¼ °ÅµìÁ¦°ö ¿¬»êÀ» ÇÑÈÄ
# µÇµ¹·ÁÁØ´Ù.
#
# ÀÔ ·Â : ù¹øÂ° ÀÎÀÚ - ±âº»¼ýÀÚ
# µÎ¹øÂ° ÀÎÀÚ - °ÅµìÁ¦°ö ¼ýÀÚ
#
# Ãâ ·Â : ¿¬»êÀÇ °á°ú
#
# ÁÖ ÀÇ : ÀÎÀÚ´Â ¹Ýµå½Ã 1º¸´Ù Ä¿¾ß ÇÑ´Ù.
#
# º¯ ¼ö µé :
# %ebx - ±âº» ¼ýÀÚ
# %ecx - °ÅµìÁ¦°ö ¼ýÀÚ
#
# -4($ebp) - ÃÖ±Ù °á°ú°ª
#
# %eax ´Â ÀÓ½ÃÀúÀå¼Ò·Î »ç¿ëµÈ´Ù.
#
.type power, @function
power:
pushl %ebp # ÀÌÀüÀÇ º£À̽º Æ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù.
movl %esp, %ebp # ½ºÅÃÆ÷ÀÎÅ͸¦ º£À̽º Æ÷ÀÎÅÍ·Î ¸¸µç´Ù.
subl $4, %esp # Áö¿ª ÀúÀå¼Ò¸¦ À§ÇÑ °ø°£À» ¸¸µç´Ù.
movl 8(%ebp), %ebx # ù¹øÂ° ÀÎÀÚ¸¦ %eax¿¡ ÀúÀåÇÑ´Ù.
movl 12(%ebp), %ecx # µÎ¹øÂ° ÀÎÀÚ¸¦ %ecx¿¡ ÀúÀåÇÑ´Ù.
movl %ebx, -4(%ebp) # ÃÖ±Ù°ªÀ» ÀúÀåÇÑ´Ù.
power_loop_start:
cmpl $1, %ecx # ¸¸¾à powerÀÌ 1À̸é end_power·Î Á¡ÇÁÇÑ´Ù.
je end_power
movl -4(%ebp), %eax # ÃÖ±Ù °á°ú°ªÀ» %eax¿¡ ÀúÀåÇÑ´Ù.
imul %ebx, %eax # ÃÖ±Ù °á°ú°ª¿¡ ±âº» ¼ýÀÚ¸¦ °öÇÑ´Ù.
movl %eax, -4(%ebp) # ÃÖ±Ù °á°ú°ªÀ» ÀúÀåÇÑ´Ù.
decl %ecx # powerÀ» °¨¼Ò½ÃŲ´Ù.
jmp power_loop_start # ´ÙÀ½ °ÅµìÁ¦°ö(power)¸¦ ½ÇÇàÇÑ´Ù.
end_power:
movl -4(%ebp), %eax # ¸®ÅϰªÀ» %eax¿¡ ÀúÀåÇÑ´Ù.
movl %ebp, %esp # ½ºÅÃÆ÷ÀÎÅ͸¦ º¹±¸ÇÑ´Ù.
popl %ebp # º£À̽º Æ÷ÀÎÅ͸¦ º¹±¸ÇÑ´Ù.
ret
|
À§ÀÇ Äڵ带 ÀÛ¼ºÇϰí ÄÄÆÄÀÏ ½ÃŲ´ÙÀ½ ½ÇÇà½ÃÄÑ º¸µµ·Ï ÇÏÀÚ.
±×¸®°í powerÇÔ¼ö¸¦ ´Ù¸¥ ÀÎÀÚ¸¦ ÁÖ¾î¼ È£ÃâÇØ¼ °á°ú°ªÀÌ Á¦´ë·Î
³ª¿À´ÂÁö È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ. À̶§ °á°ú°ªÀº 256À» ³Ñ±âÁö ¾Êµµ·Ï
Àû´çÈ÷ ÀÎÀÚ¸¦ Á¶ÀýÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. Å×½ºÆ®°¡ ³¡³µ´Ù¸é
µÎ°³ÀÇ °á°ú°ªÀ» »«°ªÀ» ¸®ÅÏÇϵµ·Ï Äڵ带 ¼öÁ¤ÇØ º¸µµ·Ï ÇÏÀÚ.
power ÇÔ¼ö¸¦ 3¹ø È£ÃâÇÏ°í ±× °ªÀ» ¸®ÅÏÇÏ´Â Äڵ嵵 ¸¸µé¾î º¸ÀÚ.
ÇÁ·Î±×·¥ÀÇ ÄÚµå´Â ¸Å¿ì °£´ÜÇÏ´Ù. ´ç½ÅÀÌ ÀÎÀÚ¸¦ ½ºÅÿ¡ Áý¾î ³Ö°í
ÇÔ¼ö¸¦ È£ÃâÇϸé, ÇÔ¼ö´Â ½ºÅà Æ÷ÀÎÅ͸¦ µÚ·Î µÇµ¹¸®°í ½ºÅÿ¡
ÀÖ´Â ÀÎÀÚ¸¦ Àоî¿Í¼ ¿¬»êÀ» ÇÏ°í °á°ú°ªÀ» %eax¿¡ ÀúÀåÇÑ´Ù.
À§ ÇÁ·Î±×·¥¿¡¼´Â powÇÔ¼ö¸¦ µÎ¹ø È£ÃâÇϴµ¥, ¿ì¸®´Â ù¹øÂ° °ªÀ»
½ºÅÿ¡ ÀúÀåÇß´Ù. ÀÌÀ¯´Â ·¹Áö½ºÅÍ¿¡ ´ÜÁö Çѹø¿¡ ÇϳªÀÇ °ª¸¸ ÀúÀåµÉ
¼ö Àֱ⠶§¹®ÀÌ´Ù. ¿ì¸®´Â ù¹øÂ° powÇÔ¼ö ¸®ÅϰªÀ» ½ºÅÿ¡ ÀúÀåÇϰí
³ªÁß¿¡ µÎ¹øÂ° ÇÔ¼öÀÇ °á°ú°¡ ³ª¿ÔÀ»¶§ ½ºÅÃÀÇ °ªÀ» °¡Á®¿Í¼(pop)
µÎ¹øÂ° °á°ú¿Í ´õÇØ¼ ¿øÇÏ´Â °á°ú¸¦ ¾ò¾î ¿Ã ¼ö ÀÖ´Ù.
ÀÌÁ¦ ÇÔ¼ö ÄÚ½ºµå¿¡ ´ëÇØ¼ ¾Ë¾Æº¸ÀÚ. ÇÔ¼ö¿¡¼ ÁÖ¸ñÇØ¾ßµÉ
ºÎºÐÀº ÇÔ¼ö°¡ ¾î¶»°Ô ¼±¾ðµÇ´ÂÁö, ±×¸®°í ÀÎÀÚ°¡ ¾î¶»°Ô ³Ñ¾î°¡°í
¸®ÅϰªÀ» ³Ñ°ÜÁÖ´ÂÁö ÇÏ´Â ºÎºÐÀÌ´Ù. ÀÌ·¯ÇÑ ÀԷºκаú Ãâ·ÂºÎºÐÀº
ÇÁ·Î±×·¡¸Ó°¡ ÇÔ¼ö¸¦ ¼³°èÇÒ ¶§ °¡Àå ÀÏÂ÷ÀûÀ¸·Î °í·ÁÇÏ´Â ºÎºÐÀ¸·Î
ÈçÈ÷ ÇÔ¼öÀÇ ÀÎÅÍÆäÀ̽º(Interface)¶ó°í ÇÑ´Ù. ÀÎÅÍÆäÀ̽º¸¦
Á¦´ë·Î ±¸¼ºÇϱâ À§Çؼ ÇÁ·Î±×·¡¸Ó´Â ½ºÅðú %eax¿¡ ´ëÇØ¼
ÀÌÇØÇϰí ÀÖ¾î¾ß ÇÑ´Ù. ½ºÅÃÀº ÀÔ·Â, %eax´Â Ãâ·Â(¸®ÅÏ)À» À§Çؼ
»ç¿ëµÈ´Ù.
°¡Àå ¸ÕÀú ÇØ¾ß ÇÒÀÏÀº ÇÔ¼öÀÇ À̸§À» Á¤ÇÏ´Â ÀÏÀÌ´Ù.
À̰ÍÀº ÇÔ¼öÀÇ À̸§ powerÀ» ÇÔ¼ö¿¡ ¿¬°á ½ÃŰ´Â ÀÏÀ» ÇÑ´Ù. ¿ì¸®´Â
powerÀ» ÀÌ¿ëÇØ¼ ½ÇÁ¦ ÇÔ¼ö¸¦ ½ÇÇà ½Ãų¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¼±¾ðÀº
ÇöÀç·Î½á´Â ±×¸® À¯¿ëÇÏÁö ¾ÊÁö¸¸ ¸¸¾à ÇÁ·Î±×·¥ÀÇ Å©±â°¡ Ä¿Á®¼
¿©·¯°³ÀÇ ÆÄ¾Ë·Î ³ª´µ¾î¼ À¯ÁöµÇ¾î¾ß ÇÑ´Ù¸é ¸Å¿ì À¯¿ëÇϰÔ
»ç¿ëÇÒ ¼ö ÀÖ´Ù. À̰ܿ¡ ´ëÇÑ À庸´Â ³ªÁß¿¡ ÀÚ¼¼È÷
¼³¸íÇϵµ·Ï ÇϰڴÙ. ÇÔ¼ö¸¦ ¼±¾ðÇßÀ¸´Ï ½ÇÁ¦ ÇÔ¼ö Äڵ带
Àû¾î¾ß ÇÒ°ÍÀÌ´Ù. ÇÔ¼öÄڵ尡 ½ÃÀ۵Ǵ À§Ä¡´Â ´ÙÀ½°ú °°ÀÌpower
¶óº§À» ÀÌ¿ëÇØ¼ ¸í½ÃÇÒ ¼ö ÀÖ´Ù.
ÀÌ·¸°Ô ÇØ¼ ¿ì¸®°¡ ÃÖÃÊ ¼±¾ðÇÑ powerÀº ÀÌ ¶óº§ÀÌ ÀÖ´Â ÁÖ¼Ò¸¦
°¡¸®Å°°Ô µÈ´Ù. ÀÌÁ¦ºÎÅÍ ½ÇÁ¦ ÇÔ¼öÀÇ ½ÇÇàºÎ¸¦ ÀÛ¼ºÇÏ¸é µÈ´Ù.
pushl %ebp
movl %esp, %ebp
subl $4, %esp
|
°¡Àå ¸ÕÀú ½ºÅÃÀ» Á¦¾îÇϱâ À§ÇÑ ¸í·ÉÀÌ ½ÇÇàµÇ´Âµ¥, À§ÀÇ ¸í·ÉÀ»
¼öÇàÇÑÈÄ ½ºÅÃÀÇ ±¸Á¶´Â ¾Æ·¡¿Í °°´Ù.
Base Number <------- 12(%ebp)
Power <------- 8(%ebp)
Return Address <------- 4(%ebp)
Old %ebp <------- (%ebp)
Current result <------- -4(%ebp) and (%esp)
|
ÀÌ ÇÁ·Î±×·¥Àº base number¿Í ¿¬»ê¿¡ »ç¿ëÇÒ ÇÇ¿¬»êÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ
%ebx, ÇöÀç °ªÀ» ÀúÀåÇϱâ À§ÇÑ ·¹Áö½ºÅÍ(-4(%ebp))¸¦ °¡Áö°í ½ÃÀÛÇÑ´Ù.
±×¸®°í ¸î¹øÀÇ °ÅµìÁ¦°öÀ» ÇØ¾ßÇÏ´ÂÁö´Â %ecx¿¡ ÀúÀåµÈ´Ù. %ecx´Â ÇѹøÀÇ
°ÅµìÁ¦°öÀÌ ÀϾ¸é 1¾¿ °¨¼ÒµÇ°í 1ÀÌµÇ¸é ·çÇÁ¿¡¼ ¹þ¾î³´Ù.
°ÅµìÁ¦°ö ÇÔ¼ö¸¦ º¸¸é imul¿Í decl°¡ µîÀåÇÑ´Ù.
imulÀº °ö¼À¿¬»êÀ» ÇÑ´Ù. ¿¬»êÀÇ °á°ú´Â µÎ¹øÂ° ¿ÀÆÛ·£µå¿¡ ÀúÀåµÈ´Ù.
declÀº ·¹Áö½ºÅÍÀÇ °ªÀ» 1°¨¼Ò½ÃŲ´Ù. ¸í·É¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº
Appendix B¸¦ Âü°íÇϱ⠹ٶõ´Ù.
4.5. Àç±Í ÇÔ¼ö ´ÙÀ½ ÇÁ·Î±×·¥Àº ¸Ó¸®¸¦ Á»´õ ±¼·ÁÁà¾ß ÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥Àº
ÆÑÅ丮¾ó(factorial)À» ±¸ÇÑ´Ù. ÆÑÅ丮¾ó ¿¬»êÀº ÀڽŰú 1»çÀÌÀÇ ¸ðµç ¼ýÀÚ¸¦
°öÇÏ´Â ¿¬»êÀ» ÇÑ´Ù. ¿¹¸¦ µé¾î¼ 7ÀÇ ÆÑÅ丮¾óÀº 7*6*5*4*3*2*1À̰í
4ÀÇ ÆÑÅ丮¾óÀº 4*3*2*1ÀÌ´Ù. ÆÑÅ丮¾ó ¿¬»êÀ» ÇÒ¶§ ¿©·¯ºÐÀº ÇϳªÀÇ ±ÔÄ¢À»
¹ß°ßÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 4ÆÑÅ丮¾óÀÇ °æ¿ì 3ÆÑÅ丮¾óÀÌ 4¹ø ¹ß»ýÇÏ´Â °ÍÀ̰í,
3ÆÑÅ丮¾óÀº 2ÆÑÅ丮¾óÀÌ 3¹ø ¹ß»ýÇϰí, 2ÆÑÅ丮¾óÀº 1ÆÑÅ丮¾óÀÌ 2¹ø
¹ß»ýÇÑ´Ù. 1ÆÑÅ丮¾óÀº 1¹ø¹ß»ýÀ¸·Î ³¡³´Ù. ÀÌ·¯ÇÑ ÇüÅÂÀÇ Á¤ÀǸ¦
Àç±Í(recursive)Á¤ÀÇ ¶ó°í ÇÑ´Ù. ÆÑÅ丮¾ó ÇÔ¼ö¸¦ ±¸ÇöÇÒ¶§ ÀÌ Àç±Í Á¤ÀǸ¦
»ç¿ëÇÏ¸é ¹®Á¦¸¦ ´õ ½±°Ô Ç® ¼ö ÀÖ´Ù.
ÆÑÅ丮¾ó ÇÔ¼ö´Â ÇÔ¼öÀÚ½ÅÀ» Æ÷ÇÔÇÏ´Â Àç±ÍÀû ±¸Á¶¸¦ °¡Áø´Ù.
ÇÔ¼ö°¡ ÇÔ¼ö ÀÚ½ÅÀ» Æ÷ÇÔÇÑ´Ù¸é ¹«ÇÑÈ÷ ÀÚ½ÅÀ» È£ÃâÇÒ ¼öµµ ÀÖÀ¸¹Ç·Î
base case °¡ Á¤ÀǵǾî ÀÖ¾î¾ß¸¸ ÇÑ´Ù. base case´Â
Àç±Í°¡ Á¾·áµÇ´Â ½ÃÁ¡À» °áÁ¤ÇÑ´Ù. base case°¡ ¾ø´Ù¸é ÇÔ¼ö´Â ¹«ÇÑÈ÷
È£ÃâµÉ °ÍÀÌ°í °á±¹ stack °ø°£À» ¸ðµÎ ¼ÒºñÇÏ°Ô µÉ °ÍÀÌ´Ù. ÆÑÅ丮¾óÀÇ
°æ¿ì base case´Â ¼ýÀÚ 1ÀÌ µÈ´Ù. ÆÑÅ丮¾ó ÇÔ¼ö¸¦ Àç±ÍÈ£ÃâÇÏ°Ô µÇ¸é
¹øÈ£´Â 1¾¿ ÁÙ¾îµé°í base case¿Í °°Àº ¼ö°¡ µÈ´Ù¸é ÇÔ¼ö¸¦ ºüÁ®³ª¿À°Ô
µÈ´Ù.
# ÆÑÅ丮¾ó ¿¬»êÀ» ÇÑ´Ù.
# ¿¹¸¦ µé¾î 3Àº 3 * 2 * 1
# 4´Â 4 * 3 * 2 * 1
# ÀÌ µÈ´Ù.
.section .data
.section .text
.global _start
.global factorial
_start:
pushl $4 # ÆÑÅ丮¾ó ÇÔ¼ö¿¡ ³Ñ±æ ÀÎÀÚ¸¦ º¹»çÇÑ´Ù.
call factorial # ÆÑÅ丮¾ó ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù.
addl $4, %esp
movl %eax, %ebx # ÆÑÅ丮¾ó ÇÔ¼öÀÇ ¸®ÅϰªÀº %eax¿¡ ÀúÀåµÇÁö¸¸
# ÇÁ·Î±×·¥ ¸®ÅϰªÀ¸·Î ³Ñ±æ Çʿ䰡 ÀÖÀ¸¹Ç·Î %ebx¿¡ º¹»çÇÑ´Ù.
movl $1, %eax # exit ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÑ´Ù.
int $0x80
# factorial ÇÔ¼ö Á¤ÀÇ
factorial:
pushl %ebp # ¸®ÅÏÇϱâ Àü¿¡ ÀÌÀüÀÇ ½ºÅà Æ÷ÀÎÅ͸¦ ÀúÀåÇØ¾ß ÇÑ´Ù.
# ±×·¡¼ ÀÌÀüÀÇ ½ºÅÃÆ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù.
# ÇÔ¼ö¸¦ À§ÇÑ ±âº» ¿ä¼Ò
movl %esp, %ebp
movl 8(%ebp), %eax # ù¹øÂ° ÀÎÀÚ¸¦ %eax¿¡ º¹»çÇÑ´Ù.
# 4(%ebp)´Â ¸®ÅϾîµå·¹½º À̰í
# 8(%ebp)´Â ù° ÀÎÀÚÀÇ ¾îµå·¹½ºÀÌ´Ù.
cmpl $1, %eax # Àç±Í¿¡¼ ¹þ¾î³ª±â À§ÇÑ base case °ªÀº 1ÀÌ´Ù.
# ¿©±â¿¡¼ ÀÎÀÚÀÇ °ªÀÌ 1ÀÎÁö¸¦ °Ë»çÇÑ´Ù.
# ¸¸¾à 1 À̶ó¸é end_factorial·Î Á¡ÇÁÇÑ´Ù.
je end_factorial
decl %eax # ±×·¸Áö ¾Ê´Ù¸é %eax¸¦ 1 °¨¼Ò ½ÃŲ´Ù.
pushl %eax # ÀÌ °ªÀº ´ÙÀ½ factorialÇÔ¼ö¸¦ È£ÃâÇÏ¸é¼ Àü´ÞµÇ¾î¾ß ÇϹǷÎ
# ½ºÅÿ¡ ¹Ð¾î ³Ö´Â´Ù.
call factorial # factorialÀ» ½ÇÇàÇÑ´Ù.
movl 8(%ebp), %ebx
imul %ebx, %eax # Ãֱ٠ȣÃâÇß´ø factorialÀÇ ¸®Åϰª°ú °öÇÑ´Ù.(%eax¿¡ ÀúÀåµÇ¾î ÀÖÀ½)
# °öÇѰá°ú´Â %eax¿¡ ÀúÀåÇÑ´Ù.
end_factorial:
movl %ebp, %esp # ÇÔ¼ö¸®ÅÏÀ» À§ÇÑ ±âº»¿ä¼Ò
popl %ebp # ¸®ÅÏÇϱâ Àü¿¡ ÀÌÀü ÇÔ¼öÀÇ ½ÃÀÛÆ÷ÀÎÅ͸¦ º¹±¸ÇÑ´Ù.
ret # ÇÔ¼ö¸¦ ¸®ÅÏÇÑ´Ù.
|
¾î¼Àºí, ¸µÅ© °úÁ¤À» °ÅÃļ ½ÇÇà½ÃŰ°í ¸®Åϰá°ú¸¦ È®ÀÎÇÑ´Ù.
# as factorial.s -o factorial.o
# ld factorial.o -o factorial
# ./factorial
# echo $?
|
ÇÁ·Î±×·¥ÀÇ ¸®ÅϰªÀÌ 24ÀÓÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 24´Â 4ÀÇ ÆÑÅ丮¾ó ¿¬»ê
°ªÀ¸·Î 4*3*2*1ÀÇ °á°ú´Ù.
¿©·¯ºÐÀÌ C¿Í °°Àº ¾ð¾î¸¦ ÅëÇØ¼ Àç±ÍÈ£ÃâÀ» °æÇèÇØ º¸Áö ¾Ê¾Ò´Ù¸é
À§ÀÇ Äڵ带 ÀÌÇØÇÏ´Â µ¥¿¡ ¾à°£ÀÇ ¾î·Á¿òÀÌ ÀÖÀ» ¼öµµ ÀÖ´Ù. ÀÌÁ¦ ¾î¶»°Ô
ÀÌ·¯ÇÑ °è»êÀÌ °¡´ÉÇÑÁö¸¦ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
_start:
pushl $4
call factorial
|
ÀÌ ÇÁ·Î±×·¥Àº 4ÀÇ ÆÑÅ丮¾óÀ» °è»êÇÑ´Ù. È£ÃâµÉ ÇÔ¼ö¿¡ ÀÌ °ªÀ» ÀÎÀÚ·Î ³Ñ±â±â
À§Çؼ ÇÔ¼ö È£ÃâÀü¿¡ ½ºÅÿ¡ ¹Ð¾î ³Ö¾ú´Ù. ÇÔ¼öÀÇ ÀÎÀÚ´Â ÇÔ¼ö¿¡¼ ÀÛ¾÷¿¡ »ç¿ëµÉ
µ¥ÀÌÅͶó´Â Á¡À» ±â¾ïÇϱ⠹ٶõ´Ù. À̰æ¿ì ÇÔ¼ö´Â ÇϳªÀÇ ÀÎÀÚ¸¦ °¡Áø´Ù.
pushl ¸í·ÉÀº °ªÀ» ½ºÅÃÀÇ °¡ÀåÀ§¿¡ ¹Ð¾î ³Ö´Â´Ù. call¸í·ÉÀº
ÇÔ¼ö¸¦ È£ÃâÇϱâ À§Çؼ »ç¿ëÇÑ´Ù.
´ÙÀ½ ÁÙÀ» ºÐ¼®ÇØ º¸µµ·ÏÇÏÀÚ.
addl $4, %esp
movl %eax, %ebx
movl $1, %eax
int $0x80
|
factorialÇÔ¼ö°¡ ³¡³µÀ¸´Ï, 4ÀÇ ÆÑÅ丮¿ÀÇ °ªÀ» °¡Á®¿Í¾ß
ÇÒ°ÍÀÌ´Ù. ¿ì¼± ½ºÅÃÀ» û¼ÒÇØ¾ß ÇÑ´Ù. addl
¸í·ÉÀ» ÀÌ¿ëÇØ¼ ½ºÅÃÆ÷ÀÎÅ͸¦ $4¸¸Å µÚ·Î ¿Å±ä´Ù. ÆÑÅ丮¾ó ÇÔ¼ö¸¦ È£ÃâÇß´Ù¸é
´ç½ÅÀº È£ÃâÇÑ ÇÔ¼ö°¡ ¸®ÅϵÈÈÄ ¹Ýµå½Ã ½ºÅÃÀÎÀÚ¸¦ û¼ÒÇØ ÁÖ¾î¾ß ÇÑ´Ù.
´ÙÀ½ %eax¸¦ %ebx·Î º¹»çÇÑ´Ù. %eax´Â factorialÇÔ¼öÀÇ ¸®ÅϰªÀÌ´Ù. À̰æ¿ì
¸®ÅϰªÀº ÆÑÅ丮¾ó ¿¬»ê°á°úÀÌ´Ù. ÆÑÅ丮¾ó ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ÀÎÀÚ¸¦ 4¸¦ ÁáÀ¸¹Ç·Î
¸®ÅϰªÀº 24°¡ µÉ°ÍÀÌ´Ù. ¸®ÅϰªÀº ¾ðÁ¦³ª
%eax¿¡ ÀúÀåµÈ´Ù´Â °ÍÀ» ±â¾ïÇϱ⠹ٶõ´Ù. ¿ì¸®´Â ÇÁ·Î±×·¥ÀÌ
Á¾·áÇÒ ¶§ ¿î¿µÃ¼Á¦¿¡ 24¸¦ µÇµ¹·Á ÁÖ¾î¾ßÇÑ´Ù. ¸®´ª½ºÀÇ °æ¿ì ÇÁ·Î±×·¥ÀÇ
Á¾·á°ªÀº %eax°¡ ¾Æ´Ñ %ebx¿¡ ÀúÀåÇÑ´Ù. ÀÌÁ¦ exit() ½Ã½ºÅÛ È£ÃâÀ» ½ÇÇàÇÏ¸é µÈ´Ù.
ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¿ì¸®´Â Å©°í º¹ÀâÇÑ ÇÁ·Î±×·¥À» ¸¸µé ¶§ »ó´ëÀûÀ¸·Î °£´ÜÇϰí
ÀÌÇØÇϱ⠽¬¿î ¿©·¯°³ÀÇ Á¶°¢À¸·Î Äڵ带 ¸¸µé ¼ö ÀÖ´Â ÀÕÁ¡À» ¾òÀ» ¼ö ÀÖ´Ù.
½ÇÁúÀûÀ¸·Î ¾ÆÁÖ °£´ÜÇÑ °æ¿ì¸¦ Á¦¿ÜÇϰí, ´ëºÎºÐÀÇ ÇÁ·Î±×·¥Àº ¿©·¯°³ÀÇ ÇÔ¼ö·Î
ÀÌ·ç¾îÁø´Ù.
À§ÀÇ ¿¡Á¦¸¦ ÅëÇØ¼ ¿ì¸®´Â ÇÔ¼ö¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ¾Ë°Ô µÇ¾ú´Ù. C¿¡¼¿Í
¸¶Âù°¡Áö·Î ¾î¼Àºí¸®¾î¿¡¼µµ ÇÔ¼ö´Â ¼±¾ð°ú Á¤ÀÇ ºÎ·Î ³ª´µ°Ô µÈ´Ù.
.type factorial, @function
factorial:
|
ÇÔ¼ö´Â º¸Åë À§¿Í °°Àº ¹æ¹ýÀ¸·Î ¸¸µé ¼ö ÀÖ´Ù. .type´Â factorial ÇÔ¼ö¸¦
°¡¸®Å°±â À§ÇÑ ¸µÄ¿ÀÇ ¿ëµµ·Î »ç¿ëµÇ´Âµ¥, »ý·«ÇÒ ¼ö ÀÖ´Ù. ¿ì¸®°¡ ¸¸µç
ÇÁ·Î±×·¥¿¡´Â .type¸¦ »ç¿ëÇϰí ÀÖ´Ù. facorial: Àº factorialÀÌ °¡¸®Å°´Â
½ÇÁ¦ ÇÔ¼öÄڵ尡 À̰÷¿¡ À§Ä¡ÇÑ´Ù´Â °ÍÀ» Á¤ÀÇ ÇÑ´Ù. ´ÙÀ½ ÁÙºÎÅÍ ¿ì¸®´Â
factorialÀÇ ½ÇÁ¦ÀûÀÎ ÄÚµå ³»¿ëÀ» ±â¼úÇÏ¸é µÈ´Ù. ±â¼úµÈ factorial ÇÔ¼ö´Â
call ¸í·ÉÀ» ÅëÇØ¼ ½ÇÇà ½Ãų ¼ö ÀÖ´Ù.
factorialÇÔ¼öÀÇ Ã¹¶óÀο¡´Â ´ÙÀ½°ú °°Àº Äڵ尡 µé¾î°¡ ÀÖ´Ù.
pushl %ebp
movl %esp, %ebp
|
ÀÌ µÎÁÙÀº ÇÔ¼ö¿¡¼ »ç¿ëÇÒ ½ºÅÿµ¿ªÀ» »ý¼ºÇÑ´Ù. ÀÌ µÎÁÙÀº ¸ðµç ÇÔ¼öÀÇ
½ÃÀۺκп¡ Æ÷ÇԵȴÙ.
º£À̽º Æ÷ÀÎÅÍ ¾îµå·¹½º¸¦ ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ·Î À̵¿ÇÑ´ÙÀ½
À̰÷ÀÇ °ªÀ» %eax¿¡ º¸°¡ÇÑ´Ù. 4(%ebp)´Â ¸®ÅϾîµå·¹½º¸¦
°¡Áö°í ÀÖÀ¸¸ç, 8(%ebp)´Â ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ¸¦ °¡¸®Å°°í ÀÖÀ½À»
±â¾ïÇϱ⠹ٶõ´Ù.
´ÙÀ½ ¶óÀο¡¼ ÇÔ¼öÀÇ ÀÎÀÚ°¡ base case¿¡ µµ´ÞÇß´ÂÁö °Ë»çÇÑ´Ù.
¸¸¾à base case Áï 1À̶ó¸é ÆÑÅ丮¾ó ¿¬»êÀ» ³¡³»°í end_factorial·Î Á¡ÇÁ
ÇÑ´Ù.
cmpl %1, %eax
je end_factorial
|
¸¸¾à base case¿¡ µµ´ÞÇÏÁö ¾Ê¾Ò´Ù¸é, ¿ì¸®´Â factorial ÇÔ¼ö¸¦ ´Ù½Ã È£Ãâ
ÇØ¾ß ÇÑ´Ù. È£ÃâÇÒ ¶§´Â ÀÎÀÚ°ª(%eax)¸¦ 1¸¸Å °¨¼Ò ½ÃÄÑ¾ß ÇÑ´Ù.
decl´Â ¸Þ¸ð¸® ¿µ¿ªÀ̳ª ·¹Áö½ºÅÍÀÇ °ªÀ» 1°¨¼Ò½Ã۱â
À§Çؼ »ç¿ëÇÑ´Ù. ÀÎÀÚ¸¦ 1 °¨¼ÒÇÑ ´ÙÀ½¿¡´Â À̰ªÀ» ½ºÅÿ¡ ¹Ð¾î ³Ö°í
´Ù½Ã factorialÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
pushl %eax
call factorial
|
ÀÌÁ¦ factorialÇÔ¼ö¸¦ Àç±ÍÈ£Ãâ Çß´Ù. ÀÏ´Ü ÇÔ¼ö¸¦ È£ÃâÇÏ°í ³ª¸é ¿ì¸®´Â %esp¿Í
%ebp¸¦ Á¦¿ÜÇϰí´Â ´Ù¸¥ °ªµéÀ» ¾Ë ¼ö ¾ø°ÔµÈ´Ù. ±×·¡¼ ¿ì¸®´Â ÁÖ¾îÁø ÀÎÀÚ °ªÀ»
%ebx¿¡ º¹»çÇϵµ·Ï ÇÑ´Ù.
ÀÌÁ¦ ÀÎÀÚ¿Í ÆÑÅ丮¾ó ÇÔ¼ö¸¦ °öÇÏ¸é µÈ´Ù. ¾Õ¿¡¼ ¿ì¸®´Â ÇÔ¼öÀÇ ¸®ÅϰªÀº %eax
¸¦ ÅëÇØ¼ °¡Á®¿Ã ¼ö ÀÖ´Ù´Â °ÍÀ» ¹è¿ü¾ú´Ù. ±×·¯¹Ç·Î %ebx¿Í %eax¸¦ ¼·Î
°öÇÏ¸é µÈ´Ù.
°öÇÑ °ªÀº %eax¿¡ ÀúÀåµÈ´Ù. À̰ªÀº ÇÔ¼ö°¡ Á¾·áÇÒ ¶§ ±×´ë·Î ¸®ÅϵȴÙ. ¾Õ¼
¿ì¸®°¡ ÇÔ¼ö¸¦ ½ÃÀÛÇÒ ¶§ %ebp¸¦ ¹Ð¾î ³Ö°í, %esp¸¦ %ebp·Î º¹»çÇØ¼ Áö±ÝÀÇ
½ºÅÃÆ÷ÀÎÅ͸¦ ¸¸µé¾ú´Ù. ±×·¸´Ù¸é ÇÔ¼ö°¡ Á¾·áÇÒ¶§ À̰ÍÀ» ¿ø·¡ »óÅ·Π¸¸µå´Â
ÀÛ¾÷ÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ¿ì¸®´Â ¾Æ·¡¿Í °°Àº Äڵ带 ÀÌ¿ëÇØ¼ ÇöÀç ½ºÅÃÇÁ·¹ÀÓÀ»
µÇµ¹¸± ¼ö ÀÖ´Ù.
end_factorial:
movl %ebp, %esp
popl %ebp
|
ÀÌÁ¦ ret¸í·ÉÀ» ÀÌ¿ëÇØ¼ ¸®ÅÏÇÏ¸é µÈ´Ù.
5. ÆÄÀÏ ´Ù·ç±â ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹ÖÀÇ ¸¹Àº ºÎºÐÀº ÆÄÀÏÀ» ´Ù·ç´Â ÀÛ¾÷ÀÌ´Ù. ÄÄÇ»ÅͰ¡ ÀÏ´Ü ¸®º×µÇ¸é
ÀÌÀüÀÇ ÀÛ¾÷³»¿ëÀº ´ÜÁö ÆÄÀϷθ¸ ³²±â ¶§¹®¿¡, ¾î¶² µ¥ÀÌÅ͸¦ º¸Á¸Çϱâ À§Çؼ
µð½ºÅ©»ó¿¡ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÀÏÀº ¸Å¿ì Áß¿äÇÑ ÀÛ¾÷ÀÌ´Ù. ¸¶Âù°¡Áö·Î ÇÁ·Î±×·¥¿ª½Ã
Á¾·áÇÏ°Ô µÇ¸é ¸Þ¸ð¸®¿¡ °¡Áö°í ÀÖ´ø ¸ðµç ³»¿ëÀ» ÀÒ¾î ¹ö¸®±â ¶§¹®¿¡, Áö¼ÓÀûÀ¸·Î
³²°ÜµÎ¾î¾ßÇÒ µ¥ÀÌÅÍ(persistent data ¶ó°í ºÎ¸¥´Ù)´Â ÆÄÀÏ·Î ³²°ÜµÎ¾î¾ß ÇÑ´Ù.
5.1. À¯´Ð½º ÆÄÀÏ ¼Ò°³ ¸ðµç ¿î¿µÃ¼Á¦´Â ³ª¸§´ë·ÎÀÇ ÆÄÀÏÀ» ´Ù·ç´Â ¹æ¹ýÀ» °¡Áö°í ÀÖ´Ù. ¸®´ª½º´Â
À¯´Ð½ºÀÇ ÆÄÀÏ ´Ù·ç±â ¹æ¹ýÀ» äÅÃÇϰí ÀÖ´Ù. À¯´Ð½º ÆÄÀÏÀ» µû¸£´Â ÀÌÀ¯´Â
¸Å¿ì ´Ü¼øÇϰí, °¡Àå ¿À·¡, ±×¸®°í ³Î¸® »ç¿ëµÇ°í ÀÖ´Â Çü½ÄÀ̱⠶§¹®ÀÌ´Ù.
À¯´Ð½º ÆÄÀÏÀº ÇÁ·Î±×·¥¿¡ ÀÇÇØ¼ »ý¼ºµÇ¸ç, ¹ÙÀÌÆ®ÀÇ ¿¬¼ÓµÈ ½ºÆ®¸²À¸·Î
ÀÐÀ» ¼ö ÀÖ´Ù. ½Ã½ºÅÛ °ü¸®ÀÚ³ª ÇÁ·Î±×·¡¸Ó´Â ÆÄÀÏ¿¡ ÁÖ¾îÁø °íÀ¯ÇÑ À̸§À¸·Î
ÆÄÀÏ¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é ¿î¿µÃ¼Á¦´Â ÆÄÀÏÀ» À̸§ÀÌ ¾Æ´Ñ
file descriptor¶ó°í(ÀÌÇÏ ÆÄÀÏÁöÁ¤¹øÈ£) ºÒ¸®¿ì´Â
¼ýÀÚ·Î ÀνÄÇÑ´Ù. ÇÁ·Î±×·¥»ó¿¡¼ ¿©·¯ºÐÀº ÆÄÀÏÁöÁ¤¹øÈ£¸¦ ÀÌ¿ëÇØ¼ Àаųª
¾²´Â ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù.
¿ì¸®°¡ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÆÄÀÏÀ» ´Ù·é´Ù.
¸ÕÀú ¸®´ª½º¿¡ ¾î¶² ÆÄÀÏÀ̸§À» ¿(open)°ÍÀÎÁö¸¦ ¿äûÇÑ´Ù. ÆÄÀÏÀ»
¿¶§´Â ÀбâÀü¿ë,¾²±âÀü¿ë,Àбâ/¾²±â¸ðµÎ °¡´É,ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì
»õ·Î »ý¼ºµî ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ¿ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °ÍÀº open(2) ½Ã½ºÅÛÄÝ
À» ÀÌ¿ëÇØ¼ ÀÌ·ç¾îÁø´Ù. openÀº ÆÄÀÏÀÇ À̸§, ¸ðµå, ±ÇÇѵîÀ» ÀÎÀÚ·Î
ÀԷ¹޴´Ù. openÀº ½Ã½ºÅÛ ÄÝ ¹øÈ£·Î 5¹øÀÌ´Ù. ÆÄÀÏÀ̸§ÀÇ Ã¹¹øÂ° ¹®ÀÚ´Â
%ebx¿¡ ÀúÀåÇÏ¸é µÈ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ ¸ðµå´Â %ecx¿¡ ÀúÀåÇÑ´Ù. ¸¸¾à
Àбâ·Î ¿¬´Ù¸é 0À» ¾²±âÀ§Çؼ ¿¬´Ù¸é 03101À» ÀúÀåÇÏ¸é µÈ´Ù(¹Ýµå½Ã
°¡Àå ¾Õ¿¡ 0À» ½áÁà¾ß ÇÑ´Ù). ¼¼¹øÂ° ÀÎÀÚ´Â ±ÇÇÑ(permission)°ú °ü·ÃµÈ
¼³Á¤À» ³Ñ±â±â À§Çؼ »ç¿ëÇϴµ¥, %edx¿¡ ÇØ´ç °ªÀ» ÀúÀåÇÏ¸é µÈ´Ù.
¸¸¾à ¸ðµç À¯Àú¿¡°Ô Àбâ/¾²±â°¡ °¡´ÉÇϵµ·Ï ÇÏ°í ½Í´Ù¸é 0666À» ³Ñ±â¸é
µÈ´Ù.
openÀÛ¾÷ÀÌ ¼º°øÀûÀ¸·Î ÀÌ·ç¾îÁ³´Ù¸é ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ¸®ÅÏÇÏ°Ô µÈ´Ù.
¸®ÅϰªÀº %eax¸¦ ÅëÇØ¼ Àоî¿Ã ¼ö ÀÖ´Ù. ¸®ÅÏµÈ ¹øÈ£´Â ÆÄÀÏÀ» °¡¸®Å°´Â
¿ªÇÒÀ» ÇÑ´Ù.
ÀÌÁ¦ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀÌ¿ëÇØ¼ Àаųª ¾²´Â ÀÛ¾÷À» ÇÏ¸é µÈ´Ù.
read(2)´Â ½Ã½ºÅÛÄÝ ¹øÈ£ 3¹øÀÌ´Ù. ÀÌ ½Ã½ºÅÛÄÝÀº 3°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î
ÇÑ´Ù. ù¹øÂ° ÀÎÀÚ´Â Àб⠿øÇÏ´Â ÆÄÀÏÀÇ ÁöÁ¤ÀÚÀ̸ç %ebx¿¡ ÀúÀåÇÏ¸é µÈ´Ù.
µÎ¹øÂ° ÀÎÀÚ´Â ÀоîµéÀÎ µ¥ÀÌÅͰ¡ ÀúÀåµÉ ¹öÆÛÀÇ ÁÖ¼Ò¸¦ °¡¸®Å°¸ç %ecx¿¡ ÁÖ¼Ò°ªÀ»
ÀúÀåÇÑ´Ù. ¸¶Áö¸· ÀÎÀÚ´Â ¹öÆÛÀÇ Å©±â·Î %edx¿¡ ÀúÀåÇÑ´Ù. ¹öÆÛ´Â section
.bss¸¦ ÀÌ¿ëÇØ¼ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. read´Â ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÎ ¹®ÀÚÀÇ °¹¼ö¸¦
¸®ÅÏÇϰųª, ¿¡·¯ Äڵ带 ¸®ÅÏÇÑ´Ù. ¿¡·¯ÄÚµå´Â (-)°ª À̹ǷΠÁ¤»ó¸®Åϰª°ú
½±°Ô ±¸ºÐÇÒ ¼ö ÀÖ´Ù.
write(2)´Â ½Ã½ºÅÛÄÝ ¹øÈ£ 4¹øÀ¸·Î ¹öÆÛ¿¡ ÆÄÀÏ¿¡ ¾µ ³»¿ëÀ» ä¿ö¼ Àü´ÞÇÏ´Â °ÍÀ»
Á¦¿ÜÇϰí ÀÎÀÚ´Â read¿Í µ¿ÀÏÇÏ´Ù. write ½Ã½ºÅÛÄÝÀº ÆÄÀÏ¿¡ ¾´ µ¥ÀÌÅÍÀÇ Å©±â ȤÀº
¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù.
ÆÄÀϰü·ÃµÈ ¸ðµç ÀÛ¾÷À» ¸¶ÃÆ´Ù¸é, ¿¸°ÆÄÀÏÀ» ´Ý¾Æ¾ß ÇÑ´Ù. ÆÄÀÏÀ» ´ÝÀ» ¶§ »ç¿ëµÇ´Â
½Ã½ºÅÛÄÝÀº 6¹ø ¹øÈ£¸¦ °¡Áö´Â close(2)ÀÌ´Ù.´ÜÁö ´Ý°íÀÚ ÇÏ´Â ÆÄÀÏÀÇ ÁöÁ¤ÀÚ¸¸
ÀÎÀÚ·Î ³Ñ±â¸é µÈ´Ù.
5.2. ¹öÆÛ¿Í .bss ÀÌÀüÀå¿¡¼ ¹öÆÛ¿¡ ´ëÇØ¼ ¾ð±ÞÇߴµ¥, ÀÚ¼¼È÷ ¼³¸íÇÏÁö´Â ¾Ê¾Ò´Ù. À̹ø Àå¿¡¼´Â ¹öÆÛ¿¡
´ëÇØ¼ ÀÚ¼¼È÷ ¼³¸íÇØº¸µµ·Ï ÇÑ´Ù. ¹öÆÛ´Â ´ë·®ÀÇ µ¥ÀÌÅ͸¦ Àü´ÞÇϱâ À§Çؼ »ç¿ëµÇ´Â
¿¬¼ÓµÇ´Â ºí·°¿µ¿ªÀÌ´Ù. ´ç½ÅÀÌ ÆÄÀÏ·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àб⸦ ¿øÇÑ´Ù¸é, ¿äûÀº
¿î¿µÃ¼Á¦·Î Àü´ÞµÇ´Âµ¥, À̶§ ÀÐÀº µ¥ÀÌÅ͸¦ ¾îµð¿£°¡¿¡ ÀúÀåÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ
Àå¼Ò¸¦ ¹öÆÛ¶ó°í ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ¹öÆÛ´Â µ¥ÀÌÅÍÀÇ Àӽà ÀúÀåÀå¼Ò·Î »ç¿ëµÇ¸ç, ¹öÆÛ¸¦
ÀÌ¿ëÇÔÀ¸·Î¼ ÇÁ·Î±×·¥Àº µ¥ÀÌÅ͸¦ Á»´õ ½±°Ô ´Ù·ê ¼ö ÀÖ°Ô µÈ´Ù.
¹öÆÛ¸¦ »ý¼ºÇÒ¶§ ¿©·¯ºÐÀº °íÁ¤µÈ Å©±âÀÇ ¹öÆÛ¸¦ ¸¸µéÁö ¾Æ´Ï¸é Çʿ信 µû¶ó Å©±â°¡
º¯ÇÏ´Â ¹öÆÛ¸¦ »ý¼ºÇØ¾ß ÇÒÁö ¼±ÅÃÇØ¾ß ÇÑ´Ù. °íÁ¤µÈ Å©±âÀÇ ¹öÆÛ »ý¼ºÀº °£´ÜÇÏ´Ù.
.long ³ª .byte ¸¦ ÀÌ¿ëÇØ¼ ¹öÆÛ·Î »ç¿ëµÉ Å©±â¸¦ Á÷Á¢ ÁöÀåÇÏ¸é µÈ´Ù. ¹Ý¸é µ¿ÀûÀ¸·Î
º¯ÇÏ´Â ¹öÆÛÀÇ »ý¼ºÀº ´Ù·ç¾î¾ßÇÒ ³»¿ëÀÌ ¸¹À¸¹Ç·Î ??Àå¿¡¼ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ.
¹öÆÛ°ø°£À» È®º¸ÇÏ´Â°Ç °£´ÜÇϱä ÇÏÁö¸¸ °ø°£È®º¸¸¦ À§ÇÑ ´ÜÀ§·Î .byte¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù´Â
°Í ¶§¹®¿¡ ¸î°¡Áö ¹®Á¦Á¡ÀÌ ¹ß»ýÇÏ´Ù. ù¹øÂ°´Â °ø°£ÀÇ Å©±â¸¦ °è»êÇØ¾ß ÇÏ´Â ¹®Á¦´Ù.
¹®ÀÚ 500ÀÚ¸¦ ÀúÀåÇÏ´Â °Í°ú intÇü ¼ýÀÚ 500°³¸¦ ÀúÀåÇϱâ À§ÇÑ ¿¹¿¡¼ º¸µíÀÌ
ÀúÀåµÇ´Â ¿ø¼ÒÀÇ °¹¼ö´Â µ¿ÀÏÇÏÁö¸¸, ¿ø¼Ò°¡ Â÷ÁöÇÏ´Â Å©±â°¡ ´Ù¸§À¸·Î ÇÊ¿äÇÑ °ø°£°è»ê¿¡¼
½Ç¼ö°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ƯÈ÷ ¾î¼Àºí·¯³ª C¿Í °°Àº Áß/Àú ¼öÁØÀÇ ¾ð¾î¸¦ ÀÌ¿ëÇÒ°æ¿ì
ÀÌ·¯ÇÑ ½Ç¼ö´Â ÀÏ»óÀûÀ¸·Î ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
µÎ¹øÂ°.. ÀÌ·¯ÇÑ °ø°£Àº ÇÁ·Î±×·¥ ½ÇÇà½Ã »ý¼ºµÈ´Ù. Áß°£¿¡ ÇÊ¿ä ¾ø´Ù°í ÇØ¼ ¾ø¾Ù ¼ö ¾ø´Ù.
ÀÌ´Â °ø°£ÀÌ ³¶ºñµÉ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù.
¹°·Ð ÀÌµé ¹®Á¦¿¡ ´ëÇÑ ÇØ¹ýµµ Á¸ÀçÇϴµ¥ .text, .data ¼½¼ÇÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
.bss »ö¼ÇÀº ÀúÀå°ø°£À» È®º¸ÇÒ ¼ö ÀÖÁö¸¸ ÃʱâÈ ÇÒ¼ö´Â ¾ø´Ù. .data ¼½¼ÇÀÇ °æ¿ì
°ø°£À» È®º¸ÇÏ°í °ªÀ» ÃʱâÈ ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ Æ¯¼º ¶§¹®¿¡ °ªÀ» ÃʱâÈÇÒ ÇÊ¿ä¾ø´Â
°ø°£À» È®º¸ÇϰíÀÚ ÇÒ¶§ ÁÖ·Î »ç¿ëÇÑ´Ù. .bss´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
.section .bss
.lcomm my_buffer, 500
|
.lcommÀº 500byteÀÇ °ø°£À» ÇÒ´çÇϰí, °ø°£À» °¡¸®Å°±âÀ§ÇÑ ½Éº¼·Î
my_bufferÀ» »ý¼ºÇÑ´Ù. ¸¸µé¾îÁø °ø°£Àº ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
movl $my_buffer, %ecx
movl 500, %edx
movl 3, %eax
int $0x80
|
À§ÀÇ ÄÚµå´Â read ½Ã½ºÅÛÄÝÀ» ½ÇÇà½ÃŲ ¿¹·Î, 500¹ÙÀÌÆ®¸¸ÅÀÇ µ¥ÀÌÅ͸¦ ÀÐ¾î¼ my_buffer·Î
º¹»çÇÑ´Ù. C½ºÅ¸ÀÏ·Î ¹Ù²ã º¸ÀÚ¸é ¾Æ·¡ÀÇ ÄÚµå Á¤µµ°¡ µÉ°ÍÀÌ´Ù.
read(fd, my_buffer, 500);
|
my_bufferÀ» »ç¿ëÇÒ ¶§ °¡Àå ¾Õ¿¡ ´Þ·¯($)Ç¥½Ã°¡ ÀÖÀ½À» ÁÖ¸ñÇϱ⠹ٶõ´Ù. $Ç¥½Ã°¡
»ç¿ëÇÒ °æ¿ì immediate ¸ðµå ¾îµå·¹½º »óŰ¡ µÇ°í ¹öÆÛÀÇ ½ÃÀÛÀ§Ä¡¸¦ °¡¸®Å°°Ô µÈ´Ù.
°á°úÀûÀ¸·Î %ecx´Â my_bufferÀÇ ÀúÀå°ø°£ÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ °¡¸®Å°°Ô µÈ´Ù. C¾ð¾î¸¦
ÇØºÃ´Ù¸é °á±¹Àº Æ÷ÀÎÅÍ¿Í ºñ½ÁÇÑ °³³äÀ̶ó´Â »ý°¢ÀÌ µé °ÍÀÌ´Ù.
5.3. Ç¥ÁØÆÄÀϰú Ư¼ö ÆÄÀÏµé ´ç½ÅÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ¸é ±âº»ÀûÀ¸·Î ¿©´Â ÆÄÀϵéÀÌ ¸î°Ô ÀÖ´Ù. ¸®´ª½º´Â
´ÙÀ½°ú °°Àº 3°³ÀÇ ÆÄÀÏÀ» ±âº»ÀûÀ¸·Î »ý¼º½ÃŲ´Ù.
- STDIN
Ç¥ÁØ ÀÔ·Â(standard input)À¸·Î, Àбâ Àü¿ëÀÌ´Ù. º¸Åë Űº¸µå·ÎºÎÅÍÀÇ
ÀÔ·ÂÀ» ¹Þ¾ÆµéÀδÙ. Ç¥ÁØ ÀÔ·ÂÀ» À§ÇÑ ÆÄÀÏÁöÁ¤ÀÚ´Â ¾ðÁ¦³ª 0ÀÌ´Ù.
- STDOUT
Ç¥ÁØ Ãâ·Â(standard output)À¸·Î, ¾²±â Àü¿ëÀÌ´Ù. ¸ð´ÏÅÍ È¸é¿¡
Ãâ·ÂÇϱâ À§Çؼ »ç¿ëµÈ´Ù. Ç¥ÁØ Ãâ·ÂÀ» À§ÇÑ ÆÄÀÏÁöÁ¤ÀÚ´Â ¾ðÁ¦³ª 1ÀÌ´Ù.
- STDERR
Ç¥ÁØ ¿¡·¯(standard error)À¸·Î, ¾²±â Àü¿ëÀÌ´Ù. ¸ð´ÏÅÍ È¸é¿¡
Ãâ·Â(¾²±â)Çϱâ À§Çؼ »ç¿ëµÈ´Ù. ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. ¾îÂ÷ÇÇ ¸ð´ÏÅÍ È¸é¿¡
Ãâ·ÂÇÏ´Â °Å¶ó¸é STDOUT¿Í ´Ù¸¦°Ô ¹¹°¡ ÀÖ´À³Ä¶ó°í »õ°¢ÇÒ ¼öµµ ÀÖÀ»°Í °°´Ù.
¸¸¾à ȸéÃâ·ÂÀ» Çϴµ¥, Á¤»óÀûÀÎ ¸Þ½ÃÁö¿Í ¿¡·¯ ¸Þ½ÃÁö°¡ °°Àº ÆÄÀÏÁöÁ¤ÀÚ¸¦
¾´´Ù¸é À̸¦ ±¸ºÐÇØ ³»±â°¡ ¸Å¿ì Â¥Áõ³¯ °ÍÀÌ´Ù. Ç¥ÁØ¿¡·¯¸¦ µû·Î ºÐ¸®ÇϹǷνá
¿¡·¯¸Þ½ÃÁö¸¦ ÀϹݸ޽ÃÁö¿Í ½±°Ô ºÐ¸®ÇÒ ¼ö ÀÖ´Ù.
Űº¸µå ÀԷ°ú ȸé Ãâ·Â°°Àº °ÍµéÀ» ÆÄÀÏ·Î ´Ù·ëÀ¸·Î À̵é ÀÔ/Ãâ·ÂÀ» ½±°Ô ½ÇÁ¦ÆÄÀÏ·Î
º¸³¾ ¼öµµ ÀÖ´Ù. ÀÌ·¯ÇÑ°É ÀçÁöÇâ(redirected)À̶ó°í ÇÑ´Ù. ÀçÁöÇâ°ú °ü·ÃµÈ ³»¿ëÀº
ÀÌ ¹®¼ÀÇ ¹üÀ§¸¦ ¹þ¾î³ª¹Ç·Î ÀÚ¼¼È÷ ¼³¸íÇÏÁø ¾Ê°Ú´Ù. ÀçÁöÇâ°ú °ü·ÃµÈ ³»¿ëÀº
UNIX »ç¿ë°ú °ü·Ã ´Ù¸¥ Ã¥µéÀ» Âü°íÇϱ⠹ٶõ´Ù.
Űº¸µå, ¸ð´ÏÅÍ¿Í °°Àº °Íµé ¿Ü¿¡µµ À¯´Ð½º´Â ´Ù¸¥ ¸ðµç ÀåÄ¡µé ¿¹¸¦ µé¸é
½Ã¸®¾ó Æ÷Æ®, ¿Àµð¿À ÀåÄ¡, ³×Æ®¿öÅ© ¿¬°áµé±îÁöµµ ÆÄÀÏ·Î ´Ù·é´Ù.
»Ó¸¸ ¾Æ´Ï¶ó ÇÁ·Î¼¼½º°£ÀÇ Åë½ÅÀ» À§Çؼ »ç¿ëµÇ´Â pipe¿Í °°Àº °Íµé ¿ª½Ã ÆÄÀÏ·Î
´Ù·é´Ù. ¸ðµç°ÍÀ» ÆÄÀÏ·Î ´Ù·ç°Ô µÇ¹Ç·Î½á µ¿ÀÏÇÑ ¹æ¹ýÀ» ½á¼ À̵é ÀåÄ¡¸¦ Á¦¾îÇÒ ¼ö
ÀÖ°Ô µÈ´Ù. ±âº»ÀûÀ¸·Î read, write¸¦ ÀÌ¿ëÇÏ´Â Á¤µµ·Î ÀÌµé ¸ðµç ÀåÄ¡ÀÇ ÀÔÃâ·ÂÀ»
ÇØ°áÇÒ ¼ö ÀÖ´Ù.
5.4. ÇÁ·Î±×·¥¿¡¼ ÆÄÀÏÀÇ ÀÌ¿ë À̹ø¿¡´Â ÆÄÀÏÀ» ´Ù·ç´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÀÌ ÇÁ·Î±×·¥Àº
µÎ°³ÀÇ ÆÄÀÏÀ» ÀÌ¿ëÇÑ´Ù. ÇϳªÀÇ ÆÄÀϷκÎÅÍ ¹®ÀÚ¸¦ ÀÐ¾î µéÀ̰í ÀоîµéÀÎ ¹®ÀÚ¸¦
¿µ¹® ´ë¹®ÀÚ·Î º¯°æÇÏ´Â ÀÏÀ» ÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥ÀÇ ¾Æ·¡ÀÇ ÁÖ¿ä ºÎºÐÀ¸·Î ÀÌ·ç¾îÁø´Ù.
¸Þ¸ð¸®ÀÇ ºí·°¿¡ ÀÖ´Â ¹®ÀÚµ¥ÀÌÅ͸¦ ´ë¹®ÀÚ·Î º¯°æÇÏ´Â ÇÔ¼ö¸¦ °¡Áø´Ù.
ÀÌ ÇÔ¼ö´Â µ¥ÀÌÅͰ¡ ÀÖ´Â ¸Þ¸ð¸®ºí·°ÀÇ ÁÖ¼Ò¿Í Å©±â¸¦ ÀÎÀÚ·Î ¹Þ´Â´Ù.
ÁÖ¿ä ÄÚµåÁßÀÇ Çϳª´Â ÆÄÀÏ·Î ºÎÅÍ µ¥ÀÌÅ͸¦ ¹öÆÛ·Î ÀоîµéÀÌ´Â ÄÚµåÀÌ´Ù.
ÀÌ ÄÚµå´Â ÆÄÀÏ¿¡ ´õÀÌ»ó µ¥ÀÌÅͰ¡ ¾øÀ» ¶§±îÁö ¹öÆÛ·Î ÀÐ¾î µéÀ̰í À§ÀÇ
´ë¹®ÀÚ º¯°æÇÔ¼ö¿¡ ¹öÆÛ¸¦ ÀÎÀÚ·Î ³Ñ±â°í ½ÇÇàÇØ¼ °á°ú°ªÀ» ´Ù¸¥ ÆÄÀÏ·Î
ÀúÀåÇÑ´Ù.
Á¶±Ý º¹ÀâÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Ù º¸¸é ÇÁ·Î±×·¥ Àü¿ªÀûÀ¸·Î °íÁ¤µÇ¾î¼ »ç¿ëÇØ¾ßÇÒ
¸¹Àº »ó¼ö °ªµéÀÌ ÇÊ¿äÇØÁø´Ù. ¿¹µéµé¾î ½Ã½ºÅÛ ÄݹøÈ£´Â º¯ÇÏÁö ¾Ê´Â ¼ýÀÚ·Î ±¸¼ºµÇ¾î
Àִµ¥, »ç¿ëÇÒ ¶§¸¶´Ù ¼ýÀÚ·Î ±â¾ïÇØ³»¼ ¾²´Â°Ç ¸Å¿ì ±ÍÂúÀº ÀÏÀÏ °ÍÀÌ´Ù. ÀÌ·²°æ¿ì
.equ¸¦ ÀÌ¿ëÇÑ´Ù. .equ´Â ÀÏÁ¾ÀÇ º°ÄªÀ» ¸¸µé¾îÁÖ±â À§Çؼ »ç¿ëÇÏ´Â
Áö½Ã¾î·Î CÀÇ #define°ú ºñ½ÁÇÑ ÀÏÀ» ÇÑ´Ù.
.equÀÇ ½ÇÁúÀûÀÎ »ç¿ë¿ëµµ¸¦ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
À§¿Í °°ÀÌ Çϸé Äڵ峻¿¡¼ ½Ã½ºÅÛÄÝÀ» È£ÃâÇÒ ¶§, º¸±â Èûµç 0x80´ë½Å LINUX_SYSCALLÀ»
»ç¿ëÇÒ ¼ö ÀÖ´Ù.
0x80º¸´Ù´Â ÈξÀ ÀÐ°í ±â¾ïÇØ³»±â ½±´Ù. º¹ÀâÇÑ Äڵ忡¼ .equ´Â °¡µ¶¼ºÀ» ³ôÀ̴µ¥
Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù.
´ÙÀ½Àº ½ÇÁ¦ ÀÛµ¿°¡´ÉÇÑ ¹®ÀÚº¯ÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ÆÄÀϸíÀº file.s·Î ÀúÀåÇϵµ·Ï ÇÏÀÚ.
# ÇÏ ´Â ÀÏ : ÆÄÀÏ·Î ºÎÅÍ ¹®ÀÚ¸¦ ÀоîµéÀÌ°í ´ë¹®ÀÚ·Î ¹Ù²ÛÈÄ ´Ù¸¥ ÆÄÀÏ·Î ÀúÀåÇÑ´Ù.
# ÇÁ·Î¼¼½º : 1. ÀÐÀ» ÆÄÀÏÀ» ¿¬´Ù.
# 2. ¾µ ÆÄÀÏÀ» ¿¬´Ù.
# 3. ÆÄÀÏÀÇ ³¡ÀÌ ¾Æ´Ï¶ó¸é ´ÙÀ½ÀÇ ÇÁ·Î¼¼½º¸¦ ¹Ýº¹ÇÑ´Ù.
# 1) ÆÄÀÏ·Î ºÎÅÍ ¹®ÀÚ¿À» ÀÐ¾î¼ ¸Þ¸ð¸®¿¡ ³Ö´Â´Ù.
# 2) ¸Þ¸ð¸®·Î ºÎÅÍ °¢ ¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯°æÇÑ´Ù.
# 3) º¯°æµÈ ¹®ÀÚ´Â ÆÄÀÏ·Î ÀúÀåÇÑ´Ù.
.section .data
# »ó¼öµé
.equ SYS_OPEN, 5
.equ SYS_WRITE, 4
.equ SYS_READ, 3
.equ SYS_CLOSE, 6
.equ SYS_EXIT, 1
# open()¿¡ »ç¿ëÇÒ ¿É¼Ç
# À̵鿡 ´ëÇÑ ³»¿ëÀº open()ÇÔ¼öÀÇ manÆäÀÌÁö¸¦ Âü°íÇÑ´Ù.
.equ O_RDONLY, 0
.equ O_CREAT_WRONLY_TRUNC, 03101
# Ç¥ÁØ ÆÄÀÏ ÁöÁ¤ÀÚ
.equ STDIN, 0
.equ STDOUT, 1
.equ STDERR, 2
# ½Ã½ºÅÛ ÄÝ Áß´Ü(interrupt)
.equ LINUX_SYSCALL, 0x80
.equ END_OF_FILE, 0 # ÆÄÀÏÀÇ ³¡À» °Ë»çÇϱâ À§Çؼ »ç¿ëÇÑ´Ù.
# read()ÀÇ ¸®Åϰª°ú ºñ±³ÇÑ´Ù.
.equ NUMBER_ARGUMENTS, 2
.section .bss
# ¹öÆÛ - ÆÄÀÏ·Î ºÎÅÍ µ¥ÀÌÅ͸¦ ÀоîµéÀÎ µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§ÇÑ
# ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù.
# ¹öÆÛÀÇ Å©±â´Â ¿©·¯°¡Áö ÀÌÀ¯·Î 16,000À» ÃʰúÇÒ ¼ö ¾ø´Ù.
.equ BUFFER_SIZE, 500
.lcomm BUFFER_DATA, BUFFER_SIZE
.section .text
# ½ºÅà À§Ä¡
.equ ST_SIZE_RESERVE, 8
.equ ST_FD_IN, -4
.equ ST_FD_OUT, -8
.equ ST_ARGC, 0 # ÀÎÀÚÀÇ °¹¼ö
.equ ST_ARGV_0, 4 # ÇÁ·Î±×·¥ÀÇ À̸§
.equ ST_ARGV_1, 8 # ÀоîµéÀÏ ÆÄÀÏÀÇ À̸§
.equ ST_ARGV_2, 12 # ÀúÀåÇÒ ÆÄÀÏÀÇ À̸§
.globl _start
_start:
### ÃʱâÈ °ü·Ã ###
# ½ºÅÃÆ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù.
movl %esp, %ebp
# ½ºÅÿ¡ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£À» ÇÒ´çÇÑ´Ù.
subl $ST_SIZE_RESERVE, %esp
open_files:
open_fd_in:
### ÀоîµéÀÏ ÆÄÀÏÀ» ¿¬´Ù ###
movl $SYS_OPEN, %eax # syscallÀ» ¿¬´Ù.
movl ST_ARGV_1(%ebp), %ebx # %ebx¿¡ ÆÄÀÏÀ̸§À» ³Ö´Â´Ù.
movl $O_RDONLY, %ecx # read-only Ç÷¡±×
movl $0666, %edx # ÆÄÀÏ ±ÇÇÑÀ» 0666À¸·Î ÇÑ´Ù. ´©±¸µçÁö ÀÐ°í¾µ¼ö ÀÖ´Ù.
int $LINUX_SYSCALL # ¸®´ª½º È£Ãâ
store_fd_in:
movl %eax, ST_FD_IN(%ebp) # ¸®ÅÏµÈ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇÑ´Ù.
open_fd_out:
### ÀúÀåÇÒ ÆÄÀÏ ¿±â ###
movl $SYS_OPEN, %eax # ÆÄÀÏ ¿±â
movl ST_ARGV_2(%ebp), %ebx # ¿ ÆÄÀÏÀ̸§À» ÁöÁ¤ÇÑ´Ù.
movl $O_CREAT_WRONLY_TRUNC, %ecx # ¾²±âÀ§ÇÑ Ç÷¹±×ÀÇ ¼³Á¤
movl $0666, %edx # ÆÄÀϱÇÇÑ ¼³Á¤
int $LINUX_SYSCALL # ¸®´ª½º È£Ãâ
store_fd_out:
movl %eax, ST_FD_OUT(%ebp) # ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇÑ´Ù.
### ÁÖ¿ä ·çÇÁ ½ÃÀÛ ###
read_loop_begin:
### ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÌ´Â ºÎºÐ ###
movl $SYS_READ, %eax
movl ST_FD_IN(%ebp), %ebx # ÀоîµéÀÏ ÆÄÀÏ ÁöÁ¤ÀÚ
movl $BUFFER_DATA, %ecx # ÀоîµéÀÎ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¹öÆÛ
movl $BUFFER_SIZE, %edx # ÀоîµéÀÏ Å©±â
int $LINUX_SYSCALL # ½Ã½ºÅÛÄÝÀÇ ½ÇÇà
# ¸®ÅϰªÀº %eax¿¡ ÀúÀåµÈ´Ù.
cmpl $END_OF_FILE, %eax # ÆÄÀÏÀÇ ³¡ÀÎÁö °Ë»çÇÑ´Ù.
jle end_loop # ¸¸¾à ±×·¸´Ù¸é end_loop·Î Á¡ÇÁÇÑ´Ù.
continue_read_loop:
### ÀÔ·ÂµÈ ¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯°æÇÏ´Â ºÎºÐ ###
pushl $BUFFER_DATA # ¹öÆÛÀÇ À§Ä¡
pushl %eax # ¹öÆÛÀÇ »çÀÌÁî
call convert_to_upper # ´ë¹®ÀÚ º¯°æÇÔ¼öÀÇ È£Ãâ
popl %eax
addl $4, %esp
### º¯°æµÈ ¹®ÀÚ¸¦ ÆÄÀÏ¿¡ ¾´´Ù ###
movl %eax, %edx # ¹öÆÛÀÇ Å©±â
movl $SYS_WRITE, %eax
movl ST_FD_OUT(%ebp), %ebx # ÀúÀå¿¡ »ç¿ëÇÒ ÆÄÀÏ ÁöÁ¤ÀÚ
movl $BUFFER_DATA, %ecx # ¹öÆÛÀÇ À§Ä¡
int $LINUX_SYSCALL # write()¸¦ È£ÃâÇÑ´Ù.
### ·çÇÁ¸¦ °è¼Ó¼öÇàÇÑ´Ù. ###
jmp read_loop_begin
end_loop:
### ÆÄÀÏÀ» ´Ý´Â´Ù. ###
# ¿©±â¿¡¼´Â ¿¡·¯Ã¼Å©´Â ÇÏÁö ¾Ê´Â´Ù.
movl $SYS_CLOSE, %eax
movl ST_FD_OUT(%ebp), %ebx
int $LINUX_SYSCALL
### Á¾·á ÄÚµå ###
movl $SYS_EXIT, %eax
movl $0, %ebx
int $LINUX_SYSCALL
# ÇÏ ´Â ÀÏ : ÀÌ ÇÔ¼ö´Â ¼Ò¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯°æÇÑ´Ù.
#
.equ LOWERCASE_A, 'a'
.equ LOWERCASE_Z, 'z'
.equ UPPER_CONVERSION, 'A' - 'a'
.equ ST_BUFFER_LEN, 8
.equ ST_BUFFER, 12
convert_to_upper:
pushl %ebp
movl %esp, %ebp
movl ST_BUFFER(%ebp), %eax
movl ST_BUFFER_LEN(%ebp), %ebx
movl $0, %edi
cmpl $0, %ebx
je end_convert_loop
convert_loop:
movb (%eax, %edi, 1), %cl
cmpb $LOWERCASE_A, %cl
jl next_byte
cmpb $LOWERCASE_Z, %cl
jg next_byte
addb $UPPER_CONVERSION, %cl
movb %cl, (%eax, %edi, 1)
next_byte:
incl %edi
cmpl %edi, %ebx
jne convert_loop
end_convert_loop:
movl %ebp, %esp
popl %ebp
ret
|
À§ ÇÁ·Î±×·¥À» touuper.s ·Î ÀúÀåÇÏ°í ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÄÄÆÄÀÏ Çϵµ·Ï ÇÏÀÚ.
# as toupper.s -o toupper.o
# ld toupper.s -o toupper
|
ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà ½ÃŰ¸é ¸ðµç ¼Ò¹®ÀÚ¸¦ ´ëºÐÀÚ·Î º¯°æ½ÃŲ´Ù. ¿¹¸¦ µé¾î¼
toupper.s ¸¦ ´ë¹®ÀÚ·Î º¯È¯½Ã۰í ÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
# ./toupper toupper.s toupper.uppercase:
|
touuper.uppercase ¸¦ Àо¸é ¿ø·¡ÀÇ ÆÄÀÏÀÇ ¸ðµç ³»¿ëÀÌ ´ë¹®ÀÚ·á º¯°æµÈ°É
È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
±×·³ ÇÁ·Î±×·¥¿¡ ´ëÇØ¼ Á»´õ ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
ÇÁ·Î±×·¥ÀÇ Ã¹¹øÂ° ¼½¼ÇÀº CONSTANTS.·Î ½ÃÀÛÇÑ´Ù.
ÇÁ·Î±×·¥¿¡¼ »ó¼ö(constant)´Â ÇÁ·Î±×·¥ÀÌ ¾î¼Àºí ȤÀº ÄÄÆÄÀÏ µÉ¶§ ÇÒ´çµÇ´Â
°ªÀ¸·Î º¯°æµÉ ¼ö ¾ø´Â °ªÀÌ´Ù. »ó¼ö¸¦ ¾ðÁ¦ ÇÒ´çÇØ¼ ¾²´À³Ä´Â ÇÁ·Î±×·¡¸ÓÀÇ
ÃëÇâ¿¡ µû¶ó ´Þ¶óÁú ¼ö ÀÖÁö¸¸, ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ °¡Àå óÀ½¿¡ µÎ´Â °ÍÀ»
¿øÄ¢À¸·Î ÇÑ´Ù. ÇÁ·Î±×·¥ Àü¿ªÀûÀ¸·Î ¿µÇâÀ» ¹ÌÄ£´Ù´Â »ó¼öÀÇ Æ¯Á¤»ó
½±°Ô È®ÀÎ °¡´ÉÇÑ À§Ä¡¿¡ µÎ´Â°Ô °ü¸®Çϱ⿡ ÁÁ±â ¶§¹®ÀÌ´Ù. À§ÀÇ ÇÁ·Î±×·¥¿¡¼´Â
ÆÄÀÏ ÁöÁ¤ÀÚ¿Í ÀÎÀÚÁ¢±Ù, ¹öÆÛÅ©±â, ½Ã½ºÅÛÄÝ ¹øÈ£ µî °áÄÚ ¹Ù²îÁö ¾Ê´Â ¸ðµç
°ªµéÀ» »ó¼ö·Î ¼±¾ðÇØ¼ »ç¿ëÇϰí ÀÖ´Ù.
¾î¼Àºí¸®¾î¿¡¼ »ó¼öÀÇ ¼±¾ðÀº .equ¸¦ ÀÌ¿ëÇÑ´Ù.
C/C++ÀÇ #define ¹®À̶ó°í º¼ ¼ö ÀÖ´Ù. »ó¼öÀÇ À̸§À» ¾Õ¿¡ ¾²°í ±×´ÙÀ½
°ªÀ» ¾²¸é µÈ´Ù.
´ÙÀ½Àº BUFFERS. ¼½¼ÇÀ¸·Î ÇÁ·Î±×·¥ÀÇ ¹öÆÛ¿Í °ü·ÃÇØ¼
»ç¿ëÇÑ´Ù. ¿©±â¿¡¼µµ ¹öÆÛÀÇ Å©±â´Â BUFFER_SIZE. »ó¼ö·Î Á¤ÀÇÇØ¼ »ç¿ëÇϰí
ÀÖ´Ù. ¸¸¾à ¹öÆÛÀÇ Å©±â¸¦ ¹Ù²Ù°í ½Í´Ù¸é BUFFER_SIZE. »ó¼öÀÇ °ª¸¸ º¯°æÇØ
ÁÖ¸é µÈ´Ù. ¹öÆÛÀÇ À̸§Àº BUFFER_DATA ·Î Çß´Ù. ¿©±â¿¡¼ »ó¼ö¸¦ »ç¿ëÇÏ¸é¼ ¾ò
À» ¼ö ÀÖ´Â ÀÕÁ¡ÀÌ Çϳª ³ª¿Ô´Âµ¥. ƯÁ¤ °ªÀ» ÀϰüµÇ°Ô °ü¸®ÇÒ ¼ö ÀÖ´Ù´Â
Á¡ÀÌ´Ù. ¸¸¾à »ó¼ö¸¦ »ç¿ëÇÏÁö ¾Ê¾Ò´Ù¸é ¹öÆÛÀÇ Å©±â¸¦ ¹Ù²Ü ¶§ ÀÏÀÏÀÌ
¹öÆÛÀÇ Å©±â¸¦ ã¾Æ¼ ¹Ù²ãÁà¾ß ÇÒ°ÍÀÌ´Ù. ±×¸¸Å ½Ç¼ö¸¦ È®·üµµ ¸¹Àºµ¥ »ó¼öÀÇ
»ç¿ëÀº ÀÌ·¯ÇÑ ½Ç¼öµµ ÁÙ¿©ÁØ´Ù.
´ÙÀ½Àº _start. ¼½¼ÇÀε¥, ¿ì¼±Àº ÄÚµåÀÇ ¸¶Áö¸·¿¡ ÀÖ´Â convert_to_upperÁ¤ÀǸ¦
¸ÕÀú º¸µµ·Ï ÇÏÀÚ. ¿©±â´Â ½ÇÁ¦·Î ¹®ÀÚÀÇ º¯°æÀ» À§ÇØ »ç¿ëµÇ´Â ÄÚµå ¿µ¿ªÀÌ´Ù.
¿ª½Ã ÇÔ¼öÀÇ Ã³À½Àº ÇÔ¼ö³»¿¡¼ »ç¿ëµÉ °¢Á¾ »ó¼ö¸¦ Á¤ÀÇÇÏ´Â Äڵ尡
µé¾î°¡ ÀÖ´Ù.
.equ LOWERCASE_A, 'a' # a¿Í z´Â ¼Ò¹®ÀÚÀÎÁö üũÇϱâ À§ÇÑ
.equ LOWERCASE_Z, 'z' # ¿ëµµ·Î »ç¿ëµÈ´Ù.
.equ UPPER_CONVERSION, 'A' - 'a' # ´ë¹®ÀÚ¿Í ¼Ò¹®ÀÚ°£ÀÇ Å©±â±³Á¤À» À§ÇÑ ¿ëµµ
|
À§ÀÇ µÎ°³ÀÇ Á¤ÀÇ´Â º¯È¯ÇÒ ¿µ¹®ÀÌ ¼Ò¹®ÀÚÀÎÁö¸¦ üũÇϱâ À§ÇÑ ¿ëµµ·Î »ç¿ëÇÑ´Ù.
ASCII(12) Å×ÀÌºí¿¡¼ ¹®ÀÚ 'a'¿Í 'z'°¡ ¿¬¼ÓÀûÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù´Â °Í¿¡ Âø¾ÈÇÑ
ÄÚµå´Ù. ¸¸¾à¿¡ ¿ì¸®°¡ ¹Þ¾ÆµéÀÎ ¹®ÀÚ°¡ ¼Ò¹®ÀÚ¶ó¸é ´ë¹®ÀÚ·Î º¯°æ½ÃÄÑÁà¾ß
Çϴµ¥, ´ë¹®ÀÚ·Î º¯°æÇϱâ À§Çؼ´Â 'A'¿¡¼ 'a'ÀÇ Â÷ÀÌ ¸¸Å¸¸ ´õÇØÁÖ¸é µÈ´Ù.
´ÙÀ½ÀÇ CÄڵ带 È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù.
#include <stdio.h>
int main()
{
printf("%d\n", 'A' - 'a');
printf("%c\n", 'a' + ('A' - 'a'));
return 0;
}
|
´ÙÀ½ ¶óÀÎÀº ½ºÅÃÀÇ À§Ä¡¸¦ °¡¸®Å°±â À§ÇÑ ¸î°³ÀÇ »ó¼ö¸¦ ¼±¾ðÇϰí ÀÖ´Ù.
ÀÌ´Â ÇÔ¼ö¿¡¼ ÀÎÀÚ¸¦ »ç¿ëÇϱâ À§Çؼ´Â ÇÔ¼ö È£ÃâÀü ½ºÅÿ¡ ÀÎÀÚ¸¦ ¹Ð¾î ³Ö´Âµ¥,
ÇÔ¼ö³»¿¡¼´Â ÀÌ ½ºÅÃÀÇ À§Ä¡¸¦ ÀÌ¿ëÇØ¼ ÀÎÀÚÀÇ °ªÀ» ¾ò¾î¿Ã ¼ö Àֱ⠶§¹®ÀÌ´Ù.
Çϱ⠶§¹®ÀÌ´Ù. ÀÌµé »ó¼ö´Â Á¢µÎ»ç¸¦ ST·Î Çϰí Àִµ¥, ¸®ÅÏ ÁÖ¼Ò´Â 4,
¹öÆÛÀÇ ±æÀÌ´Â 8, ±×¸®°í ¹öÆÛÀÇ ÁÖ¼Ò´Â 12·Î °áÁ¤Çß´Ù. ÀÌ·¸°Ô Á¤ÀÇÇØ ³õÀº
½ºÅÃÁÖ¼ÒÀÇ »ç¿ë¿ëµµ´Â convert_to_upper: À» º¸¸é Á»´õ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ»
°ÍÀÌ´Ù.
movl ST_BUFFER(%ebp), %eax
movl ST_BUFFER_LEN(%ebp), %ebx
|
À§ÄÚµå´Â ÇÔ¼öÀÇ ÀÎÀÚÀÇ °ªÀ» ½ºÅÿ¡¼ ÀоîµéÀÌ´Â ÀÏÀ» ÇÑ´Ù. ±×´ÙÀ½ %edi¿¡ 0À»
º¹»çÇÑ´Ù. %edi´Â ¹öÆÛÀÇ À§Ä¡¸¦ °¡¸®Å°´Â ÀÌÅÍ·¹ÀÌÅͿ뵵·Î »ç¿ëµÈ´Ù.
¹öÆÛÀÇ À§Ä¡´Â %eax + %edi ·Î °è»êÇÑ´Ù(À̸¦Å×¸é ¹è¿¿¡¼ ÷ÀÚ¸¦ Áõ°¡½ÃÄѼ
À§Ä¡¸¦ °¡Á®¿À´Â ¹æ½ÄÀÌ´Ù)
¸¸¾à¿¡ %ebx Áï ¹öÆÛ¿¡ ÀÖ´Â µ¥ÀÌÅÍÀÇ ±æÀ̰¡ 0À̶ó¸é ·çÇÁ¸¦ Á¾·á½ÃŲ´Ù.
cmpl $0, %ebx
je end_convert_loop
|
±×·¸Áö ¾Ê°í µ¥ÀÌÅÍÀÇ ±æÀ̰¡ 0º¸´Ù Å©´Ù¸é convert_loop:¸¦ µ¹¸é¼ ¹®ÀÚ º¯È¯
ÀÛ¾÷À» ¼öÇàÇÑ´Ù.
movb (%eax, %edi, 1), %cl
cmpb $LOWERCASE_A, %cl
jl next_byte
cmpb $LOWERCASE_Z, %cl
jg next_byte
|
¿©±â¿¡´Â movb, cmpb ¸í·ÉÀÌ »ç¿ëµÇ°íÀÖ´Ù. µÚ¿¡ b°¡ ºÙ¾ú´Âµ¥, ÀÌ´Â ¹ÙÀÌÆ®
´ÜÀ§·Î ¿¬»êÀ» ½Ç½ÃÇ϶ó´Â ¶æÀÌ µÇ°Ú´Ù. %eax·Î ºÎÅÍ %edi ¸¸Å À̵¿ÇÑÈÄ
1¹ÙÀÌÆ®¸¦ %cl·Î º¹»çÇÑ´Ù. ±×ÈÄ %clÀÌ ¼Ò¹®ÀÚ¸é ´ë¹®ÀÚ·Î º¯°æÇÏ°Ô µÈ´Ù.
ÀÌ·¸°Ô ÇØ¼ ¹®ÀÚº¯°æ°ú °ü·ÃµÈ ÄÚµå´Â ¸ðµÎ ÀÌÇØÇÏ°Ô µÇ¾ú´Ù. ÀÌÁ¦ ³²Àº °ÍÀº
ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÌ°í ¾²´Â ºÎºÐÀÌ´Ù. À̺κÐÀ» ´Ù·ç±â À§Çؼ´Â
UNIXÀÇ open() ½Ã½ºÅÛÄÝÀ» ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ¾Ë¾Æ¾ß ÇÑ´Ù. ´ÙÀ½Àº open()
½Ã½ºÅÛÄÝÀ» »ç¿ëÇϱâ À§ÇÑ ½Ã½ºÅÛ ÄݹøÈ£¿Í ÀÎÀÚ¸¦ À§ÇÑ ·¹Áö½ºÅ͵é ÀÌ´Ù.
%eax ´Â ½Ã½ºÅÛ ÄÝ ¹øÈ£¸¦ ÀúÀåÇÑ´Ù. openÀÇ ½Ã½ºÅÛ ÄݹøÈ£´Â 5ÀÌ´Ù.
%ebx ¿¡´Â ¿°íÀÚ ÇÏ´Â ÆÄÀÏÀÇ À̸§ÀÌ µé¾î°£´Ù. ÆÄÀÏÀ̸§Àº ¹Ýµå½Ã
³¡ÀÌ null·Î ³¡³ª´Â ¹®ÀÚ¿À̾î¾ß ÇÑ´Ù.
%ecx ¿¡´Â ÆÄÀÏÀ» ¿¶§ »ç¿ëÇÒ ¿É¼ÇÀÌ µé¾î°£´Ù. Àбâ Àü¿ë, ¾²±âÀü¿ë,
Àбâ/¾²±âÁß ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì ÆÄÀÏÀ»
»ý¼ºÇÒ°ÍÀÎÁö, Á¸ÀçÇÒ °æ¿ì¿¡´Â Á¸ÀçÇÏ´Â ÆÄÀÏÀ» ¿°ÇÁö ¾Æ´Ï¸é
¿¡·¯¸¦ ¸®ÅÏÇÒ °ÇÁö µîµµ °áÁ¤ÇÒ ¼ö ÀÖ´Ù.
%edx ´Â ÆÄÀÏÀÇ ±ÇÇÑÀ» ¼³Á¤Çϱâ À§ÇØ »ç¿ëÇÑ´Ù. ¿©±â¿¡´Â ÀϹÝÀûÀÎ
À¯´Ð½º ±ÇÇÑÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÀÌ ½Ã½ºÅÛ ÄÝÀÌ ½ÇÇà ÈÄ, ¿ì¸®´Â Àбâ Àü¿ëÀÇ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ
ÆÄÀÏ ÁöÁ¤ÀÚ´Â %eax¸¦ ÅëÇØ¼ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
±×·³ ÀÌÁ¦ ÆÄÀÏÀ» ¿¾î¾ß ÇҰǵ¥, ÀÌ ÇÁ·Î±×·¥ÀÇ °æ¿ì ¿¾î¾ßµÉ ÆÄÀÏ À̸§À»
ÇÁ·Î±×·¥ ½ÇÇàÀÎÀÚ·Î ³Ñ°Ü ¹Þ°í ÀÖ´Ù. ´ÙÇེ·´°Ôµµ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀÎÀÚ´Â
½±°Ô ÀоîµéÀÏ ¼ö ÀÖ´Â À§Ä¡¿¡ null-terminate 󸮱îÁö ¸¶Ä£ ±ò²ûÇÑ »óÅ·Î
ÀúÀåµÇ¾î ÀÖ´Ù. ¸®´ª½º¿¡¼ ÇÁ·Î±×·¥ÀÌ ½ÇÇàÀÎÀÚÀÇ ÀúÀåµÈ À§Ä¡¸¦ °¡¸®Å°´Â
Æ÷ÀÎÅÍ´Â ½ºÅÿ¡ ÀúÀåÀÌ µÈ´Ù. ÀÎÀÚÀÇ ¼ö°¡ ÀúÀåµÈ Æ÷ÀÎÅÍÀÇ À§Ä¡´Â 8(%esp)¿¡
ÇÁ·Î±×·¥ÀÇ À§Ä¡´Â 12(%esp) ±×¸®°í ½ÇÁ¦ ÀÎÀÚ´Â 16(%esp)¿¡ ÀúÀåµÈ´Ù.
C ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ °æ¿ì¿¡´Â argv ¹è¿ °ªÀ» ÅëÇØ¼ ¾ò¾î¿À°Ô µÈ´Ù.
¿ì¸®ÀÇ Ã¹¹øÂ° ÇÁ·Î±×·¥¿¡¼ ÃÖ±ÙÀÇ ½ºÅà À§Ä¡´Â %ebp¿¡ ÀúÀåÇϵµ·Ï Çß´Ù. ±×¸®°í
ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ ½ºÅðø°£À» ÇÒ´çÇϰí ÀÖ´Ù. ³ªÁß¿¡ ¿©±â¿¡
¿¸°ÆÄÀÏ ÁöÁ¤ÀÚ°¡ µé¾î°¡°Ô µÈ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ¿ì¼± ù¹øÂ° ½ÇÇàÀÎÀÚ¸¦ ¾ò¾î¿Â´Ù. ÀÌ ½ÇÇàÀÎÀÚ´Â ¿ì¸®°¡ ÀоîµéÀ̱â
À§ÇÑ ¿øº» ÆÄÀÏÀÇ À̸§À̵ȴÙ. ¿øº» ÆÄÀÏÀÇ °æ¿ì¿¡´Â ´ÜÁö Àб⸸ ÇÏ¸é µÇ¹Ç·Î
Àбâ Àü¿ëÀ¸·Î ¿¾ú´Ù. ÆÄÀÏÀÇ ±ÇÇÑÀº $0666·Î %edx¸¦ ¸¦ ÅëÇØ¼ ³Ñ°å´Ù. ±× ÈÄ
%eax¿¡ ½Ã½ºÅÛÄÝÀÇ ¹øÈ£¸¦ ÀúÀåÇÏ°í ½Ã½ºÅÛÄÝÀ» ½ÇÇàÇÑ´Ù. ½ÇÇàÀÌ ¼º°øÀûÀ¸·Î
³¡³ª°Ô µÇ¸é, ¿ì¸®´Â ½ºÅÿ¡ ÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚ¸¦ ÀÐ¾î ¿Ã ¼ö ÀÖ°Ô µÈ´Ù.
Áö±Ý±îÁö¿Í °°Àº ¹æ¹ýÀ¸·Î º¹»çµÉ ÆÄÀÏ À̸§À» ¾²±â Àü¿ëÀ¸·Î ¿¬´Ù.
ÀÌÁ¦ ÆÄÀÏÀ» Àаí/¾²´Â ÁÖ¿ä ºÎºÐ¿¡ ´ëÇØ¼ ¾Ë¾Æº¸ÀÚ. ¿ì¸®´Â ÀÔ·ÂµÈ ÆÄÀÏ·Î ºÎÅÍ
°íÁ¤µÈ Å©±âÀÇ µ¥ÀÌÅ͸¦ Àоî¿À°í, À̰ÍÀ» ´ë/¼Ò¹®ÀÚ º¯È¯ ÇÔ¼ö¿¡ ³Ñ±ä ÈÄ,
±× °á°ú °ªÀ» Ãâ·Â ÆÄÀÏ¿¡ ¾²°Ô µÈ´Ù. ´ë/¼Ò¹®ÀÚ º¯È¯Àº ¹®ÀÚÇϳªÇϳª¸¦ Â÷·Ê´ë·Î
°Ë»çÇØ¼ º¯È¯ÇÏ°Ô µÈ´Ù.
µ¥ÀÌÅ͸¦ Àбâ À§Çؼ ¿ì¸®´Â read ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇϰí ÀÖ´Ù. ÀÌ ½Ã½ºÅÛ ÄÝÀº
ÆÄÀÏ ÁöÁ¤ÀÚ·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àоîµé¿©¼ ¹öÆÛ¿¡ ÁöÁ¤µÈ Å©±â¸¸Å º¹»çÇÑ´Ù.
ÀÌ ½Ã½ºÅÛÄÝÀº ½ÇÇàÀ» ¸¶Ä£ÈÄ ÀоîµéÀÎ µ¥ÀÌÅÍÀÇ Å©±â¸¦ ¸®ÅÏÇÑ´Ù. ¸¸¾à
ÆÄÀÏÀÇ ³¡À» ¸¸³ª°Ô µÇ¸é 0À» ¸®ÅÏÇÑ´Ù.
Àбâ Äڵ念¿ªÀº %eaxÀÇ °ªÀÌ ÆÄÀÏÀÇ ³¡(0)À» °¡¸®Å°°Ô µÇ¸é ºüÁ®³ª¿À°Ô µÈ´Ù.
¸¸¾à ÆÄÀÏÀÇ ³¡ÀÌ ¾Æ´Ï¶ó¸é ÀоîµéÀÎ µ¥ÀÌÅ͸¦ convert_to_upperÇÔ¼ö·Î ³Ñ°Ü¼
¹®ÀÚ¸¦ º¯È¯ÇÏ°Ô µÈ´Ù.
¸¶Áö¸·À¸·Î write ½Ã½ºÅÛÄÝÀ» ÀÌ¿ëÇØ¼ º¯È¯µÈ ¹®ÀÚµ¥ÀÌÅ͸¦ º¹»çÇÒ ÆÄÀÏ¿¡ ¾²°Ô
µÈ´Ù. ¸ðµç µ¥ÀÌÅÍÀÇ Ã³¸®°¡ ´Ù ³¡³ª°í ·çÇÁ¸¦ ¹þ¾î³ª¸é ¸¶Áö¸·À¸·Î ¿¸°
ÆÄÀÏ ÁöÁ¤ÀÚµéÀ» ¸ðµÎ ´Ý¾ÆÁØ´Ù. ÆÄÀÏÀ» ´Ý±â À§Çؼ´Â close½Ã½ºÅÛÄÝ È£ÃâÇÑ´Ù.
ÀÌ ½Ã½ºÅÛ ÄÝÀº %ebx¿¡ ´ÝÀ» ÆÄÀÏÁöÁ¤ÀÚ¸¦ ³Ñ±ä´ÙÀ½ È£ÃâÇÏ¸é µÈ´Ù.
5.5. º¹½À ¹öÆÛ¶õ ¹«¾ùÀΰ¡ ?
Ç¥ÁØ ÆÄÀÏ ÁöÁ¤ÀÚ´Â ¹«¾ùÀ̸ç, ¾îµð¿¡ »ç¿ëÇÒ ¼ö Àִ°¡ ?
.data ¼½¼Ç°ú .bss ¼½¼ÇÀÇ Â÷ÀÌ´Â ¹«¾ùÀΰ¡ .
ÆÄÀÏ·Î ºÎÅÍ ÀÐ°í ¾²±â À§Çؼ »ç¿ëÇÏ´Â ½Ã½ºÅÛÄÝ¿¡ ´ëÇØ¼ ¼³¸íÇϽÿÀ.
6. ·¹ÄÚµå ´ÜÀ§ÀÇ Àбâ¿Í ¾²±â 5절ÀåÀÇ ÆÄÀÏ´Ù·ç±â´Â ÆÄÀÏÀ» ´Ù·ç´Â ±âº»ÀûÀÎ ±ÔÄ¢À»
¾Ë·ÁÁÖ¾ú´Ù´Â Á¡¿¡¼´Â ¾µ¸¸ÇÑ ³»¿ëÀ̱ä ÇÏÁö¸¸, ½ÇÁ¦ ¾ÖÇø®ÄÉÀ̼ǿ¡
Àû¿ë½ÃŰ±â¿¡´Â ºÎÁ·ÇÑ Á¡ÀÌ ÀÖ´Ù. 5ÀåÀÇ ¿¹´Â ±×³É ¹®ÀÚ¿À» ´Ü¼øÇÏ°Ô ÀоîµéÀÌ´Â
Á¤µµ¿´Áö¸¸, ´ëºÎºÐÀÇ ÀÀ¿ë ¾ÖÇø®ÄÉÀ̼ÇÀº ÆÄÀÏ¿¡ ±¸Á¶ÈµÈ µ¥ÀÌÅ͸¦ »ç¿ëÇϰÔ
µÈ´Ù. º¸Åë C¾ð¾î¿¡¼ µ¥ÀÌÅ͸¦ ´Ù·ç±â À§Çؼ ÈçÈ÷ º¼ ¼ö ÀÖ´Â ±¸Á¶Ã¼ µ¥ÀÌÅ͸¦
¿¬»óÇÏ¸é µÉ°ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ±¸Á¶ÈµÈ µ¥ÀÌÅÍ´Â ÄÄÇ»Åͻ󿡼 È¿À²ÀûÀ¸·Î ´Ù·ê ¼ö ÀÖ´Ù.
ÀÌµé ±¸Á¶ÈµÈ µ¥ÀÌÅÍ´Â µ¥ÀÌÅ͸¦ ·¹ÄÚµå ´ÜÀ§·Î ÀúÀåÇÏ°Ô µÇ´Âµ¥ °¢°¢ÀÇ
·¹ÄÚµå´Â ¿©·¯°³ÀÇ Çʵå·Î ±¸¼ºÀ̵ȴÙ. ÇÁ·Î±×·¡¸Ó´Â °¢ ·¹ÄÚµåÀÇ Å©±â¸¦ ½±°Ô ¾ò¾î
¿Ã ¼ö ÀÖÀ¸¹Ç·Î, ¿øÇÏ´Â µ¥ÀÌÅÍ¿¡ ºü¸£°Ô Á¢±ÙÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
ÀÌ·¯ÇÑ ·¹ÄÚµå´Â µÎ°¡Áö Á¤µµ¸¦ »ý°¢ÇÒ ¼ö ÀÖÀ» °Í °°´Ù. Çϳª´Â ·¹ÄÚµåÀÇ
°¢ÇʵåÀÇ Å©±â°¡ °íÁ¤µÇ¾î ÀÖ´Â °íÁ¤±æÀ̸¦ °¡Áø ·¹ÄÚµåÀ̰í, ¶ÇÇϳª´Â ÇʵåÀÇ
Å©±â°¡ º¯µ¿µÇ´Â º¯µ¿·¹ÄÚµåÀÌ´Ù. °íÁ¤ ·¹Äڵ带 ´Ù·ç´Â ÇÁ·Î±×·¥Àº ´ëüÀûÀ¸·Î
°¡º±°í ºü¸£°Ô ÀÛµ¿ÇÒ ¼ö ÀÖÀ» »Ó¾Æ´Ï¶ó ÄÚµùÇϱ⵵ ½±´Ù¶ó´Â Á¡ ¶§¹®¿¡
¾ÆÁÖ º¹ÀâÇÏÁö ¾ÊÀº ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϱâ À§ÇÑ ¹æ¹ýÀ¸·Î ³Î¸® »ç¿ëµÇ°í ÀÖ´Ù.
¹Ý¸é º¯µ¿±æÀÌ ·¹ÄÚµåÀÇ °æ¿ì¿¡´Â ´Ù¾çÇÑ µ¥ÀÌÅ͸¦ ´Ù·ç¾î¾ß ÇÏ´Â DB ÇÁ·Î±×·¥°ú
°°Àº Á»´õ °·«ÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé±â À§Çؼ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ±×¸¸Å
ÇÁ·Î±×·¥ ÀÛ¼º½Ã »ý°¢ÇÒ ¿ä¼Ò°¡ ¸¹¾Æ Áú °ÍÀÌ´Ù.
À̹ø Àå¿¡¼´Â °íÁ¤±æÀ̸¦ °¡Áø ·¹Äڵ带 ´Ù·ç´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ °ÍÀÌ´Ù.
¿ì¸®°¡ ´Ù·ç´Â ·¹ÄÚµå´Â °³ÀÎÁ¤º¸¸¦ °¡Áö°Ô µÉ °ÍÀ̸ç, À̸¦ À§Çؼ
´ÙÀ½°ú °°Àº ÇʵåµéÀ» »ç¿ëÇÒ °ÍÀÌ´Ù.
¼º - 8byte
À̸§ - 16byte
ÁÖ¼Ò - 240byte
³ªÀÌ - 4byte
À§ÀÇ ÇʵåÁß ³ªÀ̸¦ Á¦¿ÜÇÑ ¸ðµç Çʵå´Â ¹®ÀÚ¿ µ¥ÀÌÅͰ¡ µÈ´Ù. ³ªÀÌ´Â ¼ýÀÚ
À̹ǷΠ4byteÁ¤µµ¸¦ ÇÒ´çÇÏ´Â °ÍÀ¸·Î ÃæºÐ ÇÒ °ÍÀÌ´Ù. (¹°·Ð Àΰ£ÀÇ ÃÖ´ë ¼ö¸íÀÌ
120¼¼ Á¤µµ¶ó°í º¼ ¼ö ÀÖÀ¸¹Ç·Î 1byte¸¸ ÇÒ´çÇÏ´Â Á¤µµ·Îµµ ÃæºÐÇÒ °ÍÀÌ´Ù.
±×·¯³ª ¿ì¼±Àº °£´ÜÇÏ°Ô 4byte·Î ÇϰڴÙ.)
Áö±Ý±îÁö ¿ì¸®°¡ ÀÛ¼ºÇÑ ¾î¼Àºí¸® ¿¹ÀçµéÀº ´ÜÁö ÇϳªÀÇ ÇÁ·Î±×·¥ ÆÄÀÏ·Î ÀÌ·ç¾îÁ®
ÀÖ¾úÀ¸³ª ¿©±â¿¡¼´Â ¿©·¯°³ÀÇ ÆÄÀÏ·Î ºÐ¸®Çؼ ÀÛ¼ºÇϵµ·Ï ÇÒ°ÍÀÌ´Ù. C¿¡¼ ÈçÈ÷ ¸»ÇÏ´Â
¸ðµâº° ºÐÇÒ ÄÄÆÄÀÏÀ» À§ÇÔÀε¥, ÀÌ·¸°Ô ÇÏ¸é ±â´Éº°·Î ¼Ò½ºÄÚµå ÆÄÀÏÀ» À¯ÁöÇÒ ¼ö
ÀÖÀ¸¹Ç·Î ÇÁ·Î±×·¥ÀÇ À¯Áö/º¸¼ö°¡ ¼ö¿ùÇØ Áö´Â ÀåÁ¡À» °¡Áø´Ù. ÀÌ·¸°Ô ¸ðµâº°·Î ÇÁ·Î±×·¥À»
³ª´©¾î¼ À¯ÁöÇÒ°æ¿ì ÇÁ·Î±×·¥ Àü¿ª¿¡ °ÉÃļ »ç¿ëµÇ´Â °øÅëµÈ °ªµéÀ» À¯ÁöÇÒ Çʿ䰡
ÀÖ´Ù. C¿¡¼´Â includeÆÄÀÏÀ» ÅëÇØ¼ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϴµ¥, ¾î¼Àºí¸®¿ª½Ã ºñ½ÁÇÑ
¹æ¹ýÀ» ÀÌ¿ëÇØ¼ ¼±¾ð°ú Á¤ÀǸ¦ ºÐ¸®Çس¾ ¼ö ÀÖ´Ù.
´ÙÀ½Àº ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇÒ À¯ÀúÁ¤º¸ ±¸Á¶Ã¼¸¦ À§ÇÑ ¼±¾ðÆÄÀÏ·Î record-def.s·Î
ÀúÀåÇϵµ·Ï ÇϰڴÙ.
.equ RECORD_FIRSTNAME, 0
.equ RECORD_LASTNAME, 8
.equ RECORD_ADDRESS, 24
.equ RECORD_AGE, 264
.equ RECORD_SIZE, 268
|
ÀÌ¿Í ÇÔ²² ÇÁ·Î±×·¥ Àü¿ªÀûÀ¸·Î »ç¿ëµÉ °¢Á¾ »ó¼ö¸¦ Á¤ÀÇÇß´Ù. ÀÌµé »ó¼ö´Â
½Ã½ºÅÛ ÄÝ ¹øÈ£¿Í Ç¥ÁØÀÔÃâ·Â°ú °°Àº °ªµéÀ» ¸í½ÃÇϵµ·Ï ÇÒ°ÍÀ̸ç, linux.s¿¡
ÀúÀåÇϵµ·Ï ÇϰڴÙ.
#System Call Numbers
.equ SYS_EXIT, 1
.equ SYS_READ, 3
.equ SYS_WRITE, 4
.equ SYS_OPEN, 5
.equ SYS_CLOSE, 6
.equ SYS_BRK, 45
#System Call Interrupt Number
.equ LINUX_SYSCALL, 0x80 #Standard File Descriptors
.equ STDIN, 0
.equ STDOUT, 1
.equ STDERR, 2
#Common Status Codes
.equ END_OF_FILE, 0
|
ÀÌÁ¦ ¿ì¸®´Â Á¤ÀÇµÈ ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇØ¼ 3°³ÀÇ ÇÁ·Î±×·¥À» ¸¸µéµµ·Ï ÇϰڴÙ. ù¹øÂ°
ÇÁ·Î±×·¥Àº ±¸Á¶Ã¼¸¦ ·¹ÄÚµå·ÎÇØ¼ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. µÎ¹øÂ° ÇÁ·Î±×·¥Àº
ÆÄÀÏÀÇ ·¹ÄÚµå ³»¿ëÀ» Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥À̸ç, ¼¼¹øÂ° ÇÁ·Î±×·¥Àº ¸ðµç ·¹ÄÚµåÀÇ
³ªÀ̸¦ ´õÇØ¼ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù.
À̵é ÇÁ·Î±×·¥Àº ±¸Á¶Ã¼¿Í ´õºÒ¾î ÇÁ·Î±×·¥À» °¡·ÎÁú·¯¼ »ç¿ëµÇ´Â »ó¼ö¸¦ Á¤ÀÇÇϰí
ÀÖ´Â linux.s¸¦ Æ÷ÇÔÇÏ°Ô µÉ °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ÀÏÀ» ÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé±â À§Çؼ ¿ì¸®´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ °ÍÀÌ´Ù. ÇÔ¼ö¸¦
ÀÛ¼ºÇϱâ À§Çؼ ÇÔ¼ö°¡ ¾î¶°ÇÑ ÀÎÀÚ¸¦ ÇÊ¿ä·Î ÇÒÁö¸¦ »ý°¢ÇØ º¸µµ·Ï ÇÏÀÚ.
´ÙÀ½Àº ÆÄÀÏ ÁöÁ¤ÀÚ·Î ºÎÅÍ Àбâ À§ÇÑ ÇÔ¼ö´Ù.
# ÇÏ´ÂÀÏ : ÀÌ ÇÔ¼ö´Â ÆÄÀÏ ÁöÁ¤ÀÚ·Î ºÎÅÍ ·¹Äڵ带 ÀÐ¾î µéÀδÙ.
# ÀÔ ·Â : ÆÄÀÏ ÁöÁ¤ÀÚ¿Í ¹öÆÛ
# Ãâ ·Â : ÇÔ¼ö´Â ¹öÆÛ¿¡ ·¹ÄÚµåÀÇ ³»¿ëÀ» ¾²°í »óŰªÀ» ¸®ÅÏÇÑ´Ù.
# »ó¼ö¸¦ Á¤ÀÇÇÑ ÆÄÀϵéÀ» Æ÷ÇÔ ½ÃŲ´Ù.
.include "record-def.s"
.include "linux.s"
# ½ºÅà Áö¿ª º¯¼ö
.equ ST_READ_BUFFER, 8
.equ ST_FILEDES, 12
.section .text
.globl read_record
.type read_record, @function
read_record:
pushl %ebp
movl %esp, %ebp
push %ebx
movl ST_FILEDES(%ebp), %ebx
movl ST_READ_BUFFER(%ebp), %ecx
movl $RECORD_SIZE, %edx
movl $SYS_READ, %eax
int $LINUX_SYSCALL
# %eax´Â ¸®ÅÏ °ªÀ¸·Î, ÇÔ¼öÀÇ ½ÇÇà °á°ú¸¦ È£ÃâÇÑ ÇÁ·Î±×·¥¿¡°Ô
# µÇµ¹·ÁÁÖ±â À§Çؼ »ç¿ëÇÑ´Ù.
popl %ebx
movl %ebp, %esp
popl %ebp
ret
|
ÀÌ ÇÔ¼ö´Â ¸Å¿ì °£´ÜÇÏ´Ù. ÀÎÀÚ·Î ÁÖ¾îÁø ÆÄÀÏ ÁöÁ¤ÀÚ·Î ºÎÅÍ ·¹ÄÚµå Å©±â(RECORD_SIZE)
¸¸ÅÀÇ µ¥ÀÌÅ͸¦ ÀÐ¾î µéÀ̰í, ¹öÆÛ¿¡ ÀúÀåÇÏ´Â ÀÏÀ» ÇÑ´Ù.
¹öÆÛÀÇ ³»¿ëÀ» ·¹Äڵ忡 ¾²´Â ÇÔ¼ö ¿ª½Ã °£´ÜÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
# ÇÏ´ÂÀÏ : ÆÄÀÏ ÁöÁ¤ÀÚ¿¡ ·¹Äڵ带 ¾´´Ù.
# ÀÔ ·Â : ÆÄÀÏÁöÁ¤ÀÚ¿Í ¹öÆÛ
# Ãâ ·Â : ÇÔ¼öÀÇ ½ÇÇà °á°ú
.include "linux.s"
.include "record-def.s"
# ½ºÅà ·ÎÄà º¯¼ö
.equ ST_WRITE_BUFFER, 8
.equ ST_FILEDES, 12
.section .text
.globl write_record
.type write_record, @fundtion
write_record:
pushl %ebp
movl %esp, %ebp
pushl %ebx
movl $SYS_WRITE, %eax
movl ST_FILEDES(%ebp), %ebx
movl ST_WRITE_BUFFER(%ebp), %eax
movl $RECORD_SIZE, %edx
int $LINUX_SYSCALL
# %eax´Â ¸®ÅÏ °ªÀ¸·Î È£ÃâÇÑ ÇÁ·Î±×·¥¿¡°Ô ½ÇÇà °á°ú°ªÀ»
# ³Ñ°ÜÁØ´Ù.
popl %ebx
movl %ebp, %esp
popl %ebp
ret
|
À̰ɷΠ±âº»ÀûÀÎ ÇÔ¼ö¸¦ ¸¸µé¾úÀ¸¹Ç·Î ÀÌÁ¦ º»°ÝÀûÀ¸·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ½Ã°£ÀÌ´Ù.
6.1. ·¹ÄÚµå ¾²±â ÀÌ ÇÁ·Î±×·¥Àº ·¹Äڵ带 ÆÄÀÏ¿¡ ¾²´Â ÇÁ·Î±×·¥Àε¥, °£´ÜÇÏ°Ô ÀÛ¼ºÇϱâ À§Çؼ
·¹ÄÚµåÀÇ ÇÊµå °ªÀº ÇϵåÄÚµù Çϵµ·Ï ÇϰڴÙ.
.include "linux.s"
.include "record-def.s"
.section .data
record1:
.ascii "yun\0"
.rept 4 #padding
.byte 0
.endr
.ascii "dream\0"
.rept 10
.byte 0
.endr
.ascii "Seoul city Chun-dam dong\0"
.rept 215
.byte 0
.endr
.long 25
record2:
.ascii "yun\0"
.rept 4
.byte 0
.endr
.ascii "mung\0"
.rept 11
.byte 0
.endr
.ascii "Seoul city joinc dong\0"
.rept 218
.byte 0
.endr
.long 27
file_name:
.ascii "test.dat\0"
.equ ST_FILE_DESCRIPTOR, -4
.globl _start
_start:
movl %esp, %ebp
subl $4, %esp
movl $SYS_OPEN, %eax
movl $file_name, %ebx
movl $0101, %ecx
movl $0666, %edx
int $LINUX_SYSCALL
movl %eax, ST_FILE_DESCRIPTOR(%ebp)
pushl ST_FILE_DESCRIPTOR(%ebp)
pushl $record1
call write_record
addl $8, %esp
pushl ST_FILE_DESCRIPTOR(%ebp)
pushl $record2
call write_record
addl $8, %esp
movl $SYS_CLOSE, %eax
movl ST_FILE_DESCRIPTOR(%ebp), %ebx
int $LINUX_SYSCALL
movl $SYS_EXIT, %eax
movl $0, %ebx
int $LINUX_SYSCALL
|
ÀÌ ÇÁ·Î±×·¥Àº ¸Å¿ì °£´ÜÇÏ´Ù. ´ÜÁö ¸î°³ÀÇ »ó¼öµéÀÌ »ç¿ëµÇ¾úÀ¸¸ç, .data ¼½¼Ç¿¡
ÀúÀåÇØ¾ßµÉ ·¹Äڵ尡 ÀÖ´Â °Í¿ÜÀÇ ´Ù¸¥ °Íµé(Àбâ/¾²±â)´Â ÀÌ¹Ì ´Ù·é ÀûÀÌ ÀÖ´Â
³»¿ëµéÀÌ´Ù.
ÇÁ·Î±×·¥ÀÇ °¡Àå óÀ½¿¡´Â »ó¼ö°¡ ¼±¾ðµÈ ÆÄÀÏÀ» Æ÷ÇÔ(include)½ÃŰ´Â
Äڵ尡 µé¾î°¬´Ù.
.include "linux.s"
.include "record-def.s"
|
C¾ð¾î¸¦ ÇØºÃ´Ù¸é ±»ÀÌ ¼³¸íÇÒ ÇÊ¿ä ¾ø´Â ÄÚµå·Î, ÇÁ·Î±×·¥ Àü¿ªÀûÀ¸·Î »ç¿ëµÇ¾î¾ß ÇÒ
»ó¼ö³ª ÇÔ¼öµéÀ» º°µµÀÇ ÆÄÀÏ¿¡ ¼±¾ðÇØ ³õ°í À̸¦ »ç¿ëÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù.
´ÙÀ½ ·¹ÄÚµåÀÇ °ªÀ» Á¤ÀÇ ÇÏ´Â ºÎºÐÀÌ ³ª¿À´Âµ¥ ¿©±â¿¡¼ .rept¶ó´Â
»õ·Î¿î Áö½Ã¾î¸¦ ¸¸³ª°Ô µÈ´Ù. ÀÌ Áö½Ã¾î´Â .endr Áö½Ã¾î¿Í ÇÔ²² »ç¿ëµÇ´Âµ¥,
.rept¿¡¼ ÁöÁ¤µÈ ¼ýÀÚ ¸¸Å Áß°£¿¡ ¿À´Â °ªÀ¸·Î ä¿ì´Â ÀÏÀ» ÇÑ´Ù. À§ Äڵ忡¼´Â
¹®ÀÚ¿ ÇʵåÀÇ ³ª¸ÓÁö ºÎºÐÀ» '\0'À¸·Î ä¿ì±â À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇϰí ÀÖ´Ù.
C¿¡¼ ¸Þ¸ð¸® ¿µ¿ªÀ» ƯÁ¤ °ªÀ¸·Î ä¿ì±â À§Çؼ »ç¿ëÇÏ´Â memset(2)°ú ºñ½ÁÇÑ ¿ëµµ·Î
»ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌÁ¦ ÄÄÆÄÀϰú ¸µÅ© °úÁ¤À» °ÅÃļ ½ÇÇà ÆÄÀÏÀ» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.
# as write-records.s -o write-records.o
# as write.s -o write.o
# ld write-records.o write.o -o write-records
|
¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥Àº 2°³ÀÇ ÆÄÀÏ·Î ³ª´µ¾îÁ® ÀÖ´Ù. ±×·¯¹Ç·Î À̵éÀ» Çϳª·Î
¹¾îÁÖ´Â(link)°úÁ¤ÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ¸µÅ©´Â ld linker¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. ¸¸µé¾îÁø
½ÇÇàÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ½ÇÇà ½Ãų ¼ö ÀÖ´Ù.
½ÇÇàµÇ°í ³ª¸é test.dat¶ó´Â ÆÄÀÏÀÌ ¸¸µé¾î Áø´Ù. ÀÌ ÆÄÀÏÀ» vi¿¡µðÅÍ·Î È®ÀÌÇØ º¸¸é
ÀÏ¹Ý ÅØ½ºÆ® ÆÄÀϰú´Â Á» ´Ù¸£°Ô Ãâ·ÂµÉ °ÍÀÌ´Ù. ÀÌÀ¯´Â NULL°ú °°Àº Ãâ·ÂµÉ ¼ö ¾ø´Â
¹®ÀÚµéÀÌ Æ÷ÇԵǾî Àֱ⠶§¹®ÀÌ´Ù. ¾î¶µç ·¹Äڵ带 ¼º°øÀûÀ¸·Î ½èÀ¸´Ï, ÀÌÁ¦
·¹ÄÚµå·Î ºÎÅÍ ÀоîµéÀÌ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.
6.2. ·¹ÄÚµå Àб⠿©±â¿¡¼´Â ÀúÀåµÈ ·¹ÄÚµå·Î ºÎÅÍ À̸§, ÁÖ¼Ò, ³ªÀ̸¦ Àоî¿Í¼ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥À»
¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.
¿ì¸®°¡ Ãâ·ÂÇϰíÀÚ ÇÏ´Â ·¹ÄÚµåÀÇ ÇʵåÁß À̸§°ú ÁÖ¼Ò´Â °íÁ¤µÈ ±æÀ̸¦ °¡Áö°í ÀÖÁö
¾Ê´Ù. ±×·¯¹Ç·Î ¸î°³ÀÇ ¹®ÀÚ¸¦ ½á¾ßÇÏ´ÂÁö¸¦ °è¼öÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ´ÙÇàÈ÷µµ ¿ì¸®´Â
·¹Äڵ带 ÀûÀ» ¶§, ÇʵåÀÇ ³¡À» '\0'·Î Æ÷¸ËÇßÀ½À¸·Î, '\0'À» ¸¸³¯¶§±îÁö ÀоîµéÀÎ
¹®ÀÚ¸¸ °è¼öÇÏ¸é µÈ´Ù. °¡Á¤ ¸ÕÀú ¹®ÀÚÀÇ °¹¼ö¸¦ °è¼öÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î
º¸µµ·Ï ÇϰڴÙ. ÀÌ ÇÁ·Î±×·¥ÀÇ À̸§Àº count-chars.s·Î ÇϰڴÙ.
# ¸ñ Àû : null byte¸¦ ¸¸³¯ ¶§±îÁö ¹®ÀÚÀÇ °¹¼ö¸¦ °Ë»çÇÑ´Ù.
# ÀÔ ·Â : ¹®ÀÚ¿ÀÇ ÁÖ¼Ò
# Ãâ ·Â : ¹®ÀÚ¿ÀÇ °¹¼ö¸¦ %eax·Î
# ÇÁ·Î¼¼½º :
# %ecx - ¹®ÀÚ Ä«¿îÆ®
# %al - ÇöÀç ¹®ÀÚ
# %edx - ÇöÀç ¹®ÀÚ ÁÖ¼Ò
.include "linux.s"
.include "record-def.s"
.type count_chars, @function
.globl count_chars
# ù¹øÂ° ÀÎÀÚ°¡ µé¾î ÀÖ´Â ½ºÅÃ
.equ ST_STRING_START_ADDRESS, 8
count_chars:
pushl %ebp
movl %esp, %ebp
# 0ºÎÅÍ Ä«¿îÆ®¸¦ ½ÃÀÛÇÑ´Ù.
movl $0, %ecx
movl ST_STRING_START_ADDRESS(%ebp), %edx
count_loop_begin:
# ÃÖ±Ù ¹®ÀÚ¸¦ °¡Á®¿Â´Ù.
movb (%edx), %al
# nullÀÎÁö °Ë»çÇÑ´Ù.
cmpb $0, %al
# ¸¸¾à nullÀ̶ó¸é ·çÇÁ¸¦ ³¡³½´Ù.
je count_loop_end
# ³ÎÀÌ ¾Æ´Ï¶ó¸é Æ÷ÀÎÅÍ¿Í Ä«¿îÆ®¸¦ 1¾¿ Áõ°¡ ½ÃŲ´Ù.
incl %ecx
incl %edx
# ·çÇÁÀÇ Ã³À½À¸·Î µÇµ¹¾Æ °£´Ù.
jmp count_loop_begin
count_loop_end:
# Ä«¿îÆ® °á°ú¸¦ %eax·Î º¹»çÇÑ´Ù.
movl %ecx, %eax
popl %ebp
ret
|
ÀÌÇØÇϱ⿡ º° ¾î·Á¿î Á¡ÀÌ ¾ø´Â °£´ÜÇÑ ÄÚµå´Ù. ÀÌ ÄÚµå´Â µ¥ÀÌŸ ÁÖ¼Ò·Î ºÎÅÍ
1¹ÙÀÌÆ®¾¿ ÀÐ¾î ³ª°¡¸é¼ +1À» ÇÑ´Ù. ¸¸¾à ÀÐÀº ¹ÙÀÌÆ®°¡ '\0'À̶ó¸é Áö±Ý±îÁö °è¼öÇÑ
¼ö¸¦ ¸®ÅÏÇÑ´Ù.
ÀÌÁ¦ ½ÇÁ¦ ÆÄÀÏ·Î ºÎÅÍ ·¹Äڵ带 ÀоîµéÀÌ´Â Äڵ带 ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.
ÀÌ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº È帧À» °¡Áú °ÍÀÌ´Ù.
ÀÌÁ¦ ¿ì¸®´Â °³Ç๮ÀÚ¸¦ Ãâ·ÂÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé °ÍÀÌ´Ù. À̰ÍÀº
°¢ ÇʵåÀÇ °ªÀ» Ãâ·ÂÇÑ ÈÄ Çʵ带 ±¸ºÐÇØ¼ º¸±â ÁÁ°Ô ¸¸µé±â À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù.
ÇÁ·Î±×·¥ÀÇ À̸§Àº read-records.s·Î ÇϰڴÙ.
.include "linux.s"
.globl write_newline
.type write_newline, @function
.section .data
newline:
.ascii "\n"
.section .text
.equ ST_FILEDES, 8
write_newline:
pushl %ebp
movl %esp, %ebp
movl $SYS_WRITE, %eax
movl ST_FILEDES(%ebp), %ebx
movl $newline, %ecx
movl $1, %edx
int $LINUX_SYSCALL
movl %ebp, %esp
popl %ebp
ret
|
ÀÌÁ¦ ½ÇÁ¦ ·¹ÄÚµå·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àоî¿À´Â ¸ÞÀÎÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù. ÇÁ·Î±×·¥ÀÇ
À̸§Àº read-records.s·Î ÇϰڴÙ.
.include "linux.s"
.include "record-def.s"
.section .data
file_name:
.ascii "test.dat\0"
.section .bss
.lcomm record_buffer, RECORD_SIZE
.section .text
# Main ÇÁ·Î±×·¥
.globl _start
_start:
# ÀԷ°ú Ãâ·ÂÀ» À§ÇÑ ÆÄÀÏÁöÁ¤ÀÚÀÇ ½ºÅÃÀ§Ä¡¸¦
# °è»ê
.equ ST_INPUT_DESCRIPTOR, -4
.equ ST_OUTPUT_DESCRIPTOR, -8
# ½ºÅà Æ÷ÀÎÅ͸¦ %ebp·Î º¹»çÇÑ´Ù.
movl %esp, %ebp
# ÆÄÀÏÁöÁ¤ÀÚ¸¦ À§ÇÑ °ø°£À» ÇÒ´çÇÑ´Ù.
subl $8, %esp
# ÆÄÀÏÀ» ¿¬´Ù.
movl $SYS_OPEN, %eax
movl $file_name, %ebx
movl $0, %ecx # Àбâ Àü¿ëÀ¸·Î ¿¬´Ù.
movl $0666, %edx
int $LINUX_SYSCALL
# ÀÔ·ÂÀ» À§ÇÑ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇÑ´Ù.
movl %eax, ST_INPUT_DESCRIPTOR(%ebp)
# Ç¥ÁØ Ãâ·Â(1)À» À§ÇÑ ÆÄÀÏÁöÁ¤ÀÚ¸¦ ÀúÀåÇÑ´Ù.
movl $STDOUT, ST_OUTPUT_DESCRIPTOR(%ebp)
record_read_loop:
pushl ST_INPUT_DESCRIPTOR(%ebp)
pushl $record_buffer
call read_record
addl $8, %esp
# ÀоîµéÀÎ µ¥ÀÌÅÍÀÇ ±æÀ̰¡
# ·¹ÄÚµå Å©±â¿Í °°ÀºÁö È®ÀÎÇÑ´Ù.
# ·¹ÄÚµå Å©±â¿Í ´Ù¸£´Ù¸é ·çÇÁ¸¦ ¹þ¾î³´Ù.
cmpl $RECORD_SIZE, %eax
jne finished_reading
# ±×·¸Áö ¾Ê´Ù¸é ·¹ÄÚµåÀÇ À̸§À» Ãâ·ÂÇÑ´Ù.
# À̸§À» Ãâ·ÂÇϱâ À§Çؼ´Â ¹®ÀÚ¿ÀÇ Å©±â¸¦
# Àоî¿Í¾ß ÇÑ´Ù.
pushl $RECORD_FIRSTNAME + record_buffer
call count_chars
addl $4, %esp
movl %eax, %edx
movl ST_OUTPUT_DESCRIPTOR(%ebp), %ebx
movl $SYS_WRITE, %eax
movl $3, %ecx
int $LINUX_SYSCALL
ret
pushl ST_OUTPUT_DESCRIPTOR(%ebp)
call write_newline
addl $4, %esp
jmp record_read_loop
finished_reading:
movl $SYS_EXIT, %eax
movl $0, %ebx
int $LINUX_SYSCALL
|
ÀÌÁ¦ Áö±Ý±îÁöÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ°í ¸µÅ©Çؼ ½ÇÇà°¡´ÉÇÑ ÆÄÀÏ·Î ¸¸µé¾î º¸ÀÚ.
# as count-chars.s -o count-chars.o
# as write-newline.s -o write-newline.o
# as read-records.s -o read-records.o
# as read.s -o read.o
# ld read.o read-records.o write-newline.o count-chars.o -o read-records
|
ÇÁ·Î±×·¥Àº ./read-records ·Î ½ÇÇà½Ãų ¼ö ÀÖ´Ù.
6.3. ·¹ÄÚµå ¼öÁ¤ ÀÌ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº Äڵ念¿ªÀ» °¡Áø´Ù.
´ÙÀ½Àº ·¹ÄÚµåÀÇ °ªÀ» ¼öÁ¤Çؼ ´Ù¸¥ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ
À̸§Àº add-year.s·Î ÇϰڴÙ.
.include "linux.s"
.include "record-def.s"
.section .data
input_file_name:
.ascii "test.dat\0"
output_file_name:
.ascii "testout.dat\0"
.section .bss
.lcomm record_buffer, RECORD_SIZE
.equ ST_INPUT_DESCRIPTOR, -4
.equ ST_OUTPUT_DESCRIPTOR, -8
.section .text
.globl _start
_start:
movl %esp, %ebp
subl $8, %esp
movl $SYS_OPEN, %eax
movl $input_file_name, %ebx
movl $0, %ecx
movl $0666, %edx
int $LINUX_SYSCALL
movl %eax, ST_INPUT_DESCRIPTOR(%ebp)
# ¾²±â À§Çؼ ÆÄÀÏ ¿±â
movl $SYS_OPEN, %eax
movl $output_file_name, %ebx
movl $0101, %ecx
movl $0666, %edx
int $LINUX_SYSCALL
movl %eax, ST_OUTPUT_DESCRIPTOR(%ebp)
loop_begin:
pushl ST_INPUT_DESCRIPTOR(%ebp)
pushl $record_buffer
call read_record
addl $8, %esp
# read·Î ºÎÅÍÀÇ ¸®Åϰª°ú ·¹ÄÚµåÅ©±â¸¦ ºñ±³ÇÑ´Ù.
# ¸¸¾à ·¹ÄÚµå Å©±â¿Í °°Áö ¾Ê´Ù¸é ·çÇÁ¸¦ Á¾·áÇÑ´Ù.
cmpl $RECORD_SIZE, %eax
jne loop_end
# ³ªÀ̸¦ Áõ°¡½ÃŲ´Ù.
incl record_buffer + RECORD_AGE
pushl ST_OUTPUT_DESCRIPTOR(%ebp)
push $record_buffer
call write_record
addl $8, %esp
jmp loop_begin
loop_end:
movl $SYS_EXIT, %eax
movl $0, %ebx
int $LINUX_SYSCALL
|
ÄÚµùÀ» ¸¶ÃÆ´Ù¸é ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ½ÇÇàÆÄÀÏÀ» »ý¼ºÇϵµ·Ï ÇÏÀÚ.
# as add-year.s -o add-year.o
# ld add-year.o read.o write.o -o add-year
|
ÀÌ ÇÁ·Î±×·¥À» ./add-year·Î ½ÇÇà½Ãų ¼ö ÀÖ´Ù. ½ÇÇà½ÃŰ°í ³ª¸é testout.dat¶ó´Â
ÆÄÀÏÀÌ »ý¼ºµÈ°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
Áö±Ý±îÁöÀÇ ³»¿ëÀ» ÅëÇØ¼ ¿ì¸®´Â °íÁ¤µÈ ±æÀÌÀÇ ·¹Äڵ带 Á¦¾îÇÏ´Â ÇÁ·Î±×·¥Àº
°£´ÜÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¹è¿ü´Ù. ´ÜÁö ÁöÁ¤µÈ Å©±â¸¸Å µ¥ÀÌÅ͸¦ Àоî¼
¹öÆÛ¿¡ ½×°í, ÀÌ·± Àú·± ÀÛ¾÷À» ÇØ¼ Ãâ·ÂÇϱ⸸ ÇÏ¸é µÈ´Ù.
6.4. ¸¶Ä¡¸ç6.4.1. º¹½À ·¹ÄÚµå¶õ ¹«¾ùÀΰ¡ ?
°íÁ¤µÈ ±æÀ̸¦ °¡Áø ·¹Äڵ尡 ±×·¸Áö ¾ÊÀº ·¹Äڵ忡 ´ëÇØ¼
¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡Àº ¹«¾ùÀΰ¡.
¿©·¯°³ÀÇ ÆÄÀÏ·Î ºÐ¸®µÈ ¾î¼Àºí¸® ¼Ò½º¿¡¼ »ó¼ö¸¦ Æ÷ÇÔ½ÃŰ´Â
¹æ¹ý¿¡ ´ëÇØ¼ ¼³¸íÇϽÿÀ.
¿Ö ¿©·¯°³ÀÇ ÇÁ·Î±×·¥ ÆÄÀÏ·Î ³ª´©¾î¼ ÇÁ·Î±×·¥À» ÀÛ¼ºÇϴ°¡.
record_buffer + RECORD_AGE °¡ ÀǹÌÇÏ´Â ¹Ù¸¦ ¼³¸íÇϽÿÀ.
¿Ö ¾îµå·¡½º ¸ðµå¸¦ »ç¿ëÇϰí Àִ°¡ ?
6.4.2. ¿¬½À¹®Á¦ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀÎÀÚ·Î ÆÄÀÏÀ̸§À» ¹Þµµ·Ï ¿¹Á¦
ÇÁ·Î±×·¥µéÀ» ¼öÁ¤ÇØ º¸ÀÚ.
lseek(2) ½Ã½ºÅÛ È£Ãâ¿¡ ´ëÇØ¼ ¿¬±¸ÇØ º¸µµ·ÏÇÏÀÚ. lseek¸¦
ÀÌ¿ëÇØ¼ ÀÐÀº ÆÄÀÏÀÇ ³ªÀ̸¦ ¼öÁ¤ÇÑ ÈÄ ´Ù½Ã ÀúÀåÇϵµ·Ï
add-year ÇÁ·Î±×·¥À» ¼öÁ¤Çغ¸ÀÚ.
Űº¸µå·ÎºÎÅÍ ·¹ÄÚµå °ªÀ» ÀԷ¹޾Ƽ ÆÄÀÏ·Î ¾²´Â ÇÁ·Î±×·¥À»
¸¸µé¾î º¸µµ·Ï ÇÑ´Ù.
7. °ß°íÇÑ ÇÁ·Î±×·¥ ÀÛ¼ºÇϱâ À̹øÀå¿¡¼´Â °ß°íÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
°ß°íÇÑ ÇÁ·Î±×·¥À̶õ ¾î¶°ÇÑ ¹®Á¦µµ ¹ß»ý½ÃŰÁö ¾Ê´Â ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï´Ù.
¹°·Ð °¡´ÉÇÑ ¹®Á¦¸¦ ¹ß»ý½ÃŰÁö ¾Êµµ·Ï ¸¸µé¾î¾ß °ÚÁö¸¸, ¹®Á¦ ¹ß»ý½Ã À̸¦
±ò²ûÇÏ°Ô Ã³¸®Çؼ ½É°¢ÇÑ ¹®Á¦·Î °¡Áö ¾Êµµ·Ï ÇÏ´Â ÇÁ·Î±×·¥À» ¸»ÇÑ´Ù.
¹®Á¦ÀÇ Ã³¸®¸¦ À§Çؼ´Â ¿¡·¯Äڵ带 Á¦´ë·Î °Ë»çÇÏ´Â ÇÁ·Î±×·¥ÀÇ ÀÛ¼ºÀÌ ÇÊ¿äÇÏ´Ù.
7.1. ¿Ö ½Ã°£ÀÌ Áö¿¬µÇ´Â°¡ ? ÇÁ·Î±×·¡¸ÓÀÇ °øÅëµÈ ÀÇ°ß Áß Çϳª´Â ¾ðÁ¦³ª ½Ã°£ ºÎÁ·¿¡ ½Ã´Þ¸°´Ù´Â Á¡ÀÌ´Ù.
ÀÌ·¯ÇÑ »ç½ÇÀ» Àß ¾Ë°í ÀÖ´Â (°æÇèÀÖ´Â) ÇÁ·Î±×·¡¸ÓµéÀº ÇÁ·ÎÁ§Æ® ±â°£À»
»êÁ¤Çϴµ¥ ÀÖ¾î¼ ÀÚ½ÅÀÌ ¿¹»óÇÏ´Â ½Ã°£ÀÇ 2¹è ±æ°Ô´Â 4¹è±îÁö¸¦ Àâ´Â´Ù.
±×·¯³ª ±×·³¿¡µµ ºÒ±¸ÇÏ°í ¿©ÀüÈ÷ ½Ã°£Àº ºÎÁ·ÇÏ´Ù. ÀÌ·¯ÇÑ ¹®Á¦°¡ ¹ß»ýÇÏ´Â
¿øÀÎÀº ´ÙÀ½°ú °°´Ù.
ÇÁ·ÎÁ§Æ® ÄÚµå¿Í °ü·ÃµÇÁö ¾Ê´Â ¹ÌÆÃ°ú ¸ðÀÓ, ´Ù¸¥ (Æ´Æ´ÀÌ ¹ß»ýÇÏ´Â)
¾÷¹«µéÀÌ ¹ß»ýÇÏ°í ¿©±â¿¡ ½Ã°£À» »©¾Ñ±ä´Ù.
ÇÁ·Î±×·¡¸Ó´Â Á¾Á¾ ÇÁ·ÎÁ§Æ®¿¡ ´ëÇÑ ÀÌÇØ°¡ ºÎÁ·ÇÑ »óÅ¿¡¼(¹°·Ð ÀÚ½ÅÀº
¿ÏÀüÈ÷ ÀÌÇØÇß´Ù°í »ý°¢À» ÇÏÁö¸¸) ÇÁ·ÎÁ§Æ®¸¦ ½ÇÇàÇÑ´Ù.
ÇÁ·Î±×·¡¸Ó°¡ ¸¸µé¾î¾ß ÇÏ´Â Á¦Ç°ÀÇ ¸ðµç Á¦¹Ý»çÇ×À» ÀÌÇØÇÒ ¼ö ÀÖ´Â°Ç ¾Æ´Ï´Ù.
ÇÁ·Î±×·¡¸Ó´Â Á¾Á¾ ÀÌÀü¿¡ ¼öÇàÇß´ø ºñ½ÁÇÑ Á¾·ùÀÇ ÇÁ·ÎÁ§Æ®¸¦ °æÇè»ï¾Æ¼
Áö±Ý ¼öÇàÇÏ´Â ÇÁ·ÎÁ§Æ®¿¡ ´ëÇÑ ½Ã°£À» »êÃâÇÑ´Ù(º¸Åë ´õ ª°Ô).
±×·¯³ª ¼öÇàÇÏ´Ù º¸¸é ÀÌÀü ÇÁ·ÎÁ§Æ®¿Í Áö±Ý ÇÁ·ÎÁ§Æ®´Â ÀüÇô º°°³¶ó´Â °ÍÀ»
µÚ´Ê°Ô ±ú´Ý°Ô µÈ´Ù.
ÇÁ·Î±×·¡¸Ó´Â ½Ã°£À» ±â°£À» °è»êÇÒ ¶§ ÇÁ·Î±×·¥ ¾ÈÁ¤È¿Í °ü·ÃµÈ ºÎºÐÀ» »©°í
½Ã°£À» °è»êÇÑ´Ù. ÇÁ·ÎÁ§Æ® ±â°£À» ÃʰúÇßÀ» ¶§ "¿¹Àü¿¡ ¸»ÇÑ ÇÁ·ÎÁ§Æ® ½Ã°£Àº
¾ÈÁ¤È(µð¹ö±ë¹× Å×½ºÆ®)¿Í °ü·ÃµÈ ºÎºÐÀº Á¦¿ÜÇÑ °Ì´Ï´Ù."¶ó°í ÇÁ·ÎÁ§Æ® Áö¿¬À»
Ã¥¸ÁÇÏ´Â °ü¸®ÀÚ¿¡°Ô Áö¿¬ÀÌÀ¯¸¦ ¼³¸íÇÏ´Â ¸ð½ÀÀ» ÈçÈ÷ º¼ ¼ö ÀÖ´Ù.
¸·»ó ÇÁ·ÎÁ§Æ® Á¾¹Ý¿¡ ´Ù´Ù¸£¸é µð¹ö±ë°ú Å×½ºÆ®¿¡ »ó´çÈ÷ ¸¹Àº ½Ã°£ÀÌ ¼Ò¿äµÈ´Ù´Â
°ÍÀ» ¾Ë°ÔµÈ´Ù - »ç½Ç ´©±¸³ª ´Ù ¾ËÁö¸¸ ¸·»ó ÇÁ·ÎÁ§Æ®°¡ ´ÚÄ¡¸é ¹«½ÃÇÏ´Â °æ¿ì°¡ ¸¹´Ù -.
ÀÌ·¯ÇÑ Áö¿¬¿ä¼Ò Áß ¸¶Áö¸· ¿ä¼ÒÀÎ "°ß°íÇÑ ÇÁ·Î±×·¥ ÀÛ¼º"¿¡ °ü·ÃµÈ ³»¿ëÀ» ´Ù·ê °ÍÀÌ´Ù.
ÇÁ·Î±×·¥ ÀÛ¼º½Ã¿¡ °ß°íÇÑ (¹æ½ÄÀÇ)ÄÚµùÀ» ÇÑ´Ù¸é ³ªÁß¿¡ µð¹ö±ë°ú Å×½ºÆ® ½Ã°£À» »ó´çÈ÷
ÁÙÀÏ ¼ö ÀÖÀ» »Ó´õ·¯, Áú ÁÁÀº Á¦Ç°À» ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù.
´ë¹®ÀÚ º¯È¯(toupper) ÇÁ·Î±×·¥Àº ºÐ¸íÈ÷ Àß ÀÛµ¿Çϱä ÇÏÁö¸¸, ±×°ÍÀº Á¶°ÇÀÌ ¿Ïº®ÇϰÔ
¸Â¾Æµé¾î°¡´Â °æ¿ì°¡ µÈ´Ù. ¿¹¸¦ µé¸é ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù°Å³ª Á¸ÀçÇÏÁö¸¸ ±ÇÇѹ®Á¦
µîÀ¸·Î ÀоîµéÀÌÁö ¸øÇÏ´Â °æ¿ì°¡ ¹ß»ýÇÒ ¼öµµ ÀÖ´Ù. ¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥Àº ÀÌ·¯ÇÑ
¿¹¿Ü »óȲ¿¡ ´ëóÇÏÁö ¸øÇϰí ÀÖ´Ù. ¹®Á¦°¡ ¹ß»ýÇÒ °æ¿ì ¾îµð¿¡¼ ¹ß»ýÇß´ÂÁö ¾Ë¾Æ
³»±â Èûµé ¼öµµ ÀÖ´Ù.
±×·¡µµ toupper ÇÁ·Î±×·¥Àº ²Ï³ª ÀÛÀº ÇÁ·Î±×·¥À̱⠶§¹®¿¡ ¹®Á¦°¡ Á» ¹ß»ýÇØµµ
»çÈÄ Ã³¸®¸¦ Çϴµ¥ ±×¸® ¹®Á¦°¡ µÇÁö ¾Ê°ÚÁö¸¸, ÇÁ·Î±×·¥ÀÇ Å©±â°¡ Ä¿Áö¸é ½É°¢ÇÑ
¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù. ¼öõ ¼ö¸¸¶óÀÎÀÇ ÇÁ·Î±×·¥ÀÌ µ¹´Ù°¡ °©ÀÚ±â "¾Ï·± ¿¡·¯¸Þ½ÃÁöµµ ¾øÀÌ"
ÀÛµ¿ÀÌ Áß´ÜµÇ¾î ¹ö¸°´Ù¸é ³°¨ÇÒ °ÍÀÌ´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¥À» ¸¸µé ¶§´Â
»óÅÂüũÇϰí À̸¦ Á¦¾îÇϴµ¥ ¸¹Àº ½Ã°£À» ÇÒ¾ÖÇØ¾ß ÇÑ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ÇÁ·Î±×·¥ÀÇ ¿Ï¼º
Çѵ¥ 2ÁÖÀÇ ½Ã°£ÀÌ °É¸°´Ù°í Çϸé ÃÖ¼ÒÇÑ ±×Áß 2ÀÏÁ¤µµ¸¦ °ß°íÇÑ ÇÁ·Ï·¥À» ¸¸µå´Âµ¥
»ç¿ëÇØ¾ß ÇÑ´Ù. ¸ðµç ¿¡·¯¸Þ½ÃÁöµéÀº Ç×»ó ȸ鿡 Ãâ·Â µÉ ¼ö ÀÖ¾î¾ß ÇÔÀ» ±â¾ïÇ϶ó.
7.2. °ß°íÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â À§ÇÑ ¸î°¡Áö ÆÁ7.2.1. »ç¿ëÀÚ Å×½ºÆ® Å×½ºÆ®´Â ÇÁ·Î±×·¡¸Ó°¡ ÇØ¾ßµÉ °¡Àå ±âº»ÀûÀÎ ¾÷¹«Áß Çϳª´Ù. ¸¸¾à ÃæºÐÇÑ Å×½ºÆ®°¡
ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù¸é, Á¦´ë·ÎµÈ ÀÛµ¿À» º¸ÀåÇÒ ¼ö ¾ø°ÔµÈ´Ù. ¿¹¸¦ µé¾î ¿©·¯ºÐÀÇ
ÇÁ·Î±×·¥ÀÌ ¾ç¼ö¸¦ ÀԷ¹޾Ƽ ó¸®Çؼ °á°ú¸¦ ¾Ë·ÁÁÖ´Â ÇÁ·Î±×·¥À̶ó°í °¡Á¤ÇØ º¸ÀÚ.
±×·±µ¥ ¾î¶² ÀÌÀ¯·Î À½¼ö°¡ µé¾î¿Ã ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ȤÀº ¼ýÀÚ ´ë½Å¿¡ ¹®ÀÚ°¡ Ãâ·ÂµÈ´Ù
µçÁö Áö³ªÄ¡°Ô Å« ¼ö°¡ ÀԷµǰųª 0ÀÌ ÀԷµǴ µîÀÇ ÀÏÀÌ ¹ß»ýÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ·± °æ¿ì¿¡ ´ëÇØ¼ ÃæºÐÈ÷ Å×½ºÆ®°¡ ÀÌ·ç¾î Á®¾ß ÇÑ´Ù. ¶ÇÇÑ Ã³À½°ú ¸¶Áö¸·¿¡
°ø¹é¹®ÀÚ°¡ ÀÔ·ÂµÈ °æ¿ì, Áß°£¿¡ °ø¹é¹®ÀÚ°¡ ÀÔ·ÂµÈ °æ¿ì ¾Æ¹¸µç ¹ß»ý°¡´É ÇҰŶó°í
»ý°¢µÇ´Â ¸ðµç °æ¿ì¿¡ ´ëÇØ¼ Å×½ºÆ® ÇØ¾ß ÇÑ´Ù. »ç¿ëÀÚ´Â ¾î¶² ÀÔ·ÂÀ» ÇÒÁö ¿¹ÃøÇÒ
¼ö ¾ø±â ¶§¹®ÀÌ´Ù.
¹®Á¦°¡ ¹ß»ýµÇ´Â °æ¿ì¸¦ È®ÀÎÇß´Ù¸é, ÀçÀÔ·ÂÀ» ¿ä±¸ÇÒ °ÇÁö, (°ø¹é µîÀ» Á¦°ÅÇØ¼)
Á¦´ë·ÎµÈ µ¥ÀÌÅÍ·Î ¸¸µé¾î ÁÙ°ÇÁö, ÇÁ·Î±×·¥ÀÇ ´Ù½Ã ½ÇÇà½Ãų °ÇÁö¸¦ °áÁ¤ÇØÁà¾ß ÇÑ´Ù.
ÀÌ·± Å×½ºÆ®°¡ ÃæºÐÇÏÁö ¾Ê´Ù¸é, ½ÇÁ¦ Á¦Ç°ÀÌ Ãâ½ÃµÇ°í³ª¼ °í°´µé·Î ºÎÅÍ Å×½ºÆ®¸¦
¹Þ°Ô µÉ °ÍÀÌ´Ù. ¹°·Ð »ó´çÇÑ ½ºÆ®·¹½º°¡ µÉ °ÍÀÌ´Ù.
7.2.2. µ¥ÀÌÅÍ Å×½ºÆ® ÇÁ·Î±×·¥À» µðÀÚÀÎ ÇÒ¶§, ´ç½ÅÀÌ »ç¿ëÇÏ´Â °¢°¢ÀÇ ÇÔ¼ö´Â ¹Þ¾Æµé¿©¾ßÇÒ µ¥ÀÌÅÍÀÇ ¹üÀ§¿¡
´ëÇØ¼ ¸íÈ®È÷ ÇØ¾ß ÇÑ´Ù. À̸¦ À§Çؼ ÇÁ·Î±×·¡¸Ó´Â ÇÔ¼ö¿¡ ÀԷµǴ µ¥ÀÌÅÍ¿¡ ´ëÇÑ
Å×½ºÆ®¸¦ ÇØ¾ß ÇÑ´Ù. °¡Àå Áß¿äÇÑ Å×½ºÆ®´Â corner case¿Í
edge case Å×½ºÆ®´Ù. °£´ÜÈ÷ ¸»Çؼ °æ°è°ªÀ» ÀÔ·ÂÇßÀ» ¶§
¾î¶² ¹®Á¦°¡ ¹ß»ýÇÏ´ÂÁö¸¦ Å×½ºÆ® ÇÏ´Â °ÍÀÌ´Ù.
´ÙÀ½Àº ÀÌ·¯ÇÑ Å×½ºÆ®¸¦ À§Çؼ Ưº°È÷ ´ÙÀ½°ú °°Àº °ªµéÀ» Áß¿äÇÏ°Ô Å×½ºÆ® ÇØ¾ß ÇÑ´Ù.
¿¹¸¦ µé¾î¼ 5¿Í 200»çÀÌÀÇ °ªÀ» ¹Þ¾ÆµéÀÌ´Â ÇÁ·Î±×·¥À̶ó°í ÇÑ´Ù¸é °³ÀÎÀûÀ¸·Î 0, 1, 4,
5, 153, 200, 201, 255µî¿¡ ´ëÇØ¼ Å×½ºÆ®¸¦ ÇÒ°ÍÀÌ´Ù.
±×¸®°í ¾î¶² ¼öµé¿¡ ´ëÇØ¼ ÁßÁ¡ÀûÀ¸·Î Å×½ºÆ®¸¦ ÇØ¾ß ÇÏ´ÂÁö¿¡
´ëÇØ¼µµ °áÁ¤ÇÒ Çʿ䰡 ÀÖ´Ù. ¿¹¸¦µé¾î¼ ÇÁ·Î±×·¡¸ÓÀÇ ³ªÀ̸¦ ¹Þ¾Æµé¿©¼ Å×½ºÆ®ÇÏ´Â
ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù°í Çϸé 20¿¡¼ 40»çÀÌÀÇ ¼ö¿¡ ´ëÇØ¼ ÁýÁßÀûÀ¸·Î Å×½ºÆ®ÇÒ Çʿ䰡
Àֱ⠶§¹®ÀÌ´Ù.
ƯÈ÷ 0¿¡ ´ëÇØ¼´Â °¢º°È÷ Å×½ºÆ®ÇÒ Çʿ䰡 Àִµ¥, ¸¸¾à ÇÔ¼ö°¡ ÀÔ·ÂµÈ °ªÀ¸·Î ³ª´©´Â
¿¬»êÀÌ Àִµ¥, ÀÌ ¶§ 0ÀÌ
ÀԷµǸé ÇÁ·Î±×·¥ÀÇ ÀÛµ¿ÀÌ ¾Æ¿¹ Á¾·áµÇ¾î ¹ö¸®´Â °æ¿ì°¡ ¹ß»ýÇÒ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù.
ÀÌ·± ÀÌÀ¯·Î ³»ºÎ¿¡¼ »ç¿ëµÇ´Â ÇÔ¼öµéÀº ¿Ã¹Ù¸¥ µ¥ÀÌÅÍÀÎÁö, ȤÀº ÁÁÀº µ¥ÀÌÅÍÀÎÁö¸¦
È®ÀÎÇϱâ À§Çؼ (°ªÀÇ ¹üÀ§°¡ 0-255±îÁö¶ó°í ÇßÀ» ¶§, »ç¶÷ÀÇ ³ªÀ̸¦ üũÇÏ´Â ÇÁ·Î±×·¥
À̶ó¸é, 244°¡ ºñ·Ï ¿Ã¹Ù¸¥ µ¥ÀÌÅͶó°í ÇÏ´õ¶óµµ ÁÁÀº µ¥ÀÌÅͶó°í´Â ÇÒ ¼ö ¾ø´Ù),
´ë¼Ò °ü°è¸¦ ÀÌ¿ëÇÏ°Ô µÈ´Ù. ¸¸¾à ÀÔ·ÂµÈ °ªÀÌ ¹üÀ§¸¦ ¹þ¾î³´Ù¸é ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰųª
ÇÁ·Î±×·¥ÀÌ Á¾·áÇϵµ·Ï ÇÏ¸é µÉ°ÍÀÌ´Ù.
C¾ð¾î¿¡¼´Â assert¶ó´Â ¸ÅÅ©·Î ÇÔ¼ö¸¦ ÀÌ¿ëÇϸé ÀÌ·¯ÇÑ Ã¼Å©°úÁ¤À» Á»´õ ¼ö¿ùÇÏ°Ô ÇÒ ¼ö
ÀÖ´Ù. assertÇÔ¼ö´Â Á¶°ÇÀ» Å×½ºÆ®Çؼ Á¶°Ç¿¡ ¸ÂÁö ¾ÊÀ¸¸é ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí,
³»ºÎÀûÀ¸·Î abort()ÇÔ¼ö¸¦ È£ÃâÇØ¼ ÇÁ·Î±×·¥À» Á¾·á ½ÃŲ´Ù. ¸¸¾à¿¡ assertÇÔ¼ö°¡
Ȱ¼ºÈ µÇÁö ¾Êµµ·Ï ÇÒ·Á¸é ÄÄÆÄÀϽà NDEBUG¿É¼ÇÀ» ÁÖ¸é µÈ´Ù.
#include <assert.h>
int main()
{
int a=3, b=4;
assert(a > b);
}
|
À§ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇØ¼ ½ÇÇà ½ÃŰ¸é ¿¡·¯°¡ ¹ß»ýÇϰí ÇÁ·Î±×·¥ÀÌ Á¾·áµÈ´Ù.
¸¸¾à assertÇÔ¼ö¸¦ ¹«½ÃÇÏ°í ½Í´Ù¸é ¾Æ·¡¿Í °°ÀÌ ÄÄÆÄÀÏ ÇÏ¸é µÈ´Ù.
# gcc -DNDEBUG -o assert assert.c
|
ÀÌ·¸°Ô Äڵ带 ¸¸µé¾î ³õÀ¸¸é µð¹ö±ë ÄÚµå¿Í ½ÇÁ¦ ¹èÆ÷µÉ Äڵ带 ±¸ºÐÁöÀ» ¼ö ÀÖ´Ù´Â
ÀåÁ¡À» °¡Áø´Ù. ¾î¶µç °í°´¿¡°Ô ¹èÆ÷µÇ´Â Äڵ忡 µð¹ö±ë ¸Þ½ÃÁö°¡ Ãâ·ÂµÇ°Å³ª ÇØ¼´Â
³°¨Çϱ⠶§¹®ÀÌ´Ù.
7.2.3. ¸ðµâ Å×½ºÆ® ¾î¶² Å×½ºÆ®¸¦ ÇÒ¶§ ¹Ýµå½Ã ÇÁ·Î±×·¥ÀÇ ¸ðµç ÇÔ¼ö¿Í È帧¿¡ ´ëÇØ¼ Å×½ºÆ®¸¦ ÇÒ ÇÊ¿ä´Â
¾øÀ» °ÍÀÌ´Ù. ÀÌ·±½ÄÀÇ Å×½ºÆ®´Â º¸Åë ½Ã°£µµ ¸¹ÀÌ °É¸®°í üũ¹üÀ§°¡ ³Ð¾îÁ®¼ ¹®Á¦Á¡À»
ã¾Æ³»±âµµ Èûµé±â ¶§¹®ÀÌ´Ù. ±×·¡¼ º¸ÅëÀº °¢ ¸ðµâ(ÇÔ¼ö)´ÜÀ§·Î Å×½ºÆ®¸¦ Çϰí, ¾î´ÀÁ¤µµ
Å×½ºÆ®°¡ ³¡³ª¸é Àüü Å×½ºÆ®¸¦ ÇÏ°Ô µÈ´Ù. ÇÔ¼ö´ÜÀ§·Î Å×½ºÆ®¸¦ ÇÏ¸é ¾Æ¹«·¡µµ
Á»´õ ºü¸£°í ¸íÈ®ÇÏ°Ô ¹®Á¦Á¡À» È®ÀÎÇÏ°í ¿¹ÃøÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.
ÇÁ·Î±×·¥Àº ¾î¶² ¹®Á¦¸¦ Ç®±âÀ§Çؼ ¿©·¯°³ÀÇ ÇÔ¼ö¸¦ È£ÃâÇϸç, ÇÁ·Î±×·¡¸Ó´Â ÀÌ ÇÔ¼öµéÀ»
´Ü°èº°·Î üũÇÔÀ¸·Î½á Å×½ºÆ®¸¦ ¼öÇàÇÏ°Ô µÈ´Ù. ÇÔ¼ö¿¡ ´ëÇÑ Ã¼Å©´Â ÀԷ°ª°ú
°á°ú(return °ª)À» È®ÀÎÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù. ÇÁ·Î±×·¥ÀÇ Å×½ºÆ®¸¦ ´ÜÀ§ ÇÔ¼öº°·Î
ºÐ¸®½ÃÄѼ ½±°Ô Å×½ºÆ® ÇÒ ¼ö ÀÖ´Ù´Â °Íµµ ÇÁ·Î±×·¥À» ¿©·¯°³ÀÇ Á¶±×¸¸ ÇÔ¼öµé·Î Âɰ³¼
°³¹ßÇÏ´Â ÀÌÀ¯À̱⵵ ÇÏ´Ù.
¶ÇÇÑ ÇÔ¼ö´ÜÀ§·Î Å×½ºÆ®´Â ÇÁ·Î±×·¥ÀÌ ¿ÏÀüÈ÷ °³¹ßµÇÁö ¾ÊÀº »óÅ¿¡¼µµ °¡´ÉÇÏ´Ù.
ÀüÀÚ »ó°Å·¡ °ü·Ã ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µç´Ù°í ÇÑ´Ù¸é is_ready_to_checkinÀ̶ó´Â ÇÔ¼ö¸¦
¸¸µé¾î¼ °í°´ÀÇ ÀÎÁõ°ü·Ã ÇÔ¼ö¸¦ ¸ÕÀú ¸¸µé¾î¼ À̺κи¸ µû·Î ¶¼¾î³»¼ Å×½ºÆ® ÇÒ ¼ö
ÀÖÀ» °ÍÀÌ´Ù. ¸¸µé¾îÁö°í Å×½ºÆ®µÈ ÇÔ¼ö´Â ·¹°íºí·° ½×µíÀÌ Àüü ÇÁ·Î±×·¥¿¡ °¡Á®´Ù
ºÙÀ̱⸸ ÇÏ¸é µÈ´Ù.
7.3. ¿¡·¯ Çڵ鸵ÀÇ ±âº» Å×½ºÆ®°¡ Áß¿äÇÏ´Ù´Â °ÍÀº ¸»ÇÒ Çʿ䵵 ¾øÀ» °ÍÀÌ´Ù. ¿©±â¿¡¼´Â Å×½ºÆ®¸¦ ÅëÇØ¼
¿¡·¯¸¦ ã¾Æ³»°í À̸¦ ó¸®ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
7.3.1. ¸ðµç °ÍÀº ¿¡·¯Äڵ带 °¡Áø´Ù.
7.4. °ß°íÇÑ ÇÁ·Î±×·¥À¸·Î ¸¸µé±â À̹øÀå¿¡¼´Â 6.3절¿¡¼ ´Ù·ç¾ú´ø add-year.s ÇÁ·Î±×·¥À» °ß°íÇϰÔ
¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.
ÀÌ ÇÁ·Î±×·¥Àº °£´ÜÇϱ⠶§¹®¿¡ ´ÜÁö ÇϳªÀÇ recovery Æ÷ÀÎÅ͸¦ °¡Áöµµ·Ï Á¦ÇÑÇϰڴÙ.
8. ¶óÀ̺귯¸®¸¦ ÅëÇÑ ÇÔ¼ö °øÀ¯
Áö±Ý±îÁöÀÇ ³»¿ëÀ» ÅëÇÏ¿© ´Ü¼øÈ÷ »çÄ¢¿¬»êÀ» ÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ Á¶Â÷µµ, ÄÄÇ»Å͸¦
ÅëÇØ¼ ±¸Çö½Ãų·Á¸é »ó´çÈ÷ ¸¹Àº ÀÏÀ» ÇØ¾ßÇÑ´Ù´Â °ÍÀ» ´À²¼À» °ÍÀÌ´Ù.
°Ô´Ù°¡ ¿ì¸®°¡ ¾ÕÀ¸·Î ¸¸µé¾î¾ß ÇÒ ÇÁ·Î±×·¥µéÀº Áö±Ý±îÁö ¸¸µé¾î¿Ô´ø (°£´ÜÇÑ)ÇÁ·Î±×·¥µé
º¸´Ù ÈξÀ º¹ÀâÇÒ È®·üÀÌ ¸¹´Ù.
±×·¯¹Ç·Î °¡´ÉÇÑÇÑ ÇÁ·Î±×·¥À» ½±°Ô ¸¸µé ¼ö ÀÖ´Â ¾î¶² ÇÁ·Î¼¼½ºÀÇ Á¤¸³ÀÌ ÇÊ¿äÇϰÔ
µÈ´Ù. ¿©±â¿¡´Â ´ÙÀ½°ú °°Àº ¸î°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù.
¾î¼Àºí¸® ´ë½Å °í±Þ¾ð¾î¸¦ ÀÌ¿ëÇØ¼ Äڵ带 ÀÛ¼ºÇÑ´Ù.
ÇÁ·Î±×·¥À» ¸¸µé±â Àü¿¡ ¿©·¯°³ÀÇ (°£´ÜÇÑ) Äڵ带 ¸¸µé°í, À̰É
Á¶ÇÕÇØ¼(°¡Á®´Ù ºÙÀ̱â·Î) ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù.
ÇÁ·Î±×·¥µé »çÀÌ¿¡ °øÅëÀûÀ¸·Î »ç¿ëÇÏ´Â ÇÔ¼öÀÇ ¸ðÀ½À» µû·Î °ü¸®Çؼ
°øÀ¯ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.
À§ÀÇ ¹æ¹ýµéÀº ¸ðµÎ ÇÁ·ÎÁ§Æ®¸¦ ¼öÇàÇÔ¿¡ ÀÖ¾î¼ ½ÇÁúÀûÀ¸·Î ÇÊ¿äÇÑ °ÍµéÀÌ´Ù.
ù¹øÂ° ¹æ¹ýÀÎ °í±Þ¾ð¾î¸¦ ÀÌ¿ëÇÏ´Â °Í¿¡ ´ëÇØ¼´Â 11Àå¿¡¼ ´Ù·çµµ·Ï ÇϰڴÙ.
µÎ¹øÂ° ¹æ¹ýÀº À¯¿ëÇÑ ¹æ¹ýÀ̱ä ÇÏÁö¸¸ ´ÙÀ½°ú °°Àº ¹®Á¦Á¡µéÀ» °¡Áø´Ù.
º¹»çµÈ ÄÚµå´Â ½ÇÁ¦ Äڵ忡¼ Á¾Á¾ Å©°Ô ¼öÁ¤µÇ°ï ÇÑ´Ù.
º¸Åë º¹»çµÇ´Â ÄÚµå´Â ÇÁ·Î±×·¥¿¡ ¿©·¯¹ø Æ÷ÇÔÀÌ µÈ´Ù.
À̰ÍÀº ³¶ºñ¸¦ ÃÊ·¡ÇÒ »Ó ¾Æ´Ï¶ó, ÄÚµåÀÇ ¼öÁ¤À» ¾î·Æ°Ô ¸¸µç´Ù.
¸¸¾à º¹»çµÈ Äڵ忡¼ ¹®Á¦°¡ ¹ß»ýÇß´Ù¸é ÀÌ Äڵ带 »ç¿ëÇÏ´Â
¸ðµç ÀÀ¿ëÀÇ Äڵ带 ¼öÁ¤Çؼ ´Ù½Ã ¹èÆ÷ÇØ¾ß¸¸ ÇÑ´Ù.
±×·¯¹Ç·Î µÎ¹øÂ° ¹æ¹ýÀº ²À ÇÊ¿äÇÑ ºÎºÐ¿¡¼¸¸ »ç¿ëÇϵµ·Ï ÇÑ´Ù. ¼¼¹øÂ° ¹æ¹ýÀº °¡Àå
ÀÚÁÖ ÀÌ¿ëÇÑ´Ù. À̰ÍÀº °øÅëÀ¸·Î »ç¿ëµÇ´Â Äڵ带 ÀçÀÛ¼º ÇÏÁö ¾Ê°í ÀÌ¹Ì ÀúÀåµÇ¾î ÀÖ´Â
Äڵ带 Àоî¿À´Â ¹æ½ÄÀ» ÃëÇÑ´Ù - Á¤È®ÇϰԴ ȣÃâµÈ ÇÔ¼öÀÇ À§Ä¡¸¦ °¡Á®¿Í¼ ½ÇÇàÇÑ´Ù -.
À̰ÍÀº µ¿ÀÏÇÑ ÇÔ¼ö¸¦ º¹»çÇØ¼ »ç¿ëÇØ¾ß ÇÏ´Â ³¶ºñ¸¦ ¾ø¾ÖÁØ´Ù.
¶ÇÇÑ Äڵ忡 ¹ö±×°¡ ¹ß»ýÇßÀ» °æ¿ì¿¡µµ ÀÏÀÏÀÌ ÇÁ·Î±×·¥À» ¼öÁ¤ÇÒ ÇÊ¿ä ¾øÀÌ
°øÅëÀ¸·Î È£ÃâÇÏ´Â ÇÔ¼ö¸¸ ¼öÁ¤ÇÏ¸é µÇ±â ¶§¹®¿¡ ¹ö±×µµ ½±°Ô °ü¸®ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
¹°·Ð ÀÌ ¹æ¹ýµµ ¸î°¡Áö ¹®Á¦¸¦ °¡Áö°í ÀÖ´Ù.
¸¸¾à ¿©·¯°³ÀÇ ÇÁ·Î±×·¥ÀÌ ÇÔ¼öÆÄÀÏ(¶óÀ̺귯¸®)¸¦ °øÀ¯Çϰí ÀÖÀ» ¶§,
°ú¿¬ ÀÌ ÇÔ¼öÆÄÀÏÀ» Áö¿öµµ ±¦ÂúÀ»Áö ¾î¶»°Ô ÆÇ´ÜÇÒ ¼ö ÀÖÀ» ±î ?
´õÀÌ»ó ÇÊ¿ä ¾ø´Ù°í ÆÇ´ÜÇØ¼ Áö¿ü´Âµ¥, ´Ù¸¥ ÇÁ·Î±×·¥ÀÌ À̸¦ »ç¿ëÇϰí ÀÖ¾î¼
±× ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇÁö ¾Ê´Â °æ¿ì¸¦ ¿¹»óÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.
Some programs inadvertantly rely on bugs within shared functions. Therefore, if upgrading the shared program fixes a bug that a program depended on, it could cause that application to cease functioning.
ÀÌ·¯ÇÑ ¹®Á¦¸¦ "DLL hell"À̶ó°í ºÎ¸¥´Ù. ±×·¸Áö¸¸ ÀÌ·¯ÇÑ ´ÜÁ¡º¸´Ù´Â ¾ò´Â À̵æÀÌ
ÈξÀ Å©±â ¶§¹®¿¡ ÀÌ ¹æ¹ýÀ» ÁÖ·Î »ç¿ëÇÑ´Ù.
ÇÁ·Î±×·¡¹Ö¿¡¼ ÀÌ·¯ÇÑ °øÀ¯µÇ´Â ÄÚµå ÆÄÀÏÀ» shared libraries, shared objects,
dynamic-link libraries, DLLs ȤÀº .so ÆÄÀÏ À̶ó°í ÇÑ´Ù.
¿©±â¿¡¼´Â °øÀ¯¶óÀ̺귯¸®(shared libraries)¶ó°í ºÎ¸£µµ·Ï ÇϰڴÙ.
8.1. °øÀ¯ ¶óÀ̺귯¸®ÀÇ ÀÌ¿ë °øÀ¯¶óÀ̺귯¸®¸¦ Å×½ºÆ® Çϱâ À§Çؼ °£´ÜÇÑ ¿¹¸¦ µé¾îº¸µµ·Ï ÇϰڴÙ.
ÀÌ ÇÁ·Î±×·¥Àº ȸ鿡 hello world¸¦ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥À¸·Î
À̸§Àº helloworld-nolib.s·Î ÇϰڴÙ.
.include "linux.s"
.section .data
helloworld:
.ascii "hello world\n"
helloworld_end:
.equ helloworld_len, helloworld_end - helloworld
.section .text
.globl _start
_start:
movl $STDOUT, %ebx
movl $helloworld, %ecx
movl $helloworld_len, %edx
movl $SYS_WRITE, %eax
int $LINUX_SYSCALL
movl $0, %ebx
movl $SYS_EXIT, %eax
int $LINUX_SYSCALL
|
°£´ÜÇÑ ÄÚµåÀÓÀ¸·Î ¼³¸íÀº »ý·«ÇϰڴÙ. ´ÙÀ½Àº À§ ÇÁ·Î±×·¥ÀÇ °øÀ¯ ¶óÀ̺귯¸®
È£Ãâ ¹öÁ¯À¸·Î À̸§Àº helloworld-lib.sÀÌ´Ù.
.section .data
helloworld:
.ascii "hello world\n\0"
.section .text
.globl _start
_start:
pushl $helloworld
call printf
pushl $0
call exit
|
°øÀ¯ ¶óÀ̺귯¸® È£Ãâ ¹öÁ¯Àº Äڵ尡 ´õ¿í ´Ü¼øÇØ Á³´Ù. ÀÌÀ¯´Â °£´ÜÇÏ´Ù. Ãâ·Â°ú
°ü·ÃµÈÀÏÀ» ½Ã½ºÅÛ È£ÃâÀ» ÅëÇÏ¿© Á÷Á¢ ÄÚµùÇÏÁö ¾Ê°í, ¶óÀ̺귯¸®¿¡¼ Á¦°øÇÏ´Â
printfÇÔ¼ö¸¦ »ç¿ëÇ߱⠶§¹®ÀÌ´Ù.
ù¹øÂ° ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀÏ ÇØ¼ ½ÇÇà½ÃŰ¸é µÈ´Ù.
# as helloworld-nolib.s -o helloworld-nolib.o
# ld helloworld-nolib.o -o helloworld-nolib
|
±×·¯³ª µÎ¹øÂ° ÇÁ·Î±×·¥ÀÇ °æ¿ì printf¸¦ ¾î¶² °øÀ¯ ¶óÀ̺귯¸®¿¡¼ È£ÃâÇϵµ·Ï
Çß´ÂÁö ¸µÅ©°úÁ¤¿¡¼ ¾Ë·ÁÁÙ Çʿ䰡 ÀÖ´Ù.
# as helloworld-lib.s -o helloworld-lib.o
# ld -dynamic-linker /lib/ld-linux.so.2 -o helloworld-lib helloworld-lib.o -lc
|
°øÀ¯ ¶óÀ̺귯¸®¸¦ ¸µÅ© ½Ã۱â À§Çؼ -dynamic-linker ¿É¼ÇÀ» »ç¿ëÇϰí ÀÖ´Ù.
¸®´ª½º »ó¿¡¼ °øÀ¯ ¶óÀ̺귯¸® ¸µÅ©¸¦ À§Çؼ´Â Ç×»ó
-dynamic-linker /lib/ld-linux.so.2ÀÌ ÇÁȨµÇ¾î¾ß ÇÑ´Ù. À̰ÍÀº ÇÁ·Î±×·¥ÀÌ
½ÇÇàµÉ¶§ ¿î¿µÃ¼Á¦·Î ºÎÅÍ /lib/ld-linux.so.2¸¦ ÀÌ¿ëÇØ¼ ¿ÜºÎ ¶óÀ̺귯¸®¸¦
¸µÅ© ½Ãų ¼ö ÀÖµµ·Ï ¸¸µé¾î ÁØ´Ù.
-lc ´Â c ¶óÀ̺귯¸®¸¦ ¸µÅ©½ÃÄѶõ ¶æÀÌ´Ù. c¶óÀ̺귯¸®´Â
GNU/LinuxÀÇ °æ¿ì libc.so¶ó´Â À̸§À» °¡Áö°í ÀÖ´Ù. ¿©±â¿¡¼ óÀ½ÀÇ lib¿Í ¸¶Áö¸·ÀÇ
.so¸¦ Á¦°Å½ÃŲ À̸§À» -lµÚ¿¡ ºÙ¿©ÁÜÀ¸·Î½á ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦ ¸µÅ©½ÃŰ°Ô µÈ´Ù.
libc¿¡´Â printf(3)¿Í exit(3)¸¦ ºñ·ÔÇÑ ´Ù¾çÇÑ ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Ù.
9. ¸Þ¸ð¸®¿¡ ´ëÇÏ¿© ¿©±â¿¡¼ ´Ù·ç´Â ÁÖÁ¦´Â ½ÇÁúÀûÀÎ ÇÁ·Î±×·¡¹Ö ±â¼ú°ú´Â °ü°è¾ø¾î º¸ÀÏ
¼öµµ ÀÖÀ» °ÍÀ̸ç, Áö±ØÈ÷ ÀÌ·ÐÀûÀÎ °ÍµéÀ̶ó¼ Àç¹Ì¾øÀ» ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.
±×·¸Áö¸¸ ¿©±â¿¡¼ ´Ù·ç´Â ³»¿ëµéÀº ´ç½ÅÀÌ ¼º°øÀûÀÎ ÇÁ·Î±×·¡¸Ó°¡ µÇ±â À§ÇÑ
µçµçÇÑ ÈÄ¿øÀÚ°¡ µÇ¾îÁÙ °ÍÀÌ´Ù.
9.1. ÄÄÇ»ÅÍ´Â ¸Þ¸ð¸®¸¦ ¾î¶»°Ô ¹Ù¶óº¸´Â°¡ ¿ì¸®´Â ÀÌ¹Ì 2Àå2절¿¡¼ ÄÄÇ»ÅͰ¡ ¸Þ¸ð¸®¸¦ ¾î¶»°Ô
º¸´ÂÁö¿¡ ´ëÇØ¼ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Ù. ÄÄÇ»ÅÍ´Â ¸Þ¸ð¸®ÀÇ °¢ ÀúÀ念¿ªÀ»
ÃÖ¼Ò´ÜÀ§·Î ³ª´©°í, ¿©±â¿¡ ÀÏ·ÃÀÇ ¿¬¼ÓµÈ ¹øÈ£¸¦ ºÙ¿©¼ °ü¸®ÇÏ°Ô µÈ´Ù.
ÃÖ±ÙÀÇ ÄÄÇ»Å͵éÀº ±âº» 512MÀÌ»óÀÇ Å©±â¸¦ °¡Áö°Ô µÇ¹Ç·Î ±âº» ¼ö¹é¸¸ ´ÜÀ§ÀÇ
ÀϷùøÈ£°¡ ºÙ°Ô µÉ°ÍÀÌ´Ù.
´ç½ÅÀÌ ¸¸µç ÇÁ·Î±×·¥Àº ÇÊ¿¬ÀûÀ¸·Î µ¥ÀÌÅÍ¿¡ ´ëÇÑ Á¶ÀÛÀ» ÇÊ¿ä·Î Çϸç,
ÀÌ·¯ÇÑ µ¥ÀÌÅÍ´Â ¸Þ¸ð¸®¿¡ ¾²¿©Áö°í ÀÐÇôÁö°Ô µÈ´Ù. ±âº»ÀûÀ¸·Î ÄÄÇ»ÅÍ´Â
µ¥ÀÌÅͰ¡ ¾î´ÀÀ§Ä¡¿¡ ³õ¿©¾ß ÇÏ´ÂÁö, µ¥ÀÌÅͰ¡ ¾î´ÀÁ¤µµÀÇ ÀúÀ念¿ªÀ»
ÇÊ¿ä·Î ÇÏ´ÂÁö¿¡ ´ëÇØ¼ ¾Æ´Â ¹Ù°¡ ÀüÇô ¾øÀ¸¹Ç·Î, µ¥ÀÌÅͰ¡ ¾îµð¿¡
¾î¶»°Ô ÀúÀåµÉÁö¸¦ ¸í·É(instruction)À» ÅëÇØ¼ ÄÄÇ»ÅÍ¿¡°Ô ¾Ë·ÁÁà¾ß ÇÑ´Ù.
ÀÌ·± ¸í·É¿ª½Ã ÀúÀ念¿ª¿¡ ¾²¿©ÁøÈÄ ¸Þ¸ð¸®¿¡ ÀúÀåµÈ´ÙÀ½ ÄÄÇ»ÅͰ¡ Àо°Ô µÈ´Ù.
ÇѸ¶µð·Î ¸ðµç°Ô ¸Þ¸ð¸®¿µ¿ª¿¡ µé¾î°£´ÙÀ½ ÄÄÇ»ÅÍ¿¡ ÀÇÇØ¼ ÀÐÇôÁö°í ½ÇÇàµÇ¾îÁø´Ù.
ÇÊ¿ä·Î ÇÏ°Ô µÈ´Ù.
movl data_items(, %edi, 4), %ebx
|
¿¹¸¦ µé¾î À§ÀÇ ¸í·ÉÀº 7ÀÇ ÀúÀ念¿ªÀ» ÇÊ¿ä·Î ÇÑ´Ù. óÀ½ ¸í·ÉÀº 2¹ÙÀÌÆ®, ´ÙÀ½ ·¹ÀÌÁö½ºÅÍÀÇ »ç¿ëÀ» À§Çؼ 1¹ÙÀÌÆ®, ¸¶Áö¸·À¸·Î data_items¿µ¿ªÀ» À§Çؼ 4¹ÙÀÌÆ®¸¦ »ç¿ëÇÏ°Ô µÈ´Ù. ¸Þ¸ð¸®»ó¿¡¼´Â ÀÌ·¯ÇÑ À§Ä¡¸¦ ÀÏ·ÃÀÇ ¼ýÀÚ¸¦ ÅëÇØ¼ ã¾Æ³»°Ô µÈ´Ù. ¸Þ¸ð¸®¿Í °ü·ÃµÇ¾î¼ ¸î°¡Áö ¿ë¾î¸¦ Á¤¸®ÇØ º¸µµ·Ï ÇÏÀÚ.
- Address
Address(ÁÖ¼Ò)´Â ÀúÀåÀ§Ä¡¸¦ °¡¸®Å°±â À§ÇÑ ¼ýÀÚ´Ù. ÄÄÇ»ÅÍ´Â
¸Þ¸ð¸®ÀÇ Ã¹¹øÂ° ÁÖ¼Ò°¡ 0ÀÌ µÇ¸ç, °è¼Ó 1¾¿ Áõ°¡ÇÏ¸ç ¸Þ¸ð¸®ÀÇ
À§Ä¡¸¦ °áÁ¤ÇÑ´Ù. ÀÌ·¯ÇÑ ÁÖ¼Ò´Â ÄÄÇ»ÅͰ¡ »ç¿ëÇϱ⿡´Â
Æí¸®ÇÏÁö¸¸ Àΰ£ÀÌ º¸±â¿¡´Â ¹®Á¦°¡ Àֱ⠶§¹®¿¡, ¼ýÀÚ ´ë½Å
ÀÌÇØÇϱ⠽¬¿î ½Éº¼ (data_items ¿Í °°Àº)À» »ç¿ëÇÑ´Ù.
- Pointer
Æ÷ÀÎÅÍ´Â ÁÖ¼Ò°ªÀ» °¡Áö°í ÀÖ´Â ¸Þ¸ð¸® ȤÀº ·¹Áö½ºÅÍ¿µ¿ªÀÌ´Ù.
À§ÀÇ ¿¹Á¦¿¡¼ %ebp°¡ Æ÷ÀÎÅÍ·Î, ÇöÀçÀÇ
stack¿µ¿ªÀ» point(°¡¸®Å²´Ù)ÇÑ´Ù.
´ëºÎºÐÀÇ ÇÁ·Î±×·¡¹Ö°úÁ¤¿¡ ÀÖ¾î¼ ¸¹Àº ¼öÀÇ Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ°Ô µÈ´Ù.
- Byte
ÀúÀåÀ» À§ÇÑ ÃÖ¼Ò´ÜÀ§´Ù. x86ÇÁ·Î¼¼½ºÀÇ °æ¿ì ÇѹÙÀÌÆ®´Â 8bit·Î 0¿¡¼ 255»çÀÌÀÇ °ªÀ» °¡Áø´Ù.
- Word
·¹Áö½ºÅÍÀÇ ÀϹÝÀûÀÎ Å©´Ù. x86 ÇÁ·Î¼¼½ºÀÇ °æ¿ì, 1 word´Â
4¸¸ÅÀÇ ÀúÀ念¿ª(4byte)ÀÇ Å©±â¸¦ °¡Áø´Ù.
¾ÕÀ¸·Î´Â ÀúÀ念¿ªÀ̶ó´Â ´Ü¾î´ë½Å¿¡ À§¿¡¼ Á¤ÀÇ ÇÑ ´Ü¾îµéÀ» ¾²°Ô
µÉ °ÍÀÌ´Ù.
9.2. Instruction Pointer ÀÏ´Ü ·¹Áö½ºÅͰ¡ ¹«¾ðÁö ±×·¯°í ¾î¶²ÀÏÀ» ÇÏ´ÂÁö¿¡ ´ëÇØ¼ Á»´õ
ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÀÏ´Ü ¿ì¸®´Â ¸î°¡Áö ·¹Áö½ºÅ͵鿡
´ëÇØ¼ ¹è¿ü´Âµ¥, ¿©±â¿¡¼´Â instruction pointerÀ» ´Ù·ç´Â Á»´õ
Ưº°ÇÑ ·¹Áö½ºÅÍ¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÀÌ ·¹Áö½ºÅÍ´Â %eip·Î
»ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿ì¸®´Â ÄÄÇ»ÅÍ´Â ¸ðµç°É µ¿ÀÏÇÑ µ¥ÀÌÅÍ·Î
Ãë±ÞÇÏ¸ç ¸í·É(instruction)µµ ¿¹¿Ü°¡ ¾øÀ½À» ¾Ë°í ÀÖ´Ù. ÄÄÇ»ÅÍ´Â
ÀÌ°Ô ¸í·ÉÀ̵çÁö ¾Æ´Ï¸é ÀÏ¹Ý µ¥ÀÌÅ͵çÁö µ¿ÀÏÇÏ°Ô Ã³¸®¸¦ Çϸç,
¶ÇÇÑ À̵éÀ» ±¸ºÐÇÒ ´É·ÂÀ» °¡Áö°í ÀÖÁö ¾Ê´Ù.
±×·¸´Ù¸é ÄÄÇ»ÅÍ´Â ¾î¶»°Ô ÀÌ·¯ÇÑ ÀÏ·ÃÀÇ µ¥ÀÌÅÍ¿¡¼ ¸í·ÉÀ» ã¾Æ³»¾î¼
±×°É ½ÇÇàÀ» ½ÃŰ°Ô µÇ´Â °ÍÀϱî ? ÇØ´äÀº instruction pointer¿¡ ÀÖ´Ù.
ÀÌ instruction pointer¶ó´Â À̸§¿¡¼ ¿ì¸®´Â ÀÌ Æ÷ÀÎÅͰ¡ ¹«¾ð°¡¸¦
°¡¸£Å²´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. instruction pointerÀº ´ÙÀ½
¸í·É(instruction)À» °¡¸£Å²´Ù.
ÄÄÇ»ÅÍ´Â instruction pointer¸¦ »ìÆìº½À¸·Î½á, ´ÙÀ½¿¡ ¾î¶² ¸í·ÉÀ» ½ÇÇàÇØ¾ß µÉÁö¸¦ ¾Ë¼ö À̰ڵȴÙ.
ÇØ´ç ¸í·ÉÀ» ½ÇÇàÇÏ°Ô µÇ¸é instruction pointer´Â ´ÙÀ½ ¸í·ÉÀÇ À§Ä¡¸¦
°¡¸®Å°µµ·Ï °ªÀÌ Áõ°¡°¡µÇ¸ç, ÇöÀç ½ÇÇàÇØ¾ßµÉ ¸í·ÉÀ» ¸¶Ä¡°Ô µÇ¸é,
´Ù½Ã instruction pointerÀÇ °ªÀ» »ìÇÇ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¸í·É½ÇÇà ¹æ½ÄÀº
´ëºÎºÐÀÇ °æ¿ì¿¡ À¯È¿ÇÒ °ÍÀÌ´Ù. ±×·¯³ª jmpµîÀ» ÀÌ¿ëÇØ¼ ¸í·ÉÀ»
Á¡ÇÁÇÏ°Ô µÉ°æ¿ì´Â ¾î¶»°Ô µÉ°¡ ? ÀÌ·² °æ¿ì¿¡ ÄÄÇ»ÅÍ´Â ´ÙÀ½ ¸í·ÉÀÌ ¾Æ´Ñ
´Ù¸¥ À§Ä¡ÀÇ ¸í·ÉÀ» ½ÇÇàÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·²°æ¿ì ¿ì¸®´Â ÀϹÝÀûÀ¸·Î ¾Æ·¡¿Í
°°Àº Äڵ带 »ç¿ëÇÏ°Ô µÉ°ÍÀÌ´Ù.
ÀÌ ÄÚµå´Â ¾Æ·¡ÀÇ ÄÚµå¿Í µ¿ÀÏÇÑ ÀÏÀ» ÇÑ´Ù.
¾Ë´Ù½ÃÇÇ somewhere´Â ÇÁ·Î±×·¥ÀÇ ¿µ¿ªÀ» ÂüÁ¶Çϱâ À§ÇÑ
»ó¡ÀÌ´Ù. ±×·¯¹Ç·Î %eip°¡ Á÷Á¢ somewhere¸¦ ÂüÁ¶Çϵµ·Ï ÇÏ´Â °ÍÀº Çã¿ëÀÌ
µÇÁö ¾Ê´Â´Ù. ±×·¯³ª '$'Ç¥½Ã¸¦ ÀÌ¿ëÇÏ°Ô µÉ°æ¿ì À̸¦ Çã¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
ÀÌ´Â $Ç¥½Ã°¡ immediate mode addressiong¸ðµå·Î somewhere¸¦ °ªÀ¸·Î
´Ù·ê ¼ö ÀÖµµ·Ï ÇØÁֱ⠶§¹®ÀÌ´Ù. ¸¸¾à '$'Ç¥½Ã¸¦ »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì
direct addressing mode°¡ µÇ´Âµ¥, ±×·²°æ¿ì somewhereÀÇ ÁÖ¼Ò¿¡ ÀÖ´Â °ªÀÌ
%eip·Î À̵¿ÀÌ µÇ¾î¹ö¸°´Ù. À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â °á°ú°¡ ¾Æ´Ï´Ù.
¾Æ·¡´Â ½ÇÁ¦ ÀÚÁÖ »ç¿ëµÇ´Â ÄÚµå´Ù.
0¾Õ¿¡ $Ç¥½Ã°¡ ºÙ¾î Àִµ¥, À̰ÍÀº immediate-mode instruction¸¦ ÀǹÌÇÏ´Â
°ÍÀ̹ǷΠ0À» ebx¿¡ Áý¾î ³Ö°Ô µÈ´Ù.
¸¸¾à $Ç¥½Ã¸¦ Á¦°ÅÇÏ°Ô µÇ¸é direct addressing mode°¡ µÇ¾î¼
0¹øÁÖ¼ÒÀÇ °ªÀÌ %ebx¿¡ ¹Ð¾î³Ö¾îÁö°Ô µÈ´Ù.
¸Þ¸ð¸®ÀÇ ¾îµå·¹½Ì ¸ðµå¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 2ÀåÀ» Âü°íÇϱ⠹ٶõ´Ù.
9.3. ¸®´ª½º ÇÁ·Î±×·¥¿¡¼ÀÇ ¸Þ¸ð¸® ±¸Á¶ À̹ø ÀåÀÇ ³»¿ëÀº konstantin BoldyshevÀÇ "Startup state of a Linux/i386 ELF binary"¹®¼¿¡ ±â¹ÝÀ» µÎ°í ÀÖ´Ù.
°ü·ÃµÈ ¹®¼´Â http://linuxassembly.org/start.htmlÀ» Âü°íÇϱ⠹ٶõ´Ù.
´ç½ÅÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸®¿¡ ÀûÀçµÉ¶§, °¢°¢ÀÇ .sectionÀÇ À̸§ÀÌ °¡¸®Å°´Â
ÁöÁ¡ÀÌ ·ÎµåµÈ´Ù. ½ÇÁ¦ÄÚµå (.text section)Àº 0x0848000 ÁÖ¼Ò¿¡
·ÎµåµÈ´Ù. .data¼½¼ÇÀÌ ±×´ÙÀ½¿¡ À§Ä¡ÇÏ°Ô µÇ°í, ±×µÚ¿¡ .bss ¼½¼ÇÀÌ À§Ä¡ÇÏ°Ô µÈ´Ù.
.bss ´Â ¹öÆÛ¿µ¿ªÀ¸·Î ¿ì¸®°¡ »ç¿ëÇÒ ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀ» ¹Ì¸®È®º¸ÇÒ ¼ö ÀÖ°Ô µµ¿ÍÁØ´Ù.
¿ì¸®´Â run-timeÀü±îÁö´Â .bss¿¡ °ªÀ» ¹Ð¾î ³ÖÀ» ¼ö ¾ø´Ù. .data¼½¼ÇÀÇ °æ¿ì¿¡´Â
°ø°£À» ÇÒ´ç(.long µîÀ» ÀÌ¿ëÇØ¼)ÇÏ°í °Å±â¿¡ ÇÊ¿äÇÑ °ªÀ» Áï½Ã ¹Ð¾î ³ÖÀ» ¼ö ÀÖ´Ù.
ÀÌ °ªµéÀº ÇÁ·Î±×·¥ÀÌ ÄÄÆÄÀÏµÇ¾î¼ ¸¸µé¾î Áú¶§, ÇÁ·Î±×·¥ ÆÄÀÏ¿¡ Á÷Á¢ µé¾î°¡°Ô µÈ´Ù.
¹Ý¸é .bss ¼½¼ÇÀÇ °æ¿ì ÇÁ·Î±×·¥ÀÌ ½ÇÇàÀü¿¡´Â ÃʱâÈ µÇÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¥
ÆÄÀÏ ÀÚü¿¡ ¾î¶°ÇÑ °ªÀ» ÀúÀåÇÒ ¼ö ¾ø´Ù. ¿©±â¿¡´Â ´ÜÁö ¾î´ÀÁ¤µµÀÇ ÀúÀå°ø°£ÀÌ ÇÊ¿äÇÑÁö
¿¡ ´ëÇÑ Á¤º¸¸¸ÀÌ ÀÖÀ» »ÓÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ ³»¿ëÀº µÚ¿¡ ÀÚ¼¼È÷ ¾Ë¾Æº¸·Ï ÇÒ°ÍÀÌ´Ù.
¸¶Áö¸· ÀúÀ念¿ªÀº 0xbffffffffÀÇ ÁÖ¼Ò¸¦ °¡Áø´Ù. .text, .data, .bass ¼½¼ÇÀº 0x0804800
ÀÌÈÄ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. .start ¼½¼ÇÀº À§ÀÇ ÁÖ¼Ò¿µ¿ª »çÀÌ¿¡ À§Ä¡ÇÏ°Ô µÇ¸ç,
óÀ½ µÎ¹ÙÀÌÆ®´Â 0À¸·Î ä¿öÁö°í ±×´ÙÀ½¿¡ ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ ¿Â´Ù. ÇÁ·Î±×·¥ÀÇ À̸§ÀÇ
³¡Àº NULL ¹®ÀÚ (\0)±îÁö·Î °áÁ¤µÈ´Ù. ÇÁ·Î±×·¥À̸§ ´ÙÀ½¿¡´Â ȯ°æº¯¼ö(12)°¡ À§Ä¡ÇϰÔ
µÈ´Ù. ±×´ÙÀ¸ ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ°¡ ¿À°Ô µÈ´Ù. ÇÁ·Î±×·¥ÀÎÀÚ´Â ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¶§
À¯Àú¿¡ ÀÇÇØ¼ ÇÁ·Î±×·¥¿¡ Àü´ÞµÇ´Â °ªÀÌ´Ù. ¿¹¸¦ µé¾î¼ "maximum"À̶õ ÇÁ·Î±×·¥À»
½ÇÇà½ÃŲ´Ù¶ó°í Çϸé, ./maximum À» ŸÀÌÇÎ ÇØ¼ ½ÇÇàÇÏ°Ô µÇ´Âµ¥ ./maximum ÀÌ ÇÁ·Î±×·¥
ÀÎÀÚ°¡ µÈ´Ù. À̰æ¿ìÀ¸³Ù ´ÜÁö ÇϳªÀÇ ÀÎÀÚ°¡ ÇÁ·Î±×·¥À¸·Î Àü´ÞµÉ °ÍÀÌ´Ù.
ÇÏÁö¸¸ Çʿ信 µû¶ó¼ ."/maximum 48 59"¿Í °°ÀÌ ÇϳªÀÌ»óÀÇ ÀÎÀÚ°¡ µé¾î°¥ ¼öµµ ÀÖ´Ù.
´ÙÀ½À¸·Î stack(12) ¿µ¿ªÀÌ ÀÖ´Ù. ½ºÅÃÀº Àӽ÷ΠÀڷḦ ÀúÀåÇϱâ À§ÇÑ ¿µ¿ªÀ¸·Î
ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ¹Ð¾î³Ö°Å³ª °¡Á®¿Ã ¼ö ÀÖ´Ù. ½ºÅÃÀÇ Á¦ÀÏ Ã³À½(²À´ë±â)´Â %esp¸¦
ÀÌ¿ëÇØ¼ °¡¸®Å³ ¼ö ÀÖÀ¸¸ç, °ªÀ» Áõ°¡½ÃÅ´À¸·Î½á, ½ºÅÃÀ» Ž»öÇÒ ¼ö ÀÖ´Ù. ½ºÅÿ¡
¾î¶² °ªÀ» ÀÔ·ÂÇϸé, ½ºÅÃÀº ÀÚ¿¬½º·´°Ô ´ÙÀ½ °ªÀ» °¡¸®Å²´Ù. Áï °ªÀ» ¹Ð¾î³Ö°Ô µÇ¸é
½ºÅÃÆ÷ÀÎÅͰ¡ °¨¼ÒÇÏ°í °ªÀ» °¡Á®¿À¸é(pop) ½ºÅÃÆ÷ÀÎÅͰ¡ Áõ°¡ÇÏ´Â ¹æ½ÄÀÌ´Ù.
À§ÀÇ ÄÚµå´Â ¾Æ·¡¿Í µ¿ÀÏÇÏ´Ù.
movl %eax, (%esp)
subl $4, %esp
|
%eax´Â 4¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °¡Áø´Ù. À̰ÍÀ» ½ºÅÿ¡ ¹Ð¾î ³Ö¾úÀ¸´Ï, ´ÙÀ½°ªÀ» ³ÖÀ» ¶§¿¡´Â
4¹ÙÀÌÆ® ¸¸Å µÚ·Î ¹Ð·Á¼ °ªÀ» ³Ö¾î¾ß ÇÒ °ÍÀÌ´Ù. À̸¦ À§Çؼ sublÀ» ÀÌ¿ëÇØ¼ %esp¿¡¼
4¸¸ÅÀ» »©ÁÖ¾ú´Ù.
À§ÀÇ ÄÚµå´Â popÀ» ÇѰæ¿ìÀε¥, ¾Æ·¡¿Í µ¿ÀÏÇÏ´Ù.
movl (%esp), %eax
addl $4, %esp
|
%esp¿¡ °ýÈ£°¡ ÀÖ´Â ÀÌÀ¯´Â %espÀÇ ÁÖ¼Ò°ªÀÌ ¾Æ´Ñ %esp°¡ °¡¸®Å°´Â °÷ÀÇ °ªÀ» °¡Á®¿À±æ
¿øÇϱ⠶§¹®ÀÌ´Ù. 4¹ÙÀÌÆ® Å©±âÀÇ °ªÀ» ²¨³»¿Ô±â ¶§¹®¿¡,
%esp¿¡¼ 4¸¸ÅÀ» ´õÇØÁ༠½ºÅÃÀÇ ´ÙÀ½ °ªÀ» °¡¸®Å°µµ·Ï ÇØÁÖ¾ú´Ù.
ÀÌ·¸°Ô ÇØ¼ stack´Â °ªÀ» °¨¼Ò½Ã۰í, .bss¼½¼ÇÀº °ªÀ» Áõ°¡½ÃŲ´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¾ú´Ù.
À̵é Áß°£¿µ¿ªÀº break ¶ó°í ºÒ¸®¿ì¸ç, Ä¿³ÎÀº breakÀ» ¹þ¾î³ª¼ ¼·ÎÀÇ ¿µ¿ªÀ» ħ¹üÇÏÁö
¾Êµµ·Ï °ü¸®¸¦ Çϰí ÀÖ´Ù. ¸¸¾à ¼·ÎÀÇ ¿µ¿ªÀ» ħ¹üÇÏ°Ô µÇ¸é ÇÁ·Î±×·¥Àº
"segmentation falut" ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí Á¾·áµÈ´Ù. ¸¶Âù°¡Áö·Î ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ
0x08048000ÀÌÀüÀÇ µ¥ÀÌÅÍ¿µ¿ª¿¡ Á¢±ÙÇÒ°æ¿ì¿¡µµ µ¿ÀÏÇÑ ¿¡·¯¸Þ½ÃÁö¿Í ÇÔ²² Á¾·á°¡
µÈ´Ù.
9.4. Every Memory Address is Lie ±×·³ ¿Ö ÄÄÇ»ÅÍ´Â break ¿µ¿ªÀ» ¿¢¼¼½º ÇÏ´Â°É Çã¿ëÇÏÁö ¾Ê´Â °ÍÀϱî ?
À̵¥ ´ëÇÑ ´äÀ» ¾ò±â À§Çؼ´Â ÄÄÇ»ÅͰ¡ ¸Þ¸ð¸®¸¦ ¾î¶»°Ô ´Ù·ç´ÂÁö¿¡ ´ëÇÑ
Á»´õ ±íÀº ÀÌÇØ°¡ ÇÊ¿äÇÏ´Ù.
¿©±â¿¡¼ ¿©·¯ºÐÀº ¸ðµç ÇÁ·Î±×·¥ÀÌ °°Àº ¸Þ¸ð¸® ¿µ¿ªÀ» »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇÑ
±Ã±ÝÁõÀÌ »ý±æ °ÍÀÌ´Ù. ±×·±µ¥ ÀÌ·¸°Ô µÉ°æ¿ì ´Ù¸¥ ÇÁ·Î±×·¥ÀÌ µ¥ÀÌÅ͸¦
µ¤¾î¾²°Å³ª »èÁ¦ÇÏ´Â°Ô °¡´ÉÇØÁú °ÍÀ̹ǷÎ, ÀÌ´Â ÇÁ·Î±×·¥ÀÇ ÀÛµ¿¿¡
Ä¡¸íÀûÀÎ ¿µÇâÀ» ³¢Ä¡°Ô µÉ °ÍÀÌ´Ù. ¾Õ ÀåÀ» º¸´õ¶óµµ, ¸ðµç ÇÁ·Î±×·¥Àº µ¿ÀÏÇÑ
ÁÖ¼Ò¿¡¼ ½ÃÀÛÇÏ´Â °ÍÀ¸·Î º¸ÀδÙ.
±×·¯³ª ½ÇÁ¦ ÀÌ·±ÀÏÀº ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ´ç½ÅÀÇ ÇÁ·Î±×·¥Àº ´ÜÁö virtual_memory(12) ¿¡¸¸
Á¢±Ù °¡´ÉÇϱ⠶§¹®ÀÌ´Ù. ¿©·¯ºÐÀÌ »ç¿ëÇÏ´Â PC(12)¸¦ Æ÷ÇÔÇÑ °ÅÀÇ ´ëºÎºÐÀÇ ÇÁ·Î±×·¥Àº
¹°¸®ÀûÀÎ RAM(12)À» °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. º¸Åë 256¿¡¼ 1024Megabyte Á» ´õ ºÎÀ¯ÇÑ °æ¿ì
±× ÀÌ»óÀÇ ·¥À» °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. ¿ì¸®°¡ ¸»ÇÏ´Â ¹°¸®Àû ¸Þ¸ð¸® ÁÖ¼Ò¶õ ÀÌ·¯ÇÑ ¸Þ¸ð¸®ÀÇ
Ĩ¿¡ Á÷Á¢ÀûÀ¸·Î ºÎ¿©µÈ ¿µ¿ªÀ» ¸»ÇÑ´Ù. ±×·¸´Ù¸é °¡»ó ¸Þ¸ð¸®¶õ ¹«¾ùÀΰ¡ ?
°¡»óÀÇ ¸Þ¸ð¸®¶õ ÇÁ·Î±×·¥ÀÌ »ý°¢ÇÏ´Â ¸Þ¸ð¸®¶ó°í °£´ÜÈ÷ »ý°¢ÇÒ ¼ö ÀÖ´Ù.
¿©·¯ºÐÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é, ÇÁ·Î±×·¥ÀÌ ·ÎµåµÇ±â Àü¿¡ Linux(12)´Â ¹°¸®Àû
¸Þ¸ð¸®¿µ¿ª¿¡¼ »ç¿ë°¡´ÉÇÑ ºñ¾îÀÖ´Â Áö¿ªÀ» ã¾Æ³»¾î¼, ÇÒ´çÇØ ÁÖ°í,
ÀÌ ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦ 0x0804800 À̶ó°í ¾Ë·ÁÁÖ°Ô µÈ´Ù. Áï ÇÁ·Î±×·¥¸¶´Ù ÀÚ½ÅÀÇ
µ¶¸³ÀûÀÎ °¡»óÀÇ °ø°£À» ¸¸µé¾î ÁÖ´Â °ÍÀÌ´Ù.
ÀÌ·¸°Ô ÇÁ·Î±×·¥Àº ÀڽŸ¸ÀÇ °¡»óÀÇ °ø°£À» ¸¸µé°í, ÀÌ °ø°£¿¡¼ ³î°Ô µÈ´Ù.
´ç½ÅÀÇ ÄÄÇ»ÅÍ¿¡¼ ½ÇÇàµÇ´Â ¸ðµç ÇÁ·Î±×·¥Àº ÀÌ °¡»óÀÇ °ø°£ÀÇ 0x0804800 ÁÖ¼Ò¿¡
¿Ã·ÁÁö°í, ½ºÅÃÀº 0xbffffff¿¡¼ ½ÃÀÛÀÌ µÈ´Ù. ÀÌ·¯ÇÑ °¡»óÀÇ °ø°£¿¡ ÁÖ¾îÁö´Â
°¡»óÀÇ ÁÖ¼Ò¸¦ virtual address¶ó°í ÇÑ´Ù. ¸ðµç ÇÁ·Î±×·¥Àº °¡»óÀÇ ÁÖ¼Ò¸¦ ÀÌ¿ëÇØ¼
µ¥ÀÌÅ͸¦ ¾²°Å³ª ÀÐÁö¸¸, ½ÇÁ¦ µ¥ÀÌÅÍ´Â °¡»óÀÇ ÁÖ¼Ò¿¡ ¸ÊÇεǴ ¹°¸®ÀûÀÎ ÁÖ¼Ò¿¡
¾²¿©Áö°Ô µÈ´Ù. ÀÌ·¸°Ô °¡»óÀÇ ÁÖ¼Ò¸¦ ¹°¸®ÀûÀÎ ÁÖ¼Ò¿¡ ´ëÀÀ½ÃÄÑÁÖ´Â °úÁ¤À»
mapping À̶ó°í ÇÑ´Ù.
ÀÌÀüÀå¿¡¼ ¿ì¸®´Â bss¿Í stack»çÀÌÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» break¶ó°í Á¤ÀÇÇÑ´Ù°í ¹è¿ü¾ú´Ù.
±×·¯³ª ÀÌ·¯ÇÑ break°¡ Á¸ÀçÇÏ´Â ÀÌÀ¯¿¡ ´ëÇØ¼ ¼³¸íÇÏÁø ¾Ê¾Ò´Âµ¥, ±× ÀÌÀ¯¿¡ ´ëÇØ¼
¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
°¡»ó¸Þ¸ð¸® ¼¼±×¸ÕÆ®´Â ±âº»ÀûÀ¸·Î ¿Ïº®ÇÏ°Ô ¹°¸®Àû ¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿Í ¸ÊÇÎÀ» ½Ãų ¼ö´Â
¾ø´Ù. ¸ÊÇ뵃 ½Ã°£°ú °ø°£À» Á¤È®È÷ °í·ÁÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¯´Ù º¸´Ï bss¿Í stack
»çÀÌ¿¡ °¡»ó¸Þ¸ð¸® ÁÖ¼Ò·Î ¸ÅÇÎÀÌ µÇÁö ¾Ê´Â ¿µ¿ªÀÌ »ý°Ü³¯ ¼ö ÀÖ´Ù. ÀÌ ºÎºÐÀº
ÇÁ·Î±×·¥¿¡¼ Á¦¾îÇÒ ¼ö ¾ø´Â ¿µ¿ªÀ̱⠶§¹®¿¡ break¿µ¿ªÀÌ µÇ´Â °ÍÀÌ´Ù.
°¡»ó ¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÔÀ¸·Î ½á ¾òÀ» ¼ö ÀÖ´Â ´Ù¸¥ À̵浵 ÀÖ´Ù. ±»ÀÌ ¹°¸®ÀûÀÎ ¸Þ¸ð¸®°¡
¾Æ´Ñ Çϵåµð½ºÅ©µîµµ ¸Þ¸ð¸®¿µ¿ªÀ¸·Î »ç¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¸ÊÇθ¸ ½ÃÄÑÁÖ¸é °£´ÜÇÑ
¹®Á¦´Ù. ´ç½ÅÀÇ ÄÄÇ»ÅͰ¡ 16MegaÀÇ ¸Þ¸ð¸®¸¦ °¡Áö°í ÀÖ´Ù°í °¡Á¤Çغ¸µµ·Ï ÇÏÀÚ.
ÀÌÁß 8Mega Á¤µµ´Â Linux¿Í ¸î °¡Áö ±âº»ÀûÀÎ ÀÀ¿ëÇÁ·Î±×·¥µéÀÌ »ç¿ëÇϰí ÀÖ´Ù.
±×¸®°í ´ç½ÅÀº gimp¸¦ ½ÇÇà½ÃÄѼ ±×·¡ÇÈ ÀÛ¾÷À» Çϱ⠿øÇϴµ¥, ÃÖ¼ÒÇÑ 20Mega Á¤µµÀÇ
°ø°£À» ÇÊ¿ä·Î ÇÑ´Ù. ±×·±µ¥ ½ÇÁ¦ ³²Àº °ø°£Àº 8Mega Á¤µµ·Î gimp¸¦ ½ÇÇà½Ãų¸¸ÇÑ ¸Þ¸ð¸®
°ø°£ÀÌ ³²¾ÆÀÖÁö¸¦ ¾Ê´Ù. ±×·¯³ª ¿ì¸®´Â ¹°¸®Àû ¸Þ¸ð¸® °ø°£ÀÌ ºÎÁ·ÇÏ´õ¶óµµ ÇÁ·Î±×·¥À»
½ÇÇà½ÃŰ´Â ¹æ¹ýÀ» ¾Ë°í ÀÖ´Ù. swap ÆÄƼ¼Ç(ȤÀº ½º¿ÒÆÄÀÏ)À» ÀÌ¿ëÇÏ¸é µÈ´Ù.
±×·¯¸é LinuxÀÇ °¡»ó¸Þ¸ð¸® °ü¸® ÇÁ·Î¼¼½º´Â ºÎÁ·ÇÑ ¾ç¸¸ÅÀ» swap¿µ¿ª¿¡¼ °¡Á®¿Í¼ ¾²°Ô µÇ¹Ç·Î
¹®Á¦¾øÀÌ gimp¸¦ ½ÇÇà½Ãų ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ·¸°Ô °¡»ó ¸Þ¸ð¸®±â¹ýÀ» Àû¿ëÇÔÀ¸·Î½á,
ÇÁ·Î±×·¥Àº ÄÄÇ»ÅͰ¡ Á¦°øÇÏ´Â ÀÌ»óÀÇ ¸Þ¸ð¸® °ø°£À» »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
¸Þ¸ð¸®´Â pages¶ó´Â ±×·ìÀ¸·Î ¹¿©¼ ³ª´µ°Ô µÈ´Ù. x86ÇÁ·Î¼¼½º¿¡¼
½ÇÇàµÇ´Â ¸®´ª½º¿¡¼ ÇÑ ÆäÀÌÁö´Â 4096 byteÀÇ Å©±â¸¦ °¡Áø´Ù. ¸ðµç ¸Þ¸ð¸®´Â ÆäÀÌÁö´ÜÀ§·Î
¸ÅÇÎÀÌ µÈ´Ù.
9.5. Getting More Memory ¿ì¸®´Â ¸®´ª½ºÀÇ °¡»ó¸Þ¸ð¸®°¡ ¸®¾ó¸Þ¸ð¸®¿Í swap¸¦ ÇÔ²² ÀÌ¿ëÇϰí ÀÖ´Ù´Â °ÍÀ» ¾Ë°í ÀÖ´Ù.
¸¸¾à ´ç½ÅÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¾ÆÁ÷ ¸ÊÇεÇÁö ¾ÊÀº °¡»ó¸Þ¸ð¸®¸¦ Á¢±ÙÇÏ·Á°í ÇÑ´Ù¸é,
segmentation fault ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ¸é¼ Á¾·áµÇ´Â °É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¹®Á¦´Â ¿©·¯ºÐÀÌ data section¿¡ ¿©·¯ºÐÀÌ ÇÊ¿äÇÑ ¸¸ÅÀÇ ÃæºÐÇÑ ¸Þ¸ð¸® °ø°£À» ¹Ì¸®
È®º¸Çϵµ·Ï ÇØ¼ break point¸¦ ħ¹üÇÏÁö ¾Êµµ·Ï Çϸé ÇØ°áÀÌ °¡´ÉÇÏ´Ù.
±×·¯³ª ¾î´ÀÁ¤µµÀÇ ¸Þ¸ð¸® °ø°£À» ÇÒ´çÇØ¾ß ÇÒÁö ¾Ë¾Æ³»±â Èûµç °æ¿ì°¡ ¹ß»ýÇÑ´Ù.
¿¹¸¦ µé¾î¼ vi(12)¿Í °°Àº ÆíÁý±â¸¦ ¸¸µé°æ¿ì, ÆíÁý±âÀÇ »ç¿ëÀÚ°¡ ¾î´ÀÁ¤µµÀÇ ¹®ÀÚ¸¦ ¾²°Ô µÉÁö
¾Ë ¼ö ¾ø°Ô µÈ´Ù. ÇÑÁÙÁ¤µµ·Î ÆíÁýÀ» ¸¶Ä¡°í ÀúÀåÇÒ ¼ö ÀÖÁö¸¸, ¼ö½Ê¸Þ°¡ ÀÌ»óÀÇ µ¥ÀÌÅ͸¦
¾µ ¼ö µµ ÀÖ´Ù. ¹°·Ð ÇÑ 1±â°¡ Á¤µµ ¸Þ¸ð¸®¸¦ ÇÒ´çÇØ ¹ö¸®´Â °æ¿ì¸¦ »ý°¢Çغ¼ ¼ö ÀÖÁö¸¸ ´ÜÁö 80
¹ÙÀÌÆ®ÀÇ ¹®ÀÚ¸¦ ¾²±â¸¦ ¿øÇÒ°æ¿ì ¾öû³ ³¶ºñ°¡ ¹ß»ýÇÏ°Ô µÈ´Ù.
Linux(12)´Â ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ break point¸¦ À̵¿ÇÒ ¼ö ÀÖ°Ô²û ¼ö´ÜÀ» Á¦°øÇϰí ÀÖ´Ù.
¸¸¾à ´õ ¸¹Àº ¸Þ¸ð¸® °ø°£ÀÌ ÇÊ¿äÇÒ °æ¿ì À̸¦ ¸®´ª½º¿¡ ¿äûÀ» Çϸé, ¸®´ª½º´Â ÇÊ¿äÇÑ ¸¸ÅÀÇ
¸Þ¸ð¸®¸¦ ¸ÊÇνÃÄÑÁÖ°í break point¸¦ ÀÌ¿¡ ¸Â°Ô À̵¿½ÃÄÑ ÁØ´Ù.
ÀÌ·¸°Ô ¸Þ¸ð¸®¸¦ ÃßÀûÇÏ¸é¼ break point¸¦ º¯°æ½ÃŰ´Â ¹æ¹ýÀº ÇѰ¡Áö ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù.
¿¹¸¦ µé¾î ¿©·¯ºÐÀÌ ÆÄÀÏÀ» ¿¾î¼ µ¥ÀÌÅ͸¦ Àоîµé¿´´Ù¸é, break point¸¦ º¯°æ½ÃÄѼ ÇÊ¿äÇÑ
¸¸ÅÀÇ ¸Þ¸ð¸® °ø°£À» È®º¸ÇÏ°Ô µÉ°ÍÀÌ´Ù. ¿©±â¿¡¼ »õ·Î¿î ÆÄÀÏÀ» ÀоîµéÀ̱â À§Çؼ´Â
¶Ç ´Ù½Ã break pointÀÇ À̵¿ÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ÀÌ break point´Â ù¹øÂ° ÆÄÀÏÀÇ ¿µ¿ªÀ» ¹þ¾î³
À§Ä¡¿¡ Á¸ÀçÇÏ°Ô µÉ °ÍÀ̹ǷÎ, ¸ÊÇÎÀº µÇ¾úÁö¸¸ »ç¿ëÇÏÁö ¾Ê´Â ³²´Â °ø°£ÀÌ »ý¼ºµÇ°Ô µÈ´Ù.
ÀÌ¹Ì ¸ÊÇÎÀÌ µÇ¾îÀÖÀ¸¹Ç·Î, ´Ù¸¥ ÇÁ·Î±×·¥Àº ÀÌ ¿µ¿ªÀ» »ç¿ëÇÒ ¼ö ¾ø°Ô µÈ´Ù.
¸¸¾à ÀÌ·¯ÇÑ ÀÏÀÌ °è¼ÓÀûÀ¸·Î ¹Ýº¹µÈ´Ù¸é, ¸Þ¸ð¸® ´©¼ö Çö»óÀÌ ¹ß»ýÇÏ°Ô µÉ °ÍÀÌ´Ù.
±×·¡¼ ¸Þ¸ð¸® °ü¸®°¡ ÇÊ¿äÇÏ°Ô µÈ´Ù. ¸Þ¸ð¸® °ü¸®´Â '''allocate'''¿Í '''deallocate'''ÀÇ µÎ°³ÀÇ
±âº»ÀûÀÎ ÇÔ¼ö¸¦ ÅëÇØ¼ ÀÌ·ç¾îÁö°Ô µÈ´Ù. ¸Þ¸ð¸®°¡ ÇÊ¿äÇÏ´Ù¸é allocate¸¦ È£ÃâÇØ¼ ÇÊ¿äÇÑ
°ø°£À» ÇÒ´ç¹Þ°í, ÇÊ¿ä ¾øÀ» °æ¿ì deallocate¸¦ È£ÃâÇØ¼ À̸¦ ¹ÝȯÇÏ°Ô µÈ´Ù.
9.6. ¸Þ¸ð¸® °ü¸® ±×·³ ¾î¶²½ÄÀ¸·Î ¸Þ¸ð¸®¸¦ °ü¸®ÇÏ´ÂÁö¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
#
.section .data
######### GLOBAL VARIABLE ###########
heap_begin:
.long 0
current_break:
.long 0
###### CONSTANTS ########
.equ UNAVAILABLE, 0
.equ AVAILABLE, 1
.equ BRK, 45 # brk(2) System Call
.equ LINUX_SYSTEMCALL, 0x80
###### STRCUTURE INFORMATION #######
.equ HEADER_SIZE, 8
.equ HDR_AVAIL_OFFSET, 0
.equ HDR_SIZE_OFFSET, 4
.section .text
######### FUNCTION ###########
## allcate_init
# PURPOSE : call this function initialize the functions
# specifically, this sets heap_begin and current_break.
# this has no parameters and no return value.
.globl allocate_init
.type allocate_init, @function
allocate_init:
pushl %ebp
movl %esp, %ebp
# brk(2) system call
movl $BRK, %eax
movl $0, %ebx
int $LINUX_SYSCALL
incl %eax # %eax now has last valid
# address, and we want the memory
#location after that
movl %eax, current_break #store the current break
movl %eax, heap_begin #store the current break as our
#first address. this cause the allocate function
# to get more memory from Linux the first
#time it is run
movl %ebp, %esp #exit function
popl %ebp
ret
##### END OF FUNCTION #####
##allocate##
#PURPOSE: This function is used to grab a section of memory.
# It checks to see if there are any free blocks, and,
# if not, it asks Linux for a new one.
#PARAMETERS: This function has one parameter - the size of the memory
# block we want allocate
#RETURN VALUE:
# This function returns the address of allocated
# memory in %eax. if there is no memory available, it will
# return 0 in %eax
##### PROCESSING ######
#Variables used;
#
# %ecx - hold the size of requested memory
# %eax - current memory segment being examined
# %ebx - current break position
# %edx - size of current memory segment
# We scan through each memory segment starting with heap_begin.
# We look at the size of each one, and if it has been allocated.
# If it's big enough for the requested size. and its available,
# if grabs that one. If it does not find a segment large enough,
# it asks Linux for more memory. In that case, it moves
# current_break up
.globl allocate
.type allocate,@function
.equ ST_MEM_SIZE, 8
allocate:
pushl %ebp
movl %esp, %ebp
movl ST_MEM_SIZE(%ebp), %ecx # %ecx will hold the size we are
# looking for
movl heap_begin, %eax # %eax will hold the current search
# location
movl current_break, %ebx # %ebx will hold the current break point
alloc_loop_begin: #here we iterate through each
#memory segment
cmpl %ebx, %eax #need more memory if these are equal
je move_break
movl HDR_SIZE_OFFSET(%eax), %edx #grab the size of this memory
cmpl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax) # If the space unavailable, go the
je next_location #next one
cmpl %edx, %ecx #If the space is avalable, compare
jle allocate_here #the size to the needed size. If its
#big enough, go to allocate_here
#may want to add code here to
#combine allocations
next_location:
addl $HEADER_SIZE, %eax #The total size of the memory segment
addl $edx, $eax #is the sum of the size requested
#(currently stored in %edx), plus another
#8 storage locations for the header
#(4 for the AVAILABLE/UNAVAILABLE flag,
#and 4 for the size of the segment). so
#adding %edx and $8 to %eax will get
#the address of the next memory segment
jmp alloc_loop_begin
allocate_here:
movl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax) #mark space as unavailable
addl $HEADER_SIZe, %eax
movl %ebp, %esp
popl %ebp
ret
move_break:
addl $HEADER_SIZE, %ebx #noew we need to increase %ebx to
addl %ecx, %ebx #where we _want_ memory to end, so we
#add space for the headers structure
#add space to the break for
#the data requested
#now its time to ask Linux for more
#memory
pushl %eax #save needed registers
pushl %ecx
pushl %ebx
movl %BRK, %eax
int $LINUX_SYSCALL
cmpl $0, %eax
jre error
popl %ebx #restore saved registers
popl %ecx
popl %eax
movl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax) #set this memory as
#unavailable, since we're about to
#give it away
movl %ecx, HDR_SIZE_OFFSET(%eax) #set the size of the memory
addl $HEADER_SIZE, %eax #move %eax to the actual start of
#usable memory. %eax now holds the
#return value
movl %ebx, current_break
movl %ebp, %esp
popl %ebp
ret
error:
movl $0, %eax
movl %ebp, %esp
popl %ebp
ret
####### END OF FUNCTION #######
## deallocate ##
# PURPOSE : The Purpose of this function is to give back
# a segment of memory to the poll after we're done
# using it.
#
# PARAMETERS : The only parameter is the address of the memory we want to
# return to the memory pool
# RETURN VALUE : There is no return value
# PROCESSING :
# If you remmember, we actually hand program the
# start of the memory that they can use, which is
# 8 storage locations after the actual start of the
# memory segment. All we have to do is go back
# 8 locations and mark that memory as available,
# so that the allocate function knows it can use it.
.globl deallocate
.type deallocate, @function
.equ ST_MEMORY_SEG, 4 # stack position of
deallocate:
# since the function is so simple, we
#don't need any of the fancy function
# stuff
movl ST_MEMORY_SEG(%esp), %eax # get the address of the memory to free
#(normally this is 8(%ebp), buf since
#we didn't push %ebp or move %esp to
#%ebp, we can just do 4(%esp)
subl $HEADER_SIZE, %eax #get the pointer to real beginning
#of the memory
movl $AVAILABLE, HDR_AVAIL_OFFSET(%eax) #mark it as available
ret
####### ENF OF FUNCTION ########## |
À§ ÄÚµå´Â ±× ÀÚü°¡ ¿ÏÀüÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï´Ù. ´ÜÁö program ¼½¼Ç¸¸ °¡Áö°í ÀÖÀ¸¸ç, ¶§¹®¿¡ _start ½Éº¼À»
°¡Áö°í ÀÖÁö ¾Ê´Ù´Â Á¡À» ÁÖ¸ñÇϱ⠹ٶõ´Ù. ±×·¯¹Ç·Î ´Üµ¶À¸·Î ½ÇÇàµÉ ¼ö ¾øÀ¸¸ç, ´Ù¸¥ Äڵ忡 ¸µÅ©µÇ¾î¼
ÇØ´ç ÇÔ¼ö¸¦ È£ÃâÇÏ´Â Çü½ÄÀ¸·Î¸¸ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¾Æ¸¶µµ C¸¦ ÀÌ¿ëÇØ¼ ´ÙÁß¼Ò½º ÄÄÆÄÀÏÀ» ÇØº¸¾Ò´Ù¸é ½±°Ô
ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ³ªÁß¿¡ ´Ù·çµµ·Ï ÇÒ °ÍÀÌ´Ù. ÀÏ´ÜÀº ´ÙÀ½°ú °°ÀÌ objectÇü½ÄÀ¸·Î
¸¸µéµµ·Ï ÇÑ´Ù.
ÀÌÁ¦ Äڵ带 ºÐ¼®ÇØ º¸µµ·Ï ÇÏÀÚ.
9.7. º¯¼ö¿Í »ó¼öµéheap_begin:
.long 0
current_break:
.long 0 |
À§ ÄÚµå´Â ÇÁ·Î±×·¥ÀÇ Ã¹ ºÎºÐÀ¸·Î heap¿µ¿ªÀ» °¡¸®Å°±âÀ§Çؼ »ç¿ëÇÑ´Ù.
¾î¼Àºí¸® ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§ ¿ì¸®´Â heap¿µ¿ªÀÇ ½ÃÀÛÀ§Ä¡¸¦ ¾Ë ¼ö°¡ ¾øÀ¸¸ç,
¶§¹®¿¡ break point¸¦ °áÁ¤ÇÒ ¼öµµ ¾ø´Ù. ±×·¡¼ 0À¸·Î ÀÏ´Ü Ã¤¿öµÎ¾ú´Ù. ÁÖ¼®À» º¸¸é
global variable(Àü¿ªº¯¼ö)¶ó°í ÇØµÐ°É º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÁ·Î±×·¥À»
ÀÛ¼ºÇÏ´Ùº¸¸é Àü¿ªº¯¼ö³ª Áö¿ªº¯¼ö¶ó´Â ¸»À» ¸¹ÀÌ µé¾î º¸¾ÒÀ» °ÍÀÌ´Ù.
Áö¿ªº¯¼ö´Â procedure°¡ ½ÇÇàµÉ ¶§ ½ºÅÿ¡ ÇÒ´çµÇ´Â º¯¼ö¸¦ ¸»ÇÑ´Ù. ¹Ý¸é Àü¿ªº¯¼ö´Â
ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§, Á¤ÀÇ¿Í ÇÒ´çÀÌ ÀÌ·ç¾îÁø´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î Àü¿ªº¯¼ö´Â
ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ ¶§±îÁö ÇÁ·Î±×·¥ Àü¿ª¿¡ °ÉÃļ »ç¿ëµÇ¾îÁö¸ç, Áö¿ªº¯¼ö´Â ÇÁ·Î½ÃÁ®ÀÇ Á¾·á¿Í
µ¿½Ã¿¡ »ç¶óÁö°Ô µÈ´Ù. ÀϹÝÀûÀ¸·Î ÁÁÀº ÇÁ·Î±×·¥Àº Áö¿ªº¯¼ö¸¦ ÁÖ·Î »ç¿ëÇϸç, Àü¿ªº¯¼ö´Â
Á¦ÇÑÀûÀ¸·Î »ç¿ëÇÑ´Ù. Áö¿ªº¯¼ö¿¡ ´ëÇØ¼´Â ³ªÁß¿¡ Á»´õ ÀÚ¼¼È÷ ´Ù·çµµ·Ï ÇϰڴÙ.
´ÙÀ½Àº »ó¼ö(constants)¿µ¿ªÀÌ´Ù. »ó¼ö´Â ¾î¶² °ªÀ» »ç¿ëÇϱ⠽±µµ·Ï ÀçÁ¤ÀÇ
ÇÑ Symbol À̶ó°í º¸¸é µÈ´Ù. ¾Æ·¡ÀÇ ¿¹¸¦ º¸µµ·Ï ÇÏÀÚ.
.equ UNAVAILABLE, 0
.equ AVAILABLE, 1 |
ÀÌ´Â UNAVAILABE¸¦ »ç¿ëÇÒ°æ¿ì ÀÌ´Â ¼ýÀÚ 0À» »ç¿ëÇϸç, AVAILABLE¸¦ »ç¿ëÇÒ °æ¿ì ¼ýÀÚ 1ÀÌ
»ç¿ëµÇ¾î ÁüÀ» ÀǹÌÇÑ´Ù. ¸¸¾à ÀÌ·¯ÇÑ »ó¼ö´ë½Å¿¡, ÄÚµå Áß¿¡ 0°ú 1À» Á÷Á¢ »ç¿ëÇÏ°Ô µÉ°æ¿ì
Àǹ̸¦ Á¦´ë·Î ÆÄ¾ÇÇϱⰡ Èûµé °ÍÀÌ´Ù. ¶ÇÇÑ AVAILABLEÀÇ °ªÀ» 2·Î ÇÏ°í ½Í´Ù°í ÇÒ °æ¿ì¿¡µµ,
´ÜÁö »ó¼ö¸¸ ã¾Æ¼ °ªÀ» ¹Ù²ãÁÖ¸é µÈ´Ù. »ó¼ö¸¦ »ç¿ëÇÏÁö ¾Ê¾ÒÀ» °æ¿ì¿¡´Â ÀÏÀÏÀÌ Äڵ带 ã¾Æ°¡¸é¼
°ªÀ» ¹Ù²ãÁà¾ß¸¸ ÇÒ °ÍÀÌ´Ù.
.equ BRK, 45
.equ LINUX_SYSCALL, 0x80 |
int $0x80À» »ç¿ëÇÏ´Â °Íº¸´Ù´Â int $LINUX_SYSCALLÀÌ ÈξÀ ÀÌÇØÇÏ°í »ç¿ëÇϱ⵵ ½±´Ù. ÀϹÝÀûÀ¸·Î
»ó¼ö´Â ÇÁ·Î±×·¥»ó¿¡ ÇϵåÄÚµù µÇ´Â °ªµéÀ» °ü¸®Çϱâ À§Çؼ »ç¿ëµÈ´Ù. »ó¼ö´Â .equ¸¦ ÀÌ¿ëÇØ¼
Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
´ÙÀ½¿¡¼ ±¸Á¶Ã¼¸¦ Á¤ÀÇ Çϰí ÀÖ´Ù. ÀÌ ±¸Á¶Ã¼´Â ¸Þ¸ð¸®ÀÇ ¸íÈ®ÇÑ Á¦¾î¿Í
°ü·ÃµÈ ÀÏ·ÃÀÇ Á¤º¸µé·Î ÀÌ·ç¾îÁø´Ù.
¸Þ¸ð¸®¸¦ »ç¿ëÇϱâ À§ÇÑ °¡Àå Áß¿äÇÑ Á¤º¸´Â, "½ÃÀÛÀ§Ä¡"¿Í "Å©±â"°¡ µÈ´Ù.
À̵é Á¤º¸¸¦ À§Çؼ 4byteÀÇ Å©±â¸¦ °¡Áö´Â 2°³ÀÇ °ªÀÌ Á¤Àǰ¡ µÇ¾î¾ß
ÇÒ °ÍÀÌ´Ù. ±×¸®°í Çì´õÁ¤º¸¸¦ °¡Áö´Âµ¥, ÀÌ Çì´õ´Â ±¸Á¶Ã¼ÀÇ Å©±â¸¦
¾Ë·ÁÁÖ±â À§Çؼ »ç¿ëÇÑ´Ù. 2°³ÀÇ 4byteÅ©±âÀÇ »ó¼ö°¡ »ç¿ëµÇ°í
ÀÖÀ½À¸·Î 8·Î Á¤ÀÇµÇ¸é µÉ °ÍÀÌ´Ù.
ÃÖÁ¾ÀûÀ¸·Î ´ÙÀ½°ú °°ÀÌ ±¸Á¶Ã¼¸¦ Á¤ÀÇÇϰí ÀÖ´Ù.
.equ HEADER_SIZE, 8
.equ HDR_AVAIL_OFFSET, 0
.equ HDR_SIZE_OFFSET, 4 |
Çì´õ¿¡´Â ±¸Á¶Ã¼ÀÇ Å©±â¸¦ °¡¸®Å°´Â 8ÀÌ Á¤ÀǵǾî ÀÖ´Ù. available offsetÀº
µ¥ÀÌÅͰ¡ ÀúÀåµÇ´Â ¸Þ¸ð¸®»óÀÇ À§Ä¡¸¦ ÀúÀåÇϱâ À§Çؼ »ç¿ëÇÑ´Ù.
Size Offset ¿¡´Â ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ Å©±â°¡ µé¾î°¡°Ô µÈ´Ù. ¸Þ¸ð¸®ÀÇ
½ÃÀÛÀ§Ä¡¿Í Å©±â¸¦ ¾Ë°Ô µÇ¹Ç·Î ¸Þ¸ð¸®°ü¸®¸¦ À§ÇÑ ÃÖ¼ÒÇÑÀÇ Á¤º¸¸¦
ÀúÀåÇϱâ À§ÇÑ ±¸»öÀº ¸ÂÃá¼ÀÀÌ´Ù. ¸¸¾à ¸Þ¸ð¸®°ü¸®¸¦ À§Çؼ ´Ù¸¥ ¾î¶²
Á¤º¸¸¦ ´õ Ãß°¡ÇØ¾ß ÇÑ´Ù¸é, »ó¼öÇϳª¸¦ ´õ Ãß°¡Çϰí HEADER_SIZE¸¦
º¯°æ½ÃÄÑ Áֱ⸸ ÇÏ¸é µÈ´Ù. ÀÌ·¯ÇÑ ±¸Á¶Ã¼´Â Àü¿ªº¯¼öµé°ú ¸¶Âù°¡Áö·Î
ÄÚµåÀÇ °¡Àå ù ºÎºÐ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù.
9.8. allocate_init ÇÔ¼ö ÀÌ ÇÔ¼ö´Â °£´ÜÇÏ´Ù. heap_begin°ú current_break º¯¼ö°ªÀ» ¼³Á¤ÇÏ°Ô µÇ´Âµ¥,
À̵鿡 ´ëÇÑ ³»¿ëÀº ÀÌ¹Ì ¾Õ¿¡¼ ´Ù·ç¾ú´Ù. ÀÌÀü ÀåÀÇ ³»¿ëÀ» ÁÖÀDZí°Ô
ÀÐ¾î º¸¾Ò´Ù¸é, brk(2)½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇØ¼ ÃÖ±ÙÀÇ ºê·¹ÀÌÅ© Æ÷ÀÎÅ͸¦
¿Å±â´Â ¾Æ·¡ÀÇ Äڵ带 ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
pushl %ebp
movl %esp, %ebp
movl $BRK, %eax
movl $0, %ebx
int $LINUX_SYSCALL
incl %eax |
int $LINUX_SYSCALLÀÌ ½ÇÇàµÈ ÈÄ¿¡, %eax´Â ÁÖ¼ÒÀÇ ¸¶Áö¸·°ªÀÌ Ã¤¿öÁö°Ô µÈ´Ù.
±×·¯³ª ¿ì¸®°¡ ½ÇÁ¦·Î ¿øÇÏ´Â ÁÖ¼Ò´Â »ç¿ë°¡´ÉÇÑ ÁÖ¼ÒÀÇ Ã³À½ °ªÀÌ´Ù. ±×·¡¼
incl %eax¸¦ ÀÌ¿ëÇØ¼ %eax¸¦ Áõ°¡½ÃÄ×´Ù. ÀÌÁ¦ ¿ì¸®´Â heap_begin¿µ¿ªÀ¸·Î À̵¿Çϸé
µÈ´Ù. ¾ÆÁ÷ ÇÒ´çÇÑ ¸Þ¸ð¸®°¡ ¾øÀ¸¹Ç·Î current_break¿Í heap_beginÀº °°Àº °ªÀ» °¡Áö°í
ÀÖÀ» °ÍÀÌ´Ù.
incl %eax
movl %eax, current_break
movl %eax, heap_begin
movl %ebp, %esp
popl %ebp |
heap¿µ¿ªÀº heap_begin°ú current_break»çÀÌ¿¡ À§Ä¡ÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ÈüÀÇ Ã³À½ À§Ä¡¸¦
¾ò¾î³ÂÀ¸´Ï ÀÌÁ¦ allocateÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ heapÀ» ÇÊ¿äÇÑ ¸¸Å È®Àå½Ã۱⸸ ÇÏ¸é µÈ´Ù.
9.9. allocate ÇÔ¼ö ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ÀϵéÀ» ÇÏ°Ô µÈ´Ù.
heapÀÇ ½ÃÀÛ À§Ä¡·Î °£´Ù.
heapÀÇ ³¡ÀÎÁö ¾Æ´ÑÁö¸¦ üũÇÑ´Ù.
¸¸¾à ¿ì¸®°¡ ¿äûÇÏ´Â ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀÌ heapÀÇ ³¡À» ÃʰúÇØ ¹ö¸°´Ù¸é, unavailable(»ç¿ëÇÒ¼ö ¾øÀ½)
À» ¸®ÅÏÇÒ °ÍÀÌ´Ù.
¿äûµÈ ÃÖ±ÙÀÇ ¸Þ¸ð¸® ¿µ¿ªÀÌ unavailableÀ̶ó¸é, 2´Ü°è·Î µÇµ¹¾Æ°£´Ù.
¶§·Î´Â available»óÅÂÀÌÁö¸¸, ¸Þ¸ð¸® ¿µ¿ªÀÌ ¿äûÇÑ ¸¸Å ÃæºÐÇÏÁö°¡ ¾ÊÀ» °æ¿ì°¡ ÀÖ´Ù. À̰æ¿ì¿¡µµ
2 ´Ü°è·Î µÇµ¹¾Æ°£´Ù.
ÇöÀç ¸Þ¸ð¸® ¿µ¿ªÀÌ ¿äûÇÑ Å©±â¸¦ ¼ö¿ëÇÒ¸¸Å ÃæºÐÈ÷ Å©´Ù¸é, unavailable¸¦
Ç¥±âÇÏ°í ¸®ÅÏÇÑ´Ù.
À§ÀÇ °úÁ¤À» ¿°µÎ¿¡ µÎ°í Äڵ带 ´Ù½Ã º¸°Ô µÇ¸é, ¾Æ·¡ÀÇ ÄÚµåÀÇ ³»¿ëÀÌ ½±°Ô ÀÌÇØµÉ °ÍÀÌ´Ù.
´Ù½Ã ´ÙÀ½ ÄÚµå·Î ³Ñ¾î°¡º¸ÀÚ.
pushl %ebp
movl %esp, %ebp
movl ST_MEM_SIZE(%ebp), %ecx
movl heap_begin, %ecx
movl current_break, %ebx |
À§ ÄÚµå´Â ·¹Áö½ºÅ͸¦ ÃʱâÈ ÇÏ´Â ÀÏÀ» ÇÏ´Ù. óÀ½ µÎ¶óÀÎÀº ÇÔ¼ö¿¡ µé¾î°¡´Â ÀüÇüÀûÀÎ ÄÚµåµéÀÌ´Ù.
´ÙÀ½ ¶óÀο¡¼´Â ½ºÅÿ¡ ÇÒ´çÇϱ⠿øÇÏ´Â ¸Þ¸ð¸®ÀÇ »çÀÌÁ ¹Ð¾î ³Ö´Âµ¥, À̰ÍÀº ÇÔ¼öÀÇ
ÀÎÀÚ·Î »ç¿ëµÉ °ÍÀÌ´Ù. ´ÙÀ½ ¶óÀο¡¼ heapÀÇ ½ÃÀÛÁÖ¼Ò¿Í ³¡ÁÖ¼Ò¸¦ ÀÔ·ÂÇÑ´Ù.
´ÙÀ½ ¼½¼ÇÀº alloc_loop_beginÀÌ´Ù. ¿©±â¿¡¼´Â ¿ì¸®°¡ ÇÊ¿ä·ÎÇÏ´Â ¸Þ¸ð¸®ÀÇ °ø°£ÀÌ È®º¸µÉ ¶§±îÁö,
Áö¼ÓÀûÀ¸·Î ¸Þ¸ð¸® ¿µ¿ªÀ» üũÇÏ°Ô µÈ´Ù.
cmpl %ebx, %eax
je move_break |
¿©±â¿¡¼´Â ÃÖ±ÙÀÇ °Ë»çµÈ ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀÎ %eax¿Í ÈüÀÇ ¸¶Áö¸· ¿µ¿ªÀÎ %ebx¸¦ ºñ±³ÇÏ°Ô µÈ´Ù.
°Ë»çÇѸ޸ð¸®ÀÇ ¿©¿µ¿ªÀÌ, ¸¶Áö¸· ÈüÀÇ ¿µ¿ª°ú °°´Ù¸é, ÀÌ´Â ¿ì¸®°¡ ÇÊ¿ä·Î ¿äûÇÑ ¸Þ¸ð¸®ÀÇ ¿µ¿ªÀÌ»óÀÌ
Á¸ÀçÇϰí ÀÖÀ½À» ÀǹÌÇÑ´Ù. ±×·¯¹Ç·Î ´ÙÀ½ ´Ü°è´Â °Ç³Ê ¶Ù°í ¹Ù·Î move_break·Î Á¡ÇÁÇÏ°Ô µÈ´Ù.
move_break:
addl $HEADER_SIZE, %ebx
addl %ecx, %ebx
pushl %eax
pushl %ecx
pushl %ebx
movl $BRK, %eax
int $LINUX_SYSCALL |
¿©±â´Â ÄÚµåÀÇ ¸¶Áö¸· ÁöÁ¡ÀÌ´Ù. %ebx¿¡´Â ¿ì¸®°¡ »ç¿ëÇϱ⠿øÇÏ´Â ¸Þ¸ð¸®ÀÇ ¿µ¿ª°ªÀÌ µé¾î°¡¸ç, brk(2)
½Ã½ºÅÛ È£ÃâÀÇ ÀÎÀÚ·Î »ç¿ëµÉ °ÍÀÌ´Ù. ±×¸®°í ½ºÅÿ¡ ÀúÀåÇϱ⠿øÇÏ´Â ´Ù¸¥ ·¹Áö½ºÅÍ °ªµéÀ» ¸ðµÎ ÀúÀåÇÑ´Ù.
¸¶Áö¸·À¸·Î brk(2)À» È£ÃâÇϰí, ¸®ÅϰªÀ» °Ë»çÇÑ´Ù.
brk ½Ã½ºÅÛ È£Ãâ¿¡ ¹®Á¦°¡ ¾ø¾ú´Ù¸é, ½ºÅÃÀÇ ·¹Áö½ºÅÍ °ªµéÀ» ´Ù½Ã º¹±¸ ½Ã۰í, ¸Þ¸ð¸®¿¡ unavailabe
Ç¥½Ã¸¦ Çϰí, ¸Þ¸ð¸®»çÀÌÁ ±â·ÏÇÑ´ÙÀ½ %eax ÀÇ Æ÷ÀÎÅ͸¦ »ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®ÀÇ Ã³À½À¸·Î À̵¿½ÃŲ´Ù.
popl %ebx
popl %ecx
popl %eax
movl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax)
movl %ecx, HDR_SIZE_OFFSET(%eax)
addl $HEADER_SIZE, %eax |
¸¶Áö¸·À¸·Î »õ·Î¿î ºê·¹ÀÌÅ© Æ÷ÀÎÅÍ¿Í ÇÒ´çµÈ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ°í ¸®ÅÏÇÑ´Ù.
±×·³ ·çÇÁÀÇ Ã³À½À¸·Î ´Ù½Ã µÇµ¹¾Æ°¡¼, ÃÖ±ÙÀÇ ¸Þ¸ð¸®°¡ ÈüÀÇ ¸¶Áö¸·À» °¡¸®Å°Áö ¾Ê°í ÀÖÀ» °æ¿ì ¾î¶²ÀÏÀÌ
¹ß»ýÇÏ´ÂÁö¸¦ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
movl HDR_SIZE_OFFSET(%eax), %edx
cmpl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax)
je next_locaton
|
óÀ½ ÄÚµå´Â ¾ò¾î³½ ¸Þ¸ð¸®¿µ¿ªÀÇ Å©±â¸¦ %edx¿¡ ³Ö´Â ÀÏÀ» ÇÑ´Ù. ±×¸®°í ³ª¼ UNAVAILABLEÇ¥½Ã°¡ µÇ¾î
ÀÖ´ÂÁö¸¦ È®ÀÎÇÑ´Ù. ¸¸¾à UNAVAILABLE·Î Ç¥½Ã°¡ µÇ¾î ÀÖ´Ù¸é, ÀÌ¹Ì »ç¿ëÁßÀÎ ¿µ¿ªÀ̹ǷΠnext_location
À¸·Î Á¡ÇÁÇÑ´Ù. ¸¸¾à AVAILABLE·Î Ç¥½Ã°¡ µÇ¾î ÀÖ´Ù¸é, ÃæºÐÇÑ °ø°£ÀÌ È®º¸µÇ¾î ÀÖ´ÂÁö ¾Æ·¡ÀÇ ÄÚµå·Î
È®ÀÎÇϰí, ÃæºÐÇÑ °ø°£ÀÌ È®º¸µÇ¾î ÀÖ´Ù¸é allocate_here·Î Á¡ÇÁÇÏ¸é µÈ´Ù.
cmpl %edx, %ecx
jle allocate_here
|
allocate_here¿¡¼´Â ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÏ°Ô µÈ´Ù.
movl $UNAVAILABLE, HDR_AVAIL_OFFSET(%eax)
addl $HEADER_SIZE, %eax
movl %ebp, %esp
popl %ebp
ret
|
È®º¸µÈ ¸Þ¸ð¸®´Â ´Ù¸¥, Äڵ尡 »ç¿ëÇÒ ¼ö ¾øµµ·Ï unabailableÇ¥½Ã¸¦ ÇØµÎ°í, Çì´õ»çÀÌÁŠÆ÷ÀÎÅ͸¦
À̵¿Çϰí, ÇÊ¿äÇÑ °ªÀ» ¸®ÅÏÇϰí ÇÔ¼ö¸¦ ºüÁ®³ª¿À¸é µÈ´Ù. Çì´õ»çÀÌÁŠÆ÷ÀÎÅ͸¦ À̵¿ÇÏ´Â ÀÌÀ¯´Â,
ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ÀϹݻç¿ëÀÚ´Â Çì´õ¸¦ »ç¿ëÇÒ Çʿ䰡 ÀüÇô ¾ø±â ¶§¹®ÀÌ´Ù. »ç¿ëÀÚ¿¡°Ô´Â
´ÜÁö »ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅ͸¸ ³Ñ°ÜÁÖ¸é µÈ´Ù.
¸¸¾à »ç¿ë°¡´ÉÇÑ ¿µ¿ªÀε¥, Å©±â°¡ ÃæºÐÇÏÁö ¾ÊÀ» °æ¿ì´Â ¾î¶»°Ô µÉ±î ? ÀÌ °æ¿ì¿¡´Â next_location
Äڵ念¿ª(section) À¸·Î À̵¿ÇÑ´Ù. ÀÌ ¿µ¿ª¿¡¼´Â, ÇöÀç ¸Þ¸ð¸® ¿µ¿ªÀº ¿äûÇÑ ¸¸ÅÀÇ ¸Þ¸ð¸®°¡
¾øÀ¸¹Ç·Î ·çÇÁÀÇ Ã³À½ÀÎ alloc_loop_beginÀ¸·Î À̵¿ÇÏ´Â Äڵ尡 µé¾î°¡¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ¿Í ´õºÒ¾î
´ÙÀ½ header¸¦ °¡¸®Å³ ¼ö ÀÖµµ·Ï HEADER_SIZE¸¸ÅÀ» À̵¿½ÃÄÑ¾ß ÇÑ´Ù.
addl $HEADER_SIZE, %eax
addl %edx, %eax
jmp alloc_loop_begin
|
9.10. deallocate ÇÔ¼ö deallocate´Â allocate ÇÔ¼ö¿¡ ºñÇØ¼ ¸Å¿ì ½±°Ô ¸¸µé ¼ö ÀÖ´Ù. ´ÜÁö ÇöÀç
¸Þ¸ð¸® ¿µ¿ªÀ» AVAILABLE·Î Ç¥½Ã¸¸ ÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù.
movl ST_MEMORY_SEG(%esp), %eax
subl $HEADER_SIZE, %eax
movl $AVAILABLE, HDR_AVAIL_OFFSET(%eax)
ret
|
ÇÏ´Â ÀÏÀº °£´ÜÇÏ´Ù. ÇöÀç ½ºÅÃÀ¸·Î ºÎÅÍ ¸Þ¸ð¸®¿µ¿ªÀÇ ÁÖ¼Ò¸¦ ¾ò¾î¿Â´ÙÀ½, Çì´õºÎºÐÀ¸·Î À̵¿Çؼ
AVAILABLEÇ¥½Ã¸¦ Çϱ⸸ ÇÏ¸é µÈ´Ù.
9.11. ¼º´É ¹× ´Ù¸¥ ¸î°¡Áö ¹®Á¦µé ¿©±â¿¡¼ ¸¸µç ÄÚµå´Â ½ÇÁ¦ Ȱ¿ë¿¡´Â ¹®Á¦°¡ ÀÖ´Â ÃÖ¼ÒÇÑÀÇ ±â´É¸¸ ±¸ÇöÇÑ ÇнÀ¿ë ÄÚµåÀÏ »ÓÀÌ´Ù.
Á»´õ ±×·²µíÇÏ°Ô ¸¸µé±â À§Çؼ´Â allocatorÇÔ¼ö¿¡ ¸î°¡Áö ¹®Á¦Á¡µéÀ» Àâ¾ÆÁÖ¾î¾ß¸¸ ÇÑ´Ù.
ÀÌ ÇÔ¼öÀÇ °¡Àå Å« ¹®Á¦Á¡Àº ´À¸®´Ù¶ó´Â Á¡ÀÌ´Ù. ¸¸¾à ¸î°³ÀÇ ¸Þ¸ð¸®¿µ¿ª¸¸ ¿äûÀ» ÇÏ°Ô µÈ´Ù¸é
¼Óµµ´Â ±×¸® Å« ¹®Á¦°¡ µÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ±×·¯³ª ¼öõ¹øÀÇ ¸Þ¸ð¸®ÇÒ´ç ¿äûÀÌ µé¾î¿À°Ô µÈ´Ù¸é
¼Óµµ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. 1000¹øÂ° ¸Þ¸ð¸®ÇÒ´ç ¿äûÀ» ÇÏ°Ô µÈ´Ù¸é, ¿©·¯ºÐÀº ¿äûÇÑ Å©±â¸¦ °¡Áø
»ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®¿µ¿ªÀÌ ÀÖ´ÂÁö¸¦ È®ÀÎÇϱâ À§Çؼ ÃÖ´ë 999¹øÀÇ °Ë»ç¸¦ ÇØ¾ß ÇÑ´Ù.
°Ô´Ù°¡ ¸®´ª½º´Â ¸Þ¸ð¸®ÀÇ ÆäÀÌÁö Á¤º¸¸¦ ¸Þ¸ð¸®°¡ ¾Æ´Ñ µð½ºÅ©¿¡¼ °ü¸®ÇÑ´Ù. ÀÌ´Â
¸Å¹øÀÇ °Ë»ç¸¦ ÇÔ¿¡ ÀÖ¾î¼, ¼Óµµ°¡ ´À¸° µð½ºÅ©¸¦ ÀÏÀÏÀÌ °Ë»çÇØ¾ß ÇÔÀ» ÀǹÌÇÑ´Ù.
´ç¿¬È÷ ¸Å¿ì ´À·ÁÁú ¼ö ¹Û¿¡ ¾ø´Ù. Áï ÀÌ ÇÁ·Î±×·¥Àº ÇÒ´ç¿äûÀÌ ´Ã¾î³¯¶§ ¸¶´Ù ¼±ÇüÀûÀ¸·Î ½Ã°£ÀÌ
(linear time)´Ã¾î³ª°Ô µÈ´Ù. ¸ðµç ¼±ÇüÀûÀÎ ½Ã°£ÀÌ ¼ÒºñµÇ´Â ÄÚµå´Â ³ª»Û ÄÚµåÀ̸ç, °¡´ÉÇÑ
»ó¼ö½Ã°£(constant time)¿¡ ÁÖ¾îÁø ÀÏÀ» ÇØ³»´Â Äڵ带 ¸¸µé¾î ³»¾ß ÇÑ´Ù. ±×·¯±â À§Çؼ´Â
¸Þ¸ð¸®ÇÒ´ç ¿äûÀ» °ü¸®ÇÒ ¼ö ÀÖ´Â Äڵ带 Ãß°¡½ÃÄÑ¾ß ÇÑ´Ù. deallocate
ÇÔ¼öÀÇ °æ¿ì ´ÜÁö 4°³ÀÇ ¸í·É¸¸ »ç¿ëµÇ´Â °£´ÜÇÑ ÄÚµåÀ̹ǷΠÇÒ´ç¿äûÀÇ °¹¼ö°¡ ¸¹¾ÆÁ³´Ù°í ÇØ¼
Ưº°È÷ ¹®Á¦µÉ°Ç ¾ø´Ù.
´Ù¸¥ ¶ÇÇϳªÀÇ ¹®Á¦Á¡Àº brk(2) ½Ã½ºÅÛ È£ÃâÀ» ÀÚÁÖÇѴٴµ¥ ÀÖ´Ù. ½Ã½ºÅÛ È£ÃâÀº ¸¹Àº ½Ã°£ÀÌ
¼Ò¸ðµÇ´Â ÀÛ¾÷ÀÌ´Ù. ¿Ö³ÄÇÏ¸é ´ÜÀÏÇÑ ÇÁ·Î¼¼½ºÀÇ mode º¯È¯ÀÌ ÀϾ±â ¶§¹®ÀÌ´Ù.
°ÅÀÇ ¸ðµç kernel´Â ¿î¿µÃ¼Á¦¸¦ º¸È£Çϱâ À§Çؼ user mode¿Í kernel mode·Î ¸ðµå¸¦
ºÐ¸®Çؼ ÇÊ¿äÇÑ ÀÏÀ» ÇÏ°Ô µÈ´Ù. ¸Þ¸ð¸® ¸ÊÇÎ, ÆÄÀÏ¿±â/¾²±â¿Í °°Àº Áß¿äÇÑ ÀÏÀ», ÇÁ·Î¼¼½º¿¡°Ô
ÀüÀûÀ¸·Î ¸Ã±æ°æ¿ì ½É°¢ÇÑ º¸¾È À§ÇèÀ» °¡Áú ¼ö Àֱ⠶§¹®À¸·Î, À§ÀÇ ÀϵéÀº ÇÁ·Î¼¼½º°¡ Ä¿³Î¿¡°Ô
¿äûÇϰí Ä¿³ÎÀÌ ¿äûÀ» ¹Þ¾Æ¼ ¼öÇàÇÏ´Â ½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù. ÇÁ·Î¼¼½º´Â Æò»ó½Ã¿¡´Â user mode·Î
ÀÛµ¿À» Çϰí, Ä¿³Î¿¡ ¾î¶² ¿äûÀ» ÇØ¾ß ÇÒ°æ¿ì kernel mode·Î º¯È¯À» ÇÏ°Ô µÇ°í, ¿äûÇÑ ÀÏÀ» ³¡³ÂÀ»
°æ¿ì ´Ù½Ã user mode·Î ÀÛµ¿ÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¸ðµåº¯È¯À» context switch¶ó°í
ºÎ¸£±âµµ ÇÑ´Ù. ÀÌ·¯ÇÑ context switch´Â x86 ÇÁ·Î¼¼½º¿¡¼ ¸Å¿ì ´À¸®°Ô ÀϾÙ. ±×·¯¹Ç·Î
°¡´ÉÇϸé context switch°¡ ÀϾÁö ¾Êµµ·Ï ÇØÁÖ¾î¾ß ÇÑ´Ù. brk(2)´Â ¸Þ¸ð¸® ¸ÊÇÎ °ü·ÃÀÏÀ»
ÇÏ´Â °ÍÀ¸·Î, user ¸ðµå¿¡¼´Â ÇÊ¿äÇÑ ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ¾øÀ¸¸ç, ¶§¹®¿¡ kernelmode·Î context switch
°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. ¿ì¸®°¡ ¸¸µçÇÔ¼ö´Â ¸Å¹ø ¿äû½Ã ¸¶´Ù brk ½Ã½ºÅÛÈ£ÃâÀ» ÇØ¾ßÇÏ´Â ¹®Á¦Á¡À»
°¡Áø´Ù.
±×¸®°í ¸Þ¸ð¸®¸¦ ºñÈ¿À²ÀûÀ¸·Î °ü¸®ÇÑ´Ù´Â ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. ¿¹¸¦ µé¾î 5byteÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ»
¿äûÇߴµ¥, »ç¿ë°¡´ÉÇÑ ¿µ¿ªÀ¸·Î?1000byte¸¦ ¾ò¾ú´Ù°í °¡´ÉÇØº¸ÀÚ. ¿ì¸®°¡ ¿äûÇÑ
¸Þ¸ð¸® ¿µ¿ªº¸´Ù ÃæºÐÈ÷ Å©¹Ç·Î, ¹®Á¦ ¾øÀÌ ¸®Å쵃 °ÍÀÌ°í »ç¿ëÇϴµ¥µµ ¹®Á¦´Â ¾ø°ÚÁö¸¸, 955 byte´Â
»ç¿ëÇÏÁö ¾Ê´Â ¸Þ¸ð¸® ¿µ¿ªÀ¸·Î ³¶ºñÇÏ°Ô µÈ´Ù. À̸¦ È¿À²ÀûÀ¸·Î »ç¿ëÇϱâ À§Çؼ´Â 955 byte¸¦ ³ªÁß¿¡
»ç¿ë°¡´ÉÇϵµ·Ï break¸¦ ºÐ¸®ÇØÁÖ¾î¾ß ÇÑ´Ù.
9.12. Allocator »ç¿ëÇϱâ¿ì¸®°¡ ÀÛ¼ºÇÑ ¸Þ¸ð¸®°ü¸®ÀÚ´Â ½ÇÁ¦ »ç¿ëÇϱ⿡´Â ¹®Á¦°¡ ÀÖÁö¸¸, ÀÛµ¿
Å×½ºÆ® Á¤µµ´Â ÇØº¼ ¼ö ÀÖ´Ù. ±×·¡¼ 6Àå¿¡¼ ¿¹Á¦·Î ´Ù·ç¾ú´ø
read-records.s ÇÁ·Î±×·¥¿¡ ¿©±â¿¡¼ ¸¸µç ¸Þ¸ð¸®°ü¸®ÀÚ¸¦ »ç¿ëÇØ
º¸µµ·Ï ÇϰڴÙ.
read-records.s ÇÁ·Î±×·¥Àº ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÎ, ³»¿ëÀ» ÀúÀåÇϱâ
À§Çؼ .bss sectionÀ»?»ç¿ëÇϰí ÀÖ´Ù.
.bss sectionÀ» º¸¸é record_buffer¸¦ ÀÔÃâ·Â
¹öÆÛ·Î ÀÌ¿ëÇϰí Àִµ¥, °íÁ¤µÈ Å©±â·Î ÇÒ´çµÇ¾î ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.
ÀÌ°É ¿ì¸®°¡ ¸¸µç ¸Þ¸ð¸® °ü¸®ÀÚ¸¦ ÀÌ¿ëÇØ¼ µ¿ÀûÀ¸·Î ÇÒ´çÇϵµ·Ï
Äڵ带 ¼öÁ¤ÇÑ ÈÄ Å×½ºÆ® ÇÏ¸é µÈ´Ù. ¿ì¸®°¡ ¼öÁ¤ÇÒ ºÎºÐÀÇ
¿øº» ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
.section .bss
.lcomm, record_buffer, RECORD_SIZE
|
¿ì¼± °íÁ¤µÈ Å©±âÀÇ record_buffer´Â Çʿ䰡 ¾øÀ» °ÍÀÌ´Ù.
µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛÀÇ ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °ø°£¸¸ ÀÖÀ¸¸é µÈ´Ù.
½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£Àº 4byte¸é ÃæºÐÇÏ´Ù. ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇÒ
°ø°£Àº .data ¿µ¿ª¿¡ ¼±¾ðÇÏ¸é µÈ´Ù.
record_buffer_ptr:
.long 0
|
´ÙÀ½À¸·Î ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÈ µÚ, ¸Þ¸ð¸® °ü¸®ÀÚ¸¦ ÃʱâÈ ½Ã۱â À§Çؼ
allocate_init ¸¦ È£ÃâÇÏ´Â Äڵ带 Ãß°¡ÇÑ´Ù.
ÀÌÁ¦ ¸Þ¸ð¸®¸¦ ¿äûÇϱâ À§Çؼ, ÇÊ¿äÇÑ ¸Þ¸ð¸®ÀÇ Å©±â¿Í ÇÔ²² allocate
ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.
pushl $RECORD_SIZE
call allocate
movl %eax, record_buffer_ptr
|
ÀÌÁ¦ read_record¸¦ È£ÃâÇÏ°Ô µÇ¸é, µ¿ÀûÀ¸·Î ¸¸µé¾îÁø ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦
ÀÌ¿ëÇÏ°Ô µÉ °ÍÀÌ´Ù. ¿¹Àü Äڵ忡¼ Æ÷ÀÎÅÍ´Â immediate-mode »óÅ·Î
record_buffer¸¦ °¡¸®Å°°í ÀÖ¾ú´Âµ¥, ÀÌÁ¦´Â record_buffer_ptrÀÇ
ÁÖ¼Ò°¡ °¡¸®Å°´Â ¿µ¿ªÀ» ÀÌ¿ëÇØ¾ß Çϱ⠶§¹®¿¡, direct mode·Î
record_buffer_ptrÀÇ °ªÀ» ÀÌ¿ëÇϵµ·Ï º¯°æÇØ¾ß ÇÑ´Ù.
pushl $record_buffer # À»
pushl record_buffer_ptr # ·Î º¯°æÇÑ´Ù.
|
´ÙÀ½À¸·Î ·¹Äڵ忡¼ À̸§ÀÌ ÀúÀåµÈ ÁÖ¼Ò¸¦ ã´Â ºÎºÐÀ» º¯°æÇØ¾ß ÇÑ´Ù.
¿¹Àü ÄÚµå´Â $RECORD_FIRSTNAME + record_buffer·Î À̸§ÀÌ ÀúÀåµÈ ÁÖ¼Ò¸¦
ãÀ» ¼ö ÀÖ¾ú´Ù. »õ·Î¿î ÄÚµå´Â record_buffer_ptrÀÌ °¡¸®Å°´Â ÁÖ¼Ò·Î ºÎÅÍ
À̸§ÀÌ ÀÖ´Â ÁÖ¼Ò¸¦ ã¾Æ³»¾ß ÇÑ´Ù.
¶§¹®¿¡ ·¹Áö½ºÅÍÀÇ Æ÷ÀÎÅ͸¦ record_buffer_ptr·Î ¿Å±ä´ÙÀ½
$RECORD_FIRSTNAME¸¸Å Æ÷ÀÎÅ͸¦ À̵¿ ½ÃŰ´Â ÀÏÀ» Çϵµ·Ï Äڵ带 º¯°æÇØ¾ß ÇÑ´Ù.
pushl $RECORD_FIRSTNAME + record_buffer # À»
## ¾Æ·¡¿Í °°ÀÌ º¯°æÇÑ´Ù.
movl record_buffer_ptr, %eax
addl $RECORD_FIRSTNAME, %eax
pusl %eax
|
¸¶Âù°¡Áö·Î ¾Æ·¡ÀÇ Äڵ嵵 º¯°æÇØ¾ß ÇÑ´Ù.
movl $RECORD_FIRSTNAME + record_buffer, %eax #À»
## ¾Æ·¡¿Í °°ÀÌ º¯°æÇÑ´Ù.
movl record_buffer_ptr, %ecx
addl $RECORD_FIRSTNAME, %ecx
|
¸¶Áö¸·À¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ µÇµ¹·ÁÁÖ±â À§Çؼ record_buffer_ptrÀ» È£ÃâÇϸé
µÈ´Ù.
pushl record_buffer_ptr
call deallocate
|
À§¿¡¼ ¾ð±ÞÇÑ ºÎºÐÀ» ¼öÁ¤ÇÑ ÈÄ ¾Æ·¡¿Í °°ÀÌ ½ÇÇàÆÄÀÏÀ» ¸¸µé¸é µÈ´Ù.
as read-records.s -o read-records.o
ld alloc.o read-record.o read-records.o write-newline.o count-chars.o -o read-records
|
¼º°øÀûÀ¸·Î ½ÇÇàÆÄÀÏÀ» ¸¸µé¾ú´Ù¸é, ½ÇÇà½ÃÄѼ Å×½ºÆ®Çغ¸µµ·Ï ÇÏÀÚ.
9.13. ´õ ¸¹Àº Á¤º¸µé ¸®´ª½º¿Í ´Ù¸¥ ¿î¿µÃ¼Á¦ ½Ã½ºÅÛ¿¡¼ÀÇ ¸Þ¸ð¸® °ü¸®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸µéÀº ¾Æ·¡ÀÇ ¸µÅ©µéÀ»
Âü°íÇϱ⠹ٶõ´Ù.
9.14. º¹½À ¸®´ª½º ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§ÀÇ ¸Þ¸ð¸® ±¸¼º¿¡ ´ëÇØ¼ ¼³¸íÇ϶ó.
heap¶õ ¹«¾ùÀΰ¡.
current break¶õ ¹«¾ùÀΰ¡.
¸ÊÇεÇÁö ¾ÊÀº ¸Þ¸ð¸®¿¡ Á¢±ÙÀ» ½ÃµµÇÒ °æ¿ì ¾î¶² ÀÏÀÌ ¹ß»ýÇϴ°¡.
¿î¿µÃ¼Á¦´Â ¾î¶»°Ô °¢°¢ÀÇ ÇÁ·Î¼¼½º°¡ Àڽŵ鿡°Ô ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÃʰúÇØ¼ »ç¿ëÇÏÁö ¸·´Â°¡.
¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÒ¶§, µð½ºÅ©»ó¿¡¼ ¾î¶²ÀÏÀÌ ¹ß»ýÇÏ´ÂÁö¸¦ ¼³¸íÇ϶ó.
¸Þ¸ð¸® ÇÒ´çÀÚ°¡ ÇÊ¿äÇÑ ÀÌÀ¯¿¡ ´ëÇØ¼ ¼³¸íÇ϶ó.
10. ÃÖÀûÈ ÃÖÀûȶõ ¿©·¯ºÐÀÌ ¸¸µç ¾ÖÇø®ÄÉÀ̼ÇÀ» Á»´õ È¿°úÀûÀ¸·Î
½ÇÇàµÇ°Ô²û ¸¸µé±â À§ÇÑ ÀÏ·ÃÀÇ °úÁ¤µéÀ» ¸»ÇÑ´Ù.
¿©·¯ºÐÀº ¼Óµµ, ¸Þ¸ð¸® »ç¿ë°ø°£, µð½ºÅ© »ç¿ë°ø°£µî ¸¹Àº ºÎºÐ¿¡ ÀÖ¾î¼
Á» ´õ È¿À²ÀûÀÎ »ç¿ëÀÌ °¡´ÉÇϵµ·Ï ÃÖÀûÈ ½Ãų ¼ö ÀÖ´Ù. À̹ø Àå¿¡¼´Â
¼Óµµ¿¡ ÁßÁ¡À» µÐ ÃÖÀûÈ ¹æ¾È¿¡ ´ëÇØ¼ Åä·ÐÇØ º¸µµ·Ï ÇϰڴÙ.
10.1. ÃÖÀûȰ¡ ÇÊ¿äÇÑ ½ÃÁ¡
¸ðµç °æ¿ì¿¡ ¹Ýµå½Ã ÃÖÀûȰ¡ ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù. ¿Ö³ÄÇÏ¸é ´õ ³ªÀº ÃÖÀûÈ´Â
±×¸¸Å º¹ÀâÇÑ °úÁ¤À» ÇÊ¿ä·Î Çϱ⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ º¹ÀâÇÑ °úÁ¤Àº ÇÊ¿¬ÀûÀ¸·Î
ÄÚµåÀÇ ¾çÀ» ´Ã¸®°í, Äڵ带 ÀÌÇØÇϴµ¥ Àü¹®¼ºÀ» ÇÊ¿äÇϵµ·Ï ¸¸µç´Ù.
³ôÀº¼öÁØÀ¸·Î ÃÖÀûÈµÈ ÄÚµå´Â º¸Åë, ÀÌÇØÇÏ°í µð¹ö±ëÇϱâ Èûµé¾î Áú ¼ö ÀÖ´Ù.
°á±¹ ÇÁ·ÎÁ§Æ®ÀÇ ¿Ï·á½Ã°£°ú À¯Áöº¸¼ö ½Ã°£À» Áõ°¡½ÃŰ´Â ¿äÀÎÀÌ µÈ´Ù.
±×·¯¹Ç·Î ²À ÇÊ¿äÇÑ ºÎºÐ¿¡ ´ëÇØ¼ ÃÖÀûȸ¦ ÇØÁÖ¾î¾ß ÇÑ´Ù.
±×·¯³ª ÇÁ·Î±×·¥ÀÇ ¾î´ÀºÎºÐ¿¡¼ ¼Ó·ÂÀ» ÀúÇϽÃŰ´Â º´¸ñÇö»óÀÌ ¹ß»ýÇÒÁö¸¦
¿¹ÃøÇÏ´Â °ÍÀº °æÇè ¸¹Àº ÇÁ·Î±×·¡¸Ó¶ó°í ÇÒÁö¶óµµ ¿¹ÃøÇϱⰡ ½±Áö ¾Ê´Ù.
½ÉÁö¾î ÇÁ·Î±×·¡¸Ó¸¦ Á÷Á¢ ½ÇÇà ½ÃÄѺ¸´õ¶óµµ, º´¸ñÇö»óÀÌ ¹ß»ýÇÏ´Â ÄÚµåÀÇ
À§Ä¡¸¦ ã¾Æ³½´Ù´Â °ÍÀº °áÄÚ ½¬¿îÀÏÀÌ ¾Æ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ ¼Óµµ°¡
ÀúÇϵǴ ¿øÀÎÀº º´¸ñ±¸°£ÀÇ Äڵ忡 ÀÇÇѹٰ¡ ¸¹À¸¹Ç·Î, º´¸ñÀ» ÀÏÀ¸Å°´Â
Äڵ带 ã¾Æ³»´Â °ÍÀº ¸Å¿ì Áß¿äÇÑÀÏÀ̸ç, ½ÇÁ¦ ¼Óµµ°ü·Ã ÃÖÀûÈ´Â º´¸ñ±¸°£À»
ã¾Æ³»´Â ÀÏÀÌ °¡Àå Áß¿äÇÏ´Ù.
´ç½ÅÀÌ ÇÁ·Î±×·¥À» °³¹ßÇÒ¶§, ´ç½ÅÀº ´ÙÀ½ÀÇ ¿øÄ¢¿¡ µû¶ó¼ ÇÁ·Î±×·¥À» °³¹ßÇϵµ·Ï
³ë·ÂÇØ¾ß ÇÑ´Ù.
¸ðµç °ÍÀ» ¹®¼È ÇÑ´Ù.
ÀÛ¾÷ÀÇ °úÁ¤¿ª½Ã ¹®¼È ÇÑ´Ù.
ÄÚµå´Â ¸ðµâȽÃ۰í, ½±°Ô º¸°í, ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï ÀÛ¼ºÇÑ´Ù.
¹®¼È°¡ ±âº»ÁßÀÇ ±âº»À̶ó´Â °ÍÀº ¸»ÇÒÇʿ䵵 ¾øÀ¸¸ç, ƯÈ÷³ª ±×·ì´ÜÀ§ÀÇ °³¹ßÀ»
ÇØ¾ßÇÑ´Ù¸é, ±× Á߿伺Àº ¹è°¡ µÈ´Ù. ÇÁ·Î±×·¥ÀÇ ÇÔ¼öÈ ¿ª½Ã ±âº»ÀÌ´Ù.
ÀÌÂëµÇ¸é À§ÀÇ ¸ñ·ÏÀÇ ³»¿ëµéÀÌ Áß¿äÇÑ°Ç ¾Ë°Ú´Âµ¥, ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¼Óµµ¿Í ¹«½¼ °ü·ÃÀÌ
ÀÖÁö ? Çϰí ÀǾÆÇØ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÏ´Ü ÃÖÀûÈ´Â Ãʱ⠰³¹ß´Ü°è¿¡¼´Â ´ÙÀ½°ú °°Àº ÀÌÀ¯ ¶§¹®¿¡ ±×¸® ÇÊ¿äÇÏÁö
¾ÊÀº ÀÛ¾÷ÀÌ´Ù.
¾à°£ÀÇ ¼ÓµµÀÇ ¹®Á¦´Â ´õ ÁÁÀº Çϵå¿þ¾î·Î ÇØ°áÇÒ ¼ö ÀÖ´Ù. Á¾Á¾ ´õ ÁÁÀº
Çϵå¿þ¾î¸¦ ±¸ÀÔÇϴ°Ô, ÁÁÀº ÇÁ·Î±×·¡¸Ó¸¦ °í¿ëÇÏ´Â °Í º¸´Ù Àú·ÅÇÏ´Ù.
óÀ½ ¸¸µé¾îÁø ÇÁ·Î±×·¥Àº ¿ä±¸»çÇ×ÀÇ º¯°æ, »õ·Î¿î ±â¼ú µµÀÔ, ¾Ë°í¸®Áò°ú
ÇÁ·Î¼¼½º º¯°æ, ÇÁ·Î±×·¡¸ÓÀÇ ´É·ÂÇâ»ó µîÀÇ ÀÌÀ¯·Î 80%Á¤µµ ´Ù½Ã ¸¸µé¾î Áø´Ù.
Áï óÀ½ ±¸»óÇѰͰú´Â ÀüÇô ´Ù¸¥ ÇÁ·Î±×·¥ÀÌ µÉ °¡´É¼ºÀÌ ¸¹´Ù.
º¯°æµÉ °¡´É¼ºÀÌ ¸¹Àº Äڵ带 ±×¶§ ±×¶§ ÃÖÀûÈ ÇÏ´Â°Ç ½Ã°£³¶ºñ´Ù.
¼Óµµ¹®Á¦´Â ÄÚµåÀÇ ´ÜÁö ¸î±ºµ¥ Áö¿ªÀûÀÎ °÷¿¡¼ ¹ß»ýÇÑ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦? ÇÁ·Î±×·¥À» ¿ÏÀüÈ÷ ¸¸µé¾î¼ Å×½ºÆ®Çϱâ Àü¿¡ ã¾Æ³½´Ù´Â °Ç ¸Å¿ì ¾î·Á¿î
ÀÏÀÌ´Ù.
³ª´Â ÀÌÀü¿¡ À¥±â¹ÝÀÇ ÀüÀÚ»ó°Å·¡ ÇÁ·ÎÁ§Æ®¿¡ ÅõÀÔµÈ ÀÏÀÌ ÀÖ¾úÀ¸¸ç, Á¤È®ÇÏ°í ±ò²û
ÇÏ°Ô ÀÛµ¿Çϴµ¥ ÇÁ·ÎÁ§Æ®ÀÇ ÃÐÁ¡À» ¸ÂÃß°í ÀÛ¾÷À» ÁøÇà Çß¾ú´Ù.
´ç½Ã °°ÀÌ ÀÏÇÏ´ø µ¿·á´Â À¥ ÆäÀÌÁö°¡ ·ÎµùµÈ ÈÄ ÀÏÀ» ¸¶Ä¡°í Á¾·áµÉ¶§±îÁö ¹«·Á
12Ãʳª °É¸°´Ù´Â °É·Î ¹«Ã´À̳ª °í¹ÎÀ» Çϰí ÀÖ¾ú´Ù(¸ðµç À¥ÆäÀÌÁö´Â 1Ãʾȿ¡
ÇÊ¿äÇÑ ÀÛ¾÷À» ¸¶Ä¡°í °á°ú¸¦ Ãâ·ÂÇØ¾ß Çß¾ú´Ù). ±×¶§ ³ª´Â ¼Óµµ¿¡ ½Å°æ¾²Áö ¸»°í
Á¤È®È÷ ÀÛµ¿Çϵµ·Ï ¸¸µå´Âµ¥ ½Å°æ¾²ÀÚ°í ÇßÀ¸¸ç, ÃÖÀûÈ´Â °¡Àå ³ªÁß ¿ì¼±¼øÀ§·Î
ÇÏÀÚ°í ±Ç°íÇϰí, ±×·¸°Ô ÀÛ¾÷À» Çϵµ·Ï Çß´Ù. ¸¶Ä§³» 3´Þ¿¡ °ÉÃļ ¿Ïº®ÇϰÔ
ÀÛµ¿µÇ´Â Äڵ带 ¸¸µé¾ú°í, 3ÀÏ¿¡ °ÅÃÄ º´¸ñÇö»óÀÌ ÀϾ´Â ºÎºÐÀ» ã¾Æ¼ ¼Óµµ¹®Á¦¸¦
ÇØ°áÇß´Ù. Á¤È®È÷ ÀÛµ¿Çϵµ·Ï ÇÏ´Â ±â´É±¸Çö¿¡ ÃÐÁ¡À» ¸ÂÃãÀ¸·Î½á,
Á¤È®¼º°ú ¼º´É ¸ðµÎ¸¦ ¸¸Á·½ÃŰ´Â ÇÁ·ÎÁ§Æ®¸¦ ¼öÇàÇÏ°Ô µÇ¾ú´Ù.
10.2. ¾îµð¸¦ ÃÖÀûÈ ÇÒ °ÍÀΰ¡ ÃÖÀûÈÇØ¾ß µÉ ºÎºÐÀº ¸¹´Ù. ±×·¯³ª ½Ã°£°ú ´É·ÂÀº ÇÑÁ¤µÇ¾î ÀÖÀ¸¹Ç·Î, ÃÖÀûȸ¦
ÅëÇØ¼ ¸¹Àº À̵æÀ» ¾òÀ» ¼ö ÀÖ´Â ºÎºÐÀ» ¼±º°Çس»¾ß ÇÑ´Ù.
ÃÖÀûÈÇÒ ºÎºÐÀ» ã¾Æ³»´Â °¡Àå ÁÁÀº ¹æ¹ýÀº profiler¸¦
ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. profiler´Â °¢ ÇÔ¼öº°·Î ¾ó¸¶¸¸ÅÀÇ ½Ã°£À» ¼ÒºñÇÏ´ÂÁö
Åë°è¸¦ ³»´Â ÇÁ·Î±×·¥ÀÌ´Ù. GNU/Linux ȯ°æ¿¡¼´Â grpof¶ó´Â Ç¥ÁØ profile
ÇÁ·Î±×·¥À» Á¦°øÇÑ´Ù. ÇÁ·Î±×·¡¸Ó´Â profilerÀÇ °á°ú¸¦ º¸°í, ¾î´À ÇÔ¼ö°¡ °¡Àå
¸¹Àº ½Ã°£À» ¼ÒºñÇß´ÂÁö¸¦ È®ÀÎÇØ¼, ÇÔ¼ö´ÜÀ§·Î ÃÖÀûÈ ½ÃÄѾßÇÒ ºÎºÐÀ» °áÁ¤ÇÒ
¼ö ÀÖ°Ô µÈ´Ù. profilerÀÇ »ç¿ë¹æ¹ýÀº ÀÌ ¹®¼¿¡¼ ³í¿Ü·Î ÇϰڴÙ. profiler¿¡ ´ëÇÑ
ÀÚ¼¼ÇÑ ³»¿ëÀº gprofile »ç¿ë¹®¼¸¦ Âü°íÇϱ⠹ٶõ´Ù.
profile°á°ú ƯÁ¤ÇÔ¼ö°¡ ´ÜÁö 1%Á¤µµÀÇ ½Ã°£¸¸À» ¼ÒºñÇϰí ÀÖ´Ù¸é, ÀÌ ÇÔ¼ö¸¦
ÃÖÀûÈÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±×·¯³ª ¸¸¾à 20%Á¤µµÀÇ ½Ã°£À» ¼ÒºñÇÏ´Â ÇÔ¼ö°¡ ÀÖ´Ù¸é,
ÀÌ ÇÔ¼ö¿¡ ´ëÇØ¼´Â ÁÖ¸ñÇÒ Çʿ䰡 ÀÖ´Ù. ¼ÒºñÇÏ´Â Á¤µµ°¡ Å« ÇÔ¼öÀÏ ¼ö·Ï ¾à°£ÀÇ
ÃÖÀûÈ ¸¸À¸·Î Å« È¿°ú¸¦ ¾òÀ» ¼ö Àֱ⠶§¹®ÀÌ´Ù. 6½Ã°£ÀÇ ³ë·ÂÀ¸·Î 1%ÀÇ ÇÔ¼ö¸¦
0.9%·Î ÃÖÀûÈ ÇÏ´Â °Í°ú 20%ÀÇ ÇÔ¼ö¸¦ 5%ÃÖÀûÈÇÏ´Â °Í, ¾î´À°Ô È¿À²ÀûÀÎÁö´Â
¸»ÇÒ Çʿ䵵 ¾ø´Ù.
ÃÖÀûÈ¿¡´Â Áö¿ªÃÖÀûÈ¿Í Àü¿ªÃÖÀûÈ µÎ°³ÀÇ Ä¿´Ù¶õ ¿µ¿ªÀÌ ÀÖ´Ù.
Áö¿ªÃÖÀûÈ´Â ÁÖ·Î Çϵå¿þ¾î Ư¼º°ú ÇÁ·Î±×·¥ Ư¼º¿¡ °ü·ÃµÈ °ÍµéÀÌ´Ù.
Àü¿ªÃÖÀûÈ´Â ÇÁ·Î±×·¥ÀÇ ±¸Á¶ÀûÀÎ °Íµé°ú °ü°èÀÖ´Ù. ¿¹¸¦ µé¾î ÁöÇÏö ³ë¼±¿¡¼
°¢ ¿ª°£ ÃÖ´Ü °Å¸®¸¦ È®º¸Çϱâ À§ÇÑ ³ë¼±À»?ã¾ÆÁÖ´Â ÇÔ¼ö°¡ ÀÖ´Ù¸é,
´Ù¾çÇÑ ¾Ë°í¸®ÁòÀ» Äڵ忡 Àû¿ëÇÔÀ¸·Î½á ºü¸¥½Ã°£¾È¿¡ ÃִܰŸ®¸¦ ã¾ÆÁÖ´Â ÇÔ¼öÀÇ
ÀÛ¼ºÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù.
10.3. Áö¿ª ÃÖÀûÈ ¹æ¾È ¿©±â¿¡¼´Â Áö¿ª ÃÖÀûȸ¦ À§Çؼ ¾Ë·ÁÁø ¹æ¹ýÁß ¸î °¡Áö¸¦ ¼Ò°³Çϵµ·Ï ÇϰڴÙ.
°í¼öÁØ ¾ð¾î¸¦ »ç¿ëÇÒ °æ¿ì¿¡´Â º¸Åë ÄÄÆÄÀÏ·¯ÀÇ ÃÖÀûÈ °ü·Ã ¿É¼ÇÀ» ÀÌ¿ëÇÔÀ¸·Î½á
ÀÚµ¿ÀûÀ¸·Î ÃÖÀûÈµÈ Äڵ带 ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù.
- ¹Ì¸®°è»êµÈ °ªÀ» ³Ñ°Ü¶ó
ÇÔ¼ö´Â ÀϹÝÀûÀ¸·Î ÀԷ°ú Ãâ·ÂÀÌ °¡´ÉÇÑ µ¥ÀÌÅͰ¹¼ö¿¡ Á¦ÇÑÀ» °¡Áö°í ÀÖ´Ù.
±×·¯¹Ç·Î °¡´ÉÇÑÇÑ ¾î¶² ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡, ÇÊ¿äÇÑ °è»êÀ» ¸ðµÎ ÇÑ´ÙÀ½
ÃÖ¼ÒÇÑÀÇ °£´ÜÇÑ Á¤º¸¸¸À» ÇÔ¼ö¿¡°Ô ³Ñ°ÜÁÙ Çʿ䰡 ÀÖ´Ù. ÇÔ¼ö´Â °¡´ÉÇÑÇÑ
°¡º±°Ô ¸¸µé¾î¾ß ÇÑ´Ù. ¾µµ¥¾øÀÌ ´Ù·®ÀÇ µ¥ÀÌÅ͸¦ ³Ñ°Ü¼, ÇÔ¼ö°¡ ¸¹ÀºÀÏÀ»
ó¸®Çϵµ·Ï ÇÏ´Â Ä¿´Ù¶õ ÇÔ¼öÀÇ »ý¼ºÀº Áö¾çÇϵµ·Ï ÇÑ´Ù.
- °á°ú °ªÀ» ±â¾ïÇ϶ó
ÇÔ¼ö¸¦ È£ÃâÇØ¼ ¾î¶² °è»êÀ» ¼öÇàÇÏ´Â µ¥¿¡´Â ¸¹Àº ºñ¿ëÀÌ ¼ÒºñµÈ´Ù.
±×·¯¹Ç·Î °¡´ÉÇÑ ÇÔ¼ö È£ÃâÀ» ÁÙ¿©¾ßÇÒ Çʿ䰡 ÀÖ´Ù.
ÀÚÁÖ »ç¿ëµÉ ¼ö ÀÖ´Â °è»êµÈ µ¥ÀÌÅÍ´Â ¸Þ¸ð¸®¿¡ ÀúÀåÇÑ ÈÄ, ´Ù¸¥ ÇÊ¿äÇÑ °÷¿¡¼
Àç»ç¿ëÇϵµ·Ï Çϸé ÇÔ¼ö È£ÃâÀ» ÁÙÀÏ ¼ö ÀÖ´Ù.
¿¹¸¦ µé¾î ÇöÀç ½Ã°£À» °¡Áö°í °è»êÀ» ÇÏ´Â ÇÔ¼ö°¡ 3°³ Á¤µµ ÀÖ´Ù°í °¡Á¤ÇØ º¸ÀÚ.
À̰æ¿ì ¸Å¹ø ÇöÀç ½Ã°£À» °¡Á®¿À´Â time()ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀº ³¶ºñ´Ù. Çѹø
time()ÇÔ¼ö¸¦ È£ÃâÇϰí, ±× °ªÀ» ¸Þ¸ð¸®¿¡ ÀúÀåÇÑ´ÙÀ½, ÇÊ¿äÇÑ ÇÔ¼ö°¡ »ç¿ëÇÒ ¼ö
ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ ÈξÀ È¿À²ÀûÀÌ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷Àº ¶§¶§·Î caching ȤÀº
memoizingÀ̶ó°í ºÒ¸®¿î´Ù.
- registerÀÇ ÀÌ¿ë
Register´Â ÄÄÇ»ÅÍ¿¡¼ ºü¸£°Ô Á¢±ÙÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀÌ´Ù.
´ç½ÅÀÌ ¸Þ¸ð¸®¿¡ Á¢±ÙÇÏ·Á°í ÇÑ´Ù¸é, ÇÁ·Î¼¼½º´Â ¹°¸®ÀûÀ¸·Î ¶³¾îÁ® ÀÖ´Â ¸Þ¸ð¸®¿¡
Á¢±ÙÇϱâ À§Çؼ bus¸¦ ÀÌ¿ëÇØ¼ ¸Þ¸ð¸®¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ °¡Á®¿Â´Ù. ¹Ý¸é
register´Â ÇÁ·Î¼¼½º ±× ÀÚ½ÅÀÌ °¡Áö°í ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀÌ´Ù. ´ç¿¬È÷ ¸Å¿ì
ºü¸¦ ¼ö ¹Û¿¡ ¾ø´Ù. ±×·¯¹Ç·Î Çã¿ë°¡´ÉÇÑ µ¥ÀÌÅ͸¦ ·¹Áö½ºÅÍ¿¡ ¿Ã·Á³õ°í
»ç¿ëÀ» ÇÒ Çʿ䰡 ÀÖ´Ù. °í¼öÁؾð¾î¿¡¼´Â ±»ÀÌ ·¹Áö½ºÅÍ¿¡ ´ëÇØ¼ ½Å°æ¾µÇÊ¿ä
¾øÀÌ ¾Ë¾Æ¼ ·¹Áö½ºÅ͸¦ ¾µ°ÍÀÎÁö¸¦ °áÁ¤ÇÑ´Ù.
- inline ÇÔ¼ö
ÇÔ¼ö´Â ÇÁ·Î±×·¥ÀÇ °ü¸®¸¦ À§ÇÑ °¡Àå Áß¿äÇÑ ¿ä¼öÁß Çϳª´Ù. ÇÔ¼ö¸¦ ÀÌ¿ëÇϸé
ÇÁ·Î±×·¥À» ¸ðµâÈ ½Ãų ¼ö ÀÖÀ¸¸ç, Àç»ç¿ë °¡´ÉÇϵµ·Ï ¸¸µé ¼ö ÀÖ´Ù. ¶ÇÇÑ
½±°Ô º¸°í ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾î ÁØ´Ù. ±×·¯³ª ÇÔ¼ö¸¦ È£ÃâÇϱâ À§Çؼ´Â
stack¿µ¿ªÀ¸·Î ÀÎÀÚ¸¦ ¹Ð¾î³Ö°í, jumpÇØ¾ß ÇÏ´Â ¿À¹öÇìµå°¡ ¹ß»ýÇÑ´Ù.
ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°á¹æ¾ÈÀ¸·Î ¸¹Àº ¾ð¾îµéÀÌ inline ÇÔ¼ö ȤÀº inline ¸ÞÅ©·Î ÇÔ¼ö¸¦
Áö¿øÇÑ´Ù. inlineÇÔ¼ö¸¦ »ç¿ëÇÏ°Ô µÇ¸é, ÄÄÆÄÀÏ ÇÒ¶§ ÇÔ¼öÀÇ Äڵ尡 ÇØ´ç ¿µ¿ª¿¡
Á÷Á¢ »ðÀԵȴÙ. ÇÔ¼öÈ£ÃâÀ» ÇÏÁö ¾Ê±â ¶§¹®¿¡, »¡¶óÁö´Â È¿°ú¸¦ ´©¸± ¼ö ÀÖÁö¸¸
¹Ý¸é Äڵ尡 ¸Å¹ø »ðÀÔÀÌ µÇ¹Ç·Î, ÇÁ·Î±×·¥ÀÇ µ¢Ä¡°¡ Ä¿Áö°Ô µÉ °ÍÀÌ´Ù. ¶ÇÇÑ
Àç±ÍÇÔ¼öµî¿¡´Â »ç¿ëÇÒ ¼ö ¾ø´Â µîÀÇ Á¦¾àÀ» °¡Áø´Ù.
¸¸¾à ¼øÈ¯¹®µî¿¡ inlineÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù¸é Æ¯º°È÷ ¸¹Àº È¿°ú¸¦ ´©¸± ¼ö ÀÖÀ» °ÍÀÌ´Ù.
- addressing modes
¾îµå·¹½Ì ¸ðµå¿¡´Â ¸î°¡Áö Á¾·ù°¡ ÀÖ´Ù´Â °ÍÀ» ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ÀÌµé ¾îµå·¹½Ì
¸ðµå´Â °¢°¢ ¼·Î ´Ù¸¥ ¼Óµµ¸¦ °¡Áö°í ÀÖ´Ù. immediate¿Í register ¾îµå·¹½Ì ¸ðµå°¡
°¡Àå ºü¸£¸ç, Direct, indirect ¸ðµå ¼øÀ¸·Î ºü¸£´Ù. pointer¿Í indexed indirect
¸ðµå°¡ ±×Áß °¡Àå ´À¸®´Ù. ±×·¯¹Ç·Î °¡´ÉÇÑ ºü¸¥ ÁÖ¼Ò¸ðµå¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖ´Ù.
- Data Alignment
¾î¶² ÇÁ·Î¼¼¼µéÀº µ¥ÀÌÅ͸¦ ¿¢¼¼½ºÇÒ ¶§ word-aligned ÇÑ´Ù. º¸Åë word´ÜÀ§·Î
³ª´©¾î¼ ¿¢¼¼½ºÇÏ°Ô µÇ´Âµ¥, non-aligned data¹æ½Äº¸´Ù ºü¸£°Ô ¿¢¼¼½º°¡
°¡´ÉÇÏ´Ù. ±×·¡¼ ±¸Á¶Ã¼¸¦ ¸¸µé°Ô µÉ¶§, ±¸Á¶Ã¼ÀÇ Å©±â°¡ word´ÜÀ§·Î
¸¸µé¾îÁö´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ cÄڵ带 ÄÄÆÄÀÏ ÇÑ´ÙÀ½ °á°ú¸¦
È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.
#include <stdio.h>
struct data
{
int a;
char b[1];
};
int main()
{
struct data mydata;
printf("%d\n", sizeof(mydata));
} |
Áö±Ý±îÁö ¾ð±ÞÇÑ ¹æ¹ýµéÀº ¿©·¯°¡Áö Áö¿ªÃÖÀûÈ ¹æ¹ýÁß ¸î°¡Áö¿¡ ºÒ°úÇÏ´Ù. ÇÏÁö¸¸ °¡Àå Áß¿äÇÑ
¿ä¼Ò´Â Àб⽱°í °ü¸®Çϱ⠽¬¿î Äڵ带 ¸¸µå´Âµ¥ ÀÖ´Ù´Â °É ±â¾ïÇØ µÎ±æ ¹Ù¶õ´Ù.
10.4. Àü¿ª ÃÖÀûÈ ¹æ¾È Àü¿ªÃÖÀûÈ´Â µÎ°¡Áö ¸ñÇ¥¸¦ °¡Áø´Ù. ù¹øÂ°´Â Áö¿ª ÃÖÀûȰ¡ °¡´ÉÇϵµ·Ï Äڵ带 ÀÛ¼º
ÇÏ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î, ¸¸µé¾îÁø Äڵ尡 º¹ÀâÇÑ È帧À» °¡Áø Ä¿´Ù¶õ ÇϳªÀÇ
procedure·Î ±¸¼ºµÇ¾î ÀÖ´Ù¸é, ´À¸®°Ô ÀÛµ¿ÇÒ °ÍÀÌ´Ù. À̰ÍÀ» ´Ü¼øÇÑ ÀÏÀ» ÇÏ´Â
¿©·¯°³ÀÇ ÄÚµå·Î Âɰµ´ÙÀ½ °è»êµÈ °ªÀ» ¸Þ¸ð¸®¿¡ ÀúÀåÇϰųª ´Ù¸¥ ÇÔ¼ö·Î ³Ñ±â´Â
½ÄÀ¸·Î ÇØ¼ È¿À²ÀûÀ¸·Î µ¹¾Æ°¡°Ô²û ¸¸µé ¼ö ÀÖ´Ù.
stateless ÇÔ¼ö(¾î¶°ÇÑ ±Û·Î¹úÇÔ¼ö³ª, ½Ã½ºÅÛÄݵµ »ç¿ëÇÏÁö ¾Ê°í, ¹Þ¾ÆµéÀÎ Àμö¸¦
°¡Áö°í ´ÜÁö ¿¬»ê¸¸ ÇÏ´Â ÇÔ¼ö)´Â ÃÖÀûȸ¦ À§ÇÑ ÁÁÀº ¹æ¹ýÀÌ´Ù. ÇÁ·Î±×·¡¸Ó´Â
°¡´ÉÇϸé ÇÁ·Î±×·¥À» StatelessÇÑ ÇÔ¼öµé·Î ¸ðµâÈ ÇÔÀ¸·Î½á ÃÖÀûÈ Á¤µµ¸¦ ³ôÀÏ ¼ö
ÀÖ´Ù. ÀüÀÚ»ó°Å·¡ ÇÁ·ÎÁ§Æ®¸¦ ¿¹·Î µé¾î º¸°Ú´Ù. ÀüÀÚ»ó°Å·¡¿¡¼´Â
ƯÁ¤ÇÑ Á¦Ç° ¸ñ·Ï°ú °ü·ÃµÈ Á¤º¸¸¦ °¡Áö°í ¿À´Âµ¥, À̸¦ À§Çؼ 12¹øÀÇ µ¥ÀÌÅͺ£À̽º
È£ÃâÀ» ÇØ¾ßÇß°í, ÃÖ¾ÇÀÇ °æ¿ì 20Ãʶó´Â ½Ã°£À» ¼ÒºñÇß´Ù. ÀÌ ÇÁ·Î±×·¥Àº À¥À»
ÅëÇØ¼ °í°´°ú »óÈ£´ëÈ ÇØ¾ß Çϴµ¥, ÀÌ´Â ³Ê¹«³ª ±ä½Ã°£ÀÌ¿´´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ
À§Çؼ Ãʱâ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ ¶§, Á¦Ç°¸ñ·ÏÀ» Àоî¿Í¼ ¸Þ¸ð¸®¿¡ ÀûÀçÇϰí, ÇÔ¼ö¿¡¼´Â
¸Þ¸ð¸®ÀÇ Á¦Ç°¸ñ·ÏÀ» °¡Á®¿Àµµ·Ï Áï statlessÇÑ ÇÔ¼ö¸¦ ¸¸µå´Â ¹æ¹ýÀ» »ç¿ëÇß´Ù.
Á¦Ç°ÀÇ ¸ñ·ÏÀº º¯°æÀÌ µÉ ¼ö ÀÖÀ¸¹Ç·Î, ÀÏÁ¤½Ã°£ °£°ÝÀ¸·Î ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» °»½ÅÇϵµ·Ï
ÇÏ´Â ¶Ç´Ù¸¥ ÇÔ¼ö¸¦ ¸¸µé¾úÀ¸¸ç °á°úÀûÀ¸·Î 1Ãʾȿ¡ ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î³Â´Ù.
Àü¿ª ÃÖÀûȸ¦ À§Çؼ º¸Åë ¾Æ·¡¿Í °°Àº Ư¼ºÀ» °®Ãßµµ·Ï ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù.
- º´·ÄÈ
º´·ÄÈ´Â Äڵ尡 ´ÙÁß ÇÁ·Î¼¼½º¿¡ ÀÇÇØ¼ ºÐÇҵǾî¼
½ÇÇàÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀÚµ¿Â÷¸¦ ¸¸µç´Ù°í °¡Á¤À» ÇØº¸ÀÚ. À̰æ¿ì
¿£Áø°ú ÀÎÅ׸®¾î¸¦ ¸¸µå´Â ºÎºÐÀº ¼·Î µ¶¸³½ÃÄѼ µ¿½Ã¿¡ ÀÛ¾÷ÀÌ
°¡´ÉÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ¿©·¯ºÐÀÇ ÄÄÇ»ÅͰ¡ ´ÙÁßÀÇ ÇÁ·Î¼¼½º³ª
Ŭ·¯½ºÅ͸µ µÇ¾î ÀÖ°í, À̵é ÀÚ¿øÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù¸é, º´·ÄÈµÈ ÄÚµå´Â
È¿À²¿¡¼ ¸¹Àº ÀÕÁ¡À» ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.
- stateless
stateless ÇÔ¼ö¿Í ÇÁ·Î±×·¥Àº ÇÔ¼ö»çÀÌ¿¡ ¸íÈ®ÇÏ°Ô Á¤ÀÇµÈ µ¥ÀÌÅ͸¸À»
ÁÖ°í¹Þ´Â´Ù. ¹°·Ð ¸ðµç ÇÔ¼ö°¡ statelessÇÒ ¼ö´Â ¾ø´Ù.
ÀüÀÚ»ó°Å·¡ ÇÁ·Î±×·¥À» ¿¹·Îµé¾îº¸ÀÚ. ´ëºÎºÐÀÇ ÇÔ¼ö°¡ ¸Þ¸ð¸®¿¡ ÀÖ´Â
»óǰÁ¤º¸¸¦ ÁÖ°í ¹Þ´Â´Ù°í ÇÏ´õ¶óµµ, ÃÖÃÊ¿¡ ÇϳªÀÇ ÇÔ¼ö´Â DB¿¡ Á¢±ÙÇØ¼
»óǰÁ¤º¸¸¦ Àоî¿À´Â ÀÏÀ» ÇØ¾ßÇÒ °ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â statelessÇÒ ¼ö ¾ø´Ù.
statelessÇÏÁö ¾ÊÀº ÇÔ¼öÀÇ ½ÇÇàÀ» ÃÖ¼ÒÈ ½Ãų¼ö´Â ÀÖ´Ù. »óǰÁ¤º¸¶ó´Â°Ô
º¯°æÀÌ ÀÚÁÖ ÀϾ´Â°Ô ¾Æ´Ï±â ¶§¹®¿¡, ÇÏ·ç¿¡ Çѹø¸¸ DB¿¡¼ Á¤º¸¸¦
°¡Á®¿À´Â µîÀÇ ¹æ¹ýÀ¸·Î ÀÌ·¯ÇÑ ÇÔ¼öÀÇ ½ÇÇàÀ» ÃÖ¼ÒÈ ½Ãų¼ö ÀÖÀ¸¸ç, ½ÇÁ¦
ÀÌ·¯ÇÑ ¹æ¹ýÀ» ÀÌ¿ëÇØ¼ ÇÁ·Î±×·¥À» ÃÖÀûÈ ½ÃÄ×´Ù.
11. Appendix A. GUI ÇÁ·Î±×·¡¹Ö À̹øÀåÀÇ Graphical User Interface¸¦ ÀÛ¼ºÇϱâ À§ÇÑ ¹æ¹ýÀ» °¡¸®Ä¡´Â°Ô
¸ñÀûÀÌ ¾Æ´Ï´Ù. ´ÜÁö ´Ù¸¥ ÀÀ¿ëÀ» ÀÛ¼ºÇϸé¼, ¾î¶»°Ô GUIÀûÀÎ ºÎºÐÀ»
±¸ÇöÇØ¾ß ÇÒ°ÍÀÎÁö, ±×·¯ÇÑ ±¸ÇöÀ» À§ÇÑ ¾î¶°ÇÑ µµ±¸¿Í ¶óÀ̺귯¸®°¡ ÀÖ´ÂÁö
Á¤µµ¸¸À» ¼Ò°³Çϵµ·Ï ÇÒ °ÍÀÌ´Ù. ¿©±â¿¡¼ ¼Ò°³ÇÑ ¶óÀ̺귯¸®¸¦ Á¦´ë·Î »ç¿ë
Çϱâ À§Çؼ´Â º°µµ·Î ÇнÀÀ» ÇØ¾ß ÇÒ°ÍÀÌ´Ù.
11.1. GNOME ¶óÀ̺귯¸® GNOME´Â ¸®´ª½º À¯Àú¿¡°Ô µ¥½ºÅ©Å¾È¯°æÀ» Á¦°øÇØÁÖ±â À§ÇÑ ¸ñÀûÀ¸·Î ½ÃÀÛµÈ
¿©·¯ ÇÁ·ÎÁ§Æ®Áß Çϳª·Î, Linux ¿¡¼´Â QT¿Í ÇÔ²² µ¥½ºÅ©Å¾¶óÀ̺귯¸®ÀÇ
¾ç´ë»ê¸ÆÀ¸·Î ÀÚ¸®Àâ°í ÀÖ´Ù. GNOME ÇÁ·ÎÁ§Æ®´Â ÀÀ¿ëÀ» ½ÇÇà½Ã۱â À§ÇÑ
launcher(½ÇÇà±â)¿Í ½ÇÇàµÈ ÀÀ¿ëÀ» ¹è¿ÇÒ ¼ö ÀÖ´Â panel, ÀÀ¿ëÀÇ Ç¥ÁØÀÌ
µÇ´Â ÆÄÀϰü¸®,¼¼¼Ç °ü¸®, ¼³Á¤°ü¸®µî°ú °ü·ÃµÈ API¸¦ Á¦°øÇÑ´Ù.
GNOME¶óÀ̺귯¸®´Â Ư¼º»ó Ä¿´Ù¸¥ µ¥ÀÌÅÍ ±¸Á¶¸¦ »ý¼ºÇϰí À¯ÁöÇÏ´Â ÀÏ·ÃÀÇ
ÀÛ¾÷À» ¼öÇàÇÏÁö¸¸ ÇÁ·Î±×·¡¸Ó·Î ÇÏ¿©±Ý ¸Þ¸ð¸®¸¦ ¾î¶»°Ô °ü¸®ÇØ¾ß ÇÒÁöµîÀÇ
°í¹ÎÀ» ÇÏÁö ¾Êµµ·Ï ±¸ÇöµÇ¾î ÀÖ´Ù. ÀÌ·¯ÇÑ ±¸ÇöÀÇ ÇÙ½ÉÀº ¸ðµç GUI
±¸Á¶Ã¼ µ¥ÀÌÅ͸¦ ÇÔ¼öÈ£ÃâÀ» ÅëÇØ¼ ó¸®Çϵµ·Ï Çϴµ¥ ÀÖ´Ù. ÀÌ·¯ÇÑ
¶óÀ̺귯¸® µðÀÚÀÎÀº À¯Áöº¸½º Ãø¸é¿¡¼ ¸¹Àº µµ¿òÀ» ÁØ´Ù. ¿¹¸¦ µé¾î¼
¶óÀ̺귯¸®ÀÇ ¹öÁ¯ÀÌ ¹Ù²î¾ú´Ù°í °¡Á¤À» ÇØº¸ÀÚ. ÀÌ·²°æ¿ì µ¥ÀÌÅÍ ±¸Á¶µµ
º¯°æµÉ ¼ö Àִµ¥, µ¥ÀÌÅÍ ±¸Á¶ ÀÚü¸¦ ¶óÀ̺귯¸®¿¡¼ ¸ðµÎ ó¸®Çϱ⠶§¹®¿¡
¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ÀÀ¿ëÃø¿¡¼´Â ¹öÁ¯ÀÌ ¹Ù²ñ¿¡ µû¸¥ ÄÚµå ¼öÁ¤À»
ÃÖ¼ÒÈ ½Ãų¼ö°¡ ÀÖ´Ù. ±×³É ÄÄÆÄÀÏÇÑ ´Ù½Ã ÇØÁÖ¸é »ç¿ëÇϴµ¥, ¹®Á¦°¡
¾ø´Ù. GNOME´Â ¶óÀ̺귯¸®¿Í ÀÀ¿ë°£ÀÇ µ¥ÀÌÅÍ ±³È¯À» À§Çؼ, ½Çµ¥ÀÌÅ͸¦
Àü¼ÛÇÏ´Â ´ë½Å¿¡, °´Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ÁÖ°í ¹Þ°Ô µÇ¸ç, ÇÁ·Î±×·¡¸Ó´Â
ÀڷᱸÁ¶¿¡ Æ÷ÇԵǾî ÀÖ´Â ¿©·¯°¡Áö µ¥ÀÌÅ͵鿡´ëÇØ¼ ½Å°æ¾µ Çʿ䰡
¾ø´õ·Ï ±¸¼ºµÇ¾î ÀÖ´Ù.
À̹øÀå¿¡¼´Â GNOMEÀÇ ±âº»ÀûÀÎ °³³ä°ú ÇÁ·Î±×·¡¹Ö ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï
ÇÒ°ÍÀÌ´Ù. GNOME ÇÁ·Î±×·¡¹Ö¿¡ º»°ÝÀûÀ¸·Î ¶Ù¾îµé°í ½Í´Ù¸é GNOME °³¹ßÀÚ
»çÀÌÆ®ÀÎ http://developer.gnome.org¸¦ ¹æ¹®ÇÏ±æ ¹Ù¶õ´Ù. ÀÌ »çÀÌÆ®´Â
ÀÚ½À¼, ¸ÞÀϸµ¸®½ºÆ®, API ¹®¼µî GNOMEȯ°æ¿¡¼ ÇÁ·Î±×·¡¹ÖÀ»À§ÇÑ ´Ù¾çÇÑ
¹®¼¸¦ Á¦°øÇÑ´Ù.
11.2. ´Ù¾çÇÑ ¾ð¾î¸¦ ÀÌ¿ëÇÑ °£´ÜÇÑ GNOME ÇÁ·Î±×·¥ ÀÛ¼º ±×·³ quit ¹öưÀ» Æ÷ÇÔÇÑ °£´ÜÇÑ À©µµ¿ì ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.
ÀÌ ÇÁ·Î±×·¥Àº ¹öưÀ» Ŭ¸¯ÇÏ°Ô µÇ¸é, Á¤¸» ÇÁ·Î±×·¥À» Á¾·á½Ãų °ÍÀÎÁö¸¦
¹°¾îº¸´Â ´ëÈâÀÌ ¶ß°í yes¸¦ Ŭ¸¯Çϸé Á¾·áÇÏ´Â °£´ÜÇÑ ÀÏÀ» ÇÑ´Ù.
# PURPOSE : GNOME Library¸¦ ÀÌ¿ëÇÑ °£´ÜÇÑ GUI ÇÁ·Î±×·¥ Á¦ÀÛ ¿¹¸¦ º¸¿©ÁØ´Ù.
# INPUT : »ç¿ëÀÚ·Î ºÎÅÍ Quit ¹öư Ŭ¸¯ À̺¥Æ®¸¦ ¹ÞÀ¸¸é À©µµ¿ì¸¦ Á¾·áÇÑ´Ù.
# OUTPUT : ÇÁ·Î±×·¥ÀÇ Á¾·á
#
# PROCESS : ¸¸¾à À¯Àú°¡ "Quit" ¹öưÀ» Ŭ¸¯Çϸé, È®ÀÎÀ» À§ÇÑ ´ëÈâÀ» ¶Ù¿î´Ù.
# À¯Àú°¡ Yes¸¦ Ŭ¸¯Çϸé Á¾·áµÇ°í, ±×·¸Áö ¾ÊÀ¸¸é °è¼Ó ½ÇÇàµÈ´Ù.
#
.section .data
### Gnome Á¤ÀÇ
# C¾ð¾î¿¡¼ÀÇ Çì´õÆÄÀϰú °°Àº ÀÏÀ» ÇÑ´Ù. °¢Á¾ Á¤ÀÇµÈ °ªÀÌ µé¾î°£´Ù.
#
# GNOME ¹öư À̸§
GNOME_STOCK_BUTTON_YES:
.ascii "Button_Yes\0"
GNOME_STOCK_BUTTON_NO:
.ascii "Button_No\0"
# Gnome ¸Þ½ÃÁö ¹Ú½º ŸÀÔ
GNOME_MESSAGE_BOX_QUESTION:
.ascii "question\0"
# NULL¿¡´ëÇÑ Ç¥ÁØ Á¤ÀÇ
.equ NULL, 0
# GNOME ½Ã±×³Î Á¤ÀÇ
signal_destroy:
.ascii "destory\0"
signal_delete_event:
.ascii "delete_event\0"
signal_clicked:
.ascii "clicked\0"
### ¾ÖÇø®ÄÉÀÌ¼Ç °ü·Ã Á¤Àǵé
# ¾ÖÇø®ÄÉÀÌ¼Ç Á¤º¸
app_id:
.ascii "gnome-example\0"
app_version:
.ascii "1.000\0"
app_title:
.ascii "Gnome Example Program\0"
# ¹öư¹× À©µµ¿ìâ¿¡ »ç¿ëµÉ ¹®Àåµé
button_quit_text:
.ascii "I Want to Quit the GNOME Example Program\0"
quit_question:
.ascii "Are you sure you want to quit?\0"
.section .bss
# À§Á¬°ü·ÃµÈ º¯¼ö ÀúÀå
.equ WORD_SIZE, 4
.lcomm appPtr, WORD_SIZE
.lcomm btnQuit, WORD_SIZE
.section .text
.globl main
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
# GNOME ¶óÀ̺귯¸® ÃʱâÈ
pushl 12(%ebp) # argv
pushl 8(%ebp) # argc
pushl $app_version
pushl $app_id
call gnome_init
addl $16, %esp # ½ºÅà º¹±¸
# »õ·Î¿î ¾ÖÇø®ÄÉÀÌ¼Ç À©µµ¿ì »ý¼º
pushl $app_title # À©µµ¿ì ŸÀÌÆ²
pushl $app_id # ¾ÖÇø®ÄÉÀÌ¼Ç ID
call gnome_app_new
addl $8, %esp # ½ºÅà º¹±¸
movl %eax, appPtr # À©µµ¿ì Æ÷ÀÎÅÍ ÀúÀå
# »õ·Î¿î ¹öư »ý¼º
pushl $button_quit_text # ¹öư ¹®ÀÚ
call gtk_button_new_with_label
addl $4, %esp # ½ºÅú¹±¸
movl %eax, btnQuit # ¹öưÆ÷ÀÎÆ® ÀúÀå
# ¹öưÀ» ¾ÖÇø®ÄÉÀÌ¼Ç À©µµ¿ì ¾È¿¡ ¹èÄ¡
pushl btnQuit
pushl appPtr
call gnome_app_set_contents
addl $8, %esp
# ¹èÄ¡µÈ ¹öư À§Á¬À» º¸¿©ÁØ´Ù.
pushl btnQuit
call gtk_widget_show
addl $4, %esp
# ¾ÖÇø®ÄÉÀÌ¼Ç À©µµ¿ì¸¦ º¸¿©ÁØ´Ù.
pushl appPtr
call gtk_widget_show
addl $4, %esp
# delete À̺¥Æ® Çîµé·¯ ¼³Á¤
pushl $NULL # ÇÔ¼ö¿¡ ³Ñ±æ NULL °ª
pushl $delete_handler
pushl $signal_delete_event
pushl appPtr
call gtk_signal_connect
addl $16, %esp # ½ºÅà º¹±¸
# destory À̺¥Æ® Çڵ鷯 ¼³Á¤
pushl $NULL
pushl $destroy_handler #
pushl $signal_destroy
pushl appPtr
call gtk_signal_connect
addl $16, %esp # ½ºÅà º¹±¸
# Ŭ¸¯ À̺¥Æ®°¡ ¹ß»ýÇßÀ» ¶§, È£ÃâµÉ ÇÔ¼öÀÇ ¼³Á¤
pushl $NULL
pushl $click_handler
pushl $signal_clicked
pushl btnQuit
call gtk_signal_connect
addl $16, %esp
#Transfer control to GNOME. Everything that
#happens from here out is in reaction to user
#events, which call signal handlers. This main
#function just sets up the main window and connects
#signal handlers, and the signal handlers take
#care of the rest
call gtk_main
#After the program is finished, leave
movl $0, %eax
leave
ret
#A "destroy" event happens when the widget is being
#removed. In this case, when the application window
#is being removed, we simply want the event loop to
#quit
destroy_handler:
pushl %ebp
movl %esp, %ebp
#This causes gtk to exit it¡¯s event loop
#as soon as it can.
call gtk_main_quit
movl $0, %eax
leave
ret
#A "delete" event happens when the application window
#gets clicked in the "x" that you normally use to
#close a window
delete_handler:
movl $1, %eax
ret
#A "click" event happens when the widget gets clicked
click_handler:
pushl %ebp
movl %esp, %ebp
#Create the "Are you sure" dialog
pushl $NULL #End of buttons
pushl $GNOME_STOCK_BUTTON_NO #Button 1
pushl $GNOME_STOCK_BUTTON_YES #Button 0
pushl $GNOME_MESSAGE_BOX_QUESTION #Dialog type
pushl $quit_question #Dialog mesasge
call gnome_message_box_new
addl $16, %esp #recover stack
#%eax now holds the pointer to the dialog window
#Setting Modal to 1 prevents any other user
#interaction while the dialog is being shown
pushl $1
pushl %eax
call gtk_window_set_modal
popl %eax
addl $4, %esp
#Now we show the dialog
pushl %eax
call gtk_widget_show
popl %eax
#This sets up all the necessary signal handlers
#in order to just show the dialog, close it when
#one of the buttons is clicked, and return the
#number of the button that the user clicked on.
#The button number is based on the order the buttons
#were pushed on in the gnome_message_box_new function
pushl %eax
call gnome_dialog_run_and_close
addl $4, %esp
#Button 0 is the Yes button. If this is the
#button they clicked on, tell GNOME to quit
#it¡¯s event loop. Otherwise, do nothing
cmpl $0, %eax
jne click_handler_end
call gtk_main_quit
click_handler_end:
leave |
¸¸µé¾îÁø ÄÚµå´Â ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ºôµåÇÏ¸é µÈ´Ù.
# as gnome-example.s -o gnome-example.o
# gcc gnome-example.o `gnome-config --libs gnomeui` -o gnome-example |
ÀÌ ÇÁ·Î±×·¥Àº Gnome¿¡¼ Á¦°øÇÏ´Â ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼, ÇÊ¿äÇÑ À§Á¬À» »ý¼ºÇϰí À̵éÀ»
Á¦¾îÇϰí ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥¿¡¼ »ç¿ëµÈ Gnome ÇÔ¼öµéÀº ´ÙÀ½°ú °°´Ù.
- gnome_init
¸í·ÉÇàÀÎÀÚ¿Í ÀÎÀÚÀÇ °¹¼ö, ¾ÖÇø®ÄÉÀÌ¼Ç id, ¹öÁ¯µîÀÇ Á¤º¸¸¦ °¡Áö°í Gnome ¶óÀ̺귯¸®¸¦
ÃʱâÈ ÇÑ´Ù.
- gnome_app_new
»õ·Î¿î ¾ÖÇø®ÄÉÀÌ¼Ç À©µµ¿ì¸¦ ¸¸µé°í Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÎÀÚ·Î ¾ÖÇø®ÄÉÀÌ¼Ç id¿Í
À©µµ¿ì Á¦¸ñÀ» ¹Þ¾ÆµéÀδÙ.
- gtk_button_new_with_label
»õ·Î¿î ¹öưÀ» ¸¸µé°í Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÎÀÚ·Î ¹öư¿¡ »ç¿ëµÉ ¹®ÀÚ¿À» ¹Þ¾ÆµéÀδÙ.
- gnome_app_set_contents
¾ÖÇø®ÄÉÀÌ¼Ç À©µµ¿ì¿¡ Æ÷ÇÔ½Ãų À§Á¬À» ¼³Á¤ÇÑ´Ù.
- gtk_widget_show
À§Á¬À» »ý¼º½ÃŲ ÈÄ, ½ÇÁ¦·Î º¸ÀÌ°Ô ÇÏ·Á¸é ¹Ýµå½Ã È£ÃâÇØ¾ß ÇÑ´Ù.
- gtk_signal_connect
À§Á¬Àº ¹öưŬ¸¯°ú °°Àº À̺¥Æ®°¡ ¹ß»ýÇÏ°Ô µÇ´Âµ¥, ÀÌ·¯ÇÑ À̺¥Æ® ½Ã±×³ÎÀÌ ¹ß»ýÇßÀ» ¶§
ó¸®ÇØÁÙ callback ÇÔ¼ö¸¦ µî·Ï½Ã۱â À§Çؼ »ç¿ëÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ½Ã±×³ÎÀ» ¹ß»ý½ÃŰ´Â
À§Á¬ÀÇ Æ÷ÀÎÅÍ¿Í callback ÇÔ¼ö¿Í ±âŸ ÇÊ¿äÇÑ µ¥ÀÌÅÍ Æ÷ÀÎÅ͸¦ ÇÊ¿ä·Î ÇÑ´Ù.
ÀÌ ÇÔ¼ö¸¦ ½ÇÇà½Ã۸é, ƯÁ¤ À̺¥Æ®°¡ ¹ß»ýµÉ ¶§, ÇØ´ç À̺¥Æ®¸¦ ó¸®ÇÒ ÇÔ¼ö°¡ È£ÃâµÈ´Ù.
ÀÌ ÇÁ·Î±×·¥ÀÇ °æ¿ì ±âŸ µ¥ÀÌÅ͸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê±â ¶§¹®¿¡ NULL·Î ó¸®Çß´Ù.
- gtk_main
GNOMEÀÇ main ·çÇÁÇÔ¼ö´Ù.
- gtk_main_quit
GNOMEÀÇ main ·çÇÁ¸¦ ºüÁ®³ª¿À±â À§ÇÑ ÇÔ¼ö´Ù.
- gnome_message_box_new
ÀÀ´äÀÌ °¡´ÉÇÑ ´ëÈâÀ» ¸¸µç´Ù. ´ëÈâÀº ÁúÀÇÀÇ Æ¯Â¡¿¡ µû¶ó¼ warning, question µîÀÇ
ŸÀÔÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
- gtk_window_set_modal
modal ŸÀÔÀÇ Ã¢À» ¸¸µç´Ù. modal ŸÀÔÀÇ Ã¢Àº ÇØ´ç âÀÌ ´ÝÈ÷±â Àü¿¡´Â ºÎ¸ðâÀ»
¼±ÅÃÇÒ ¼ö ¾ø´Ù.
´ÙÀ½Àº C¾ð¾î·Î ÀÛ¼ºµÈ µ¿ÀÏÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
#include <gnome.h>
#define MY_APP_TITLE "Gnome Example Program"
#define MY_APP_ID "gnome-example"
#define MY_APP_VERSION "1.000"
#define MY_BUTTON_NEXT "I Want to Quit the Example Program"
#define MY_QUIT_QUESTION "Are you sure you want to quit?"
int destroy_handler(gpointer window,
GdkEventAny *e,
gpointer data);
int delete_handler(gpointer window,
GdkEventAny *e,
gpointer data);
int click_handler(gpointer window,
GdkEventAny *e,
gpointer data);
int main(int argc, char **argv)
{
gpointer appPtr;
gpointer btnQuit;
gnome_init(MY_APP_ID, MY_APP_VERSION, argc, argv);
appPtr = gnome_app_new(MY_APP_ID, MY_APP_TITLE);
btnQuit = gtk_button_new_with_label(MY_BUTTON_NEXT);
gnome_app_set_contents(appPtr, btnQuit);
gtk_widget_show(btnQuit);
gtk_widget_show(appPtr);
gtk_signal_connect(appPtr, "delete_event",
GTK_SIGNAL_FUNC(delete_handler), NULL);
gtk_signal_connect(appPtr, "destroy",
GTK_SIGNAL_FUNC(destroy_handler), NULL);
gtk_signal_connect(btnQuit, "clicked",
GTK_SIGNAL_FUNC(click_handler), NULL);
gtk_main();
return 0;
}
int destroy_handler(gpointer window,
GdkEventAny *e,
gpointer data)
{
gtk_main_quit();
return 0;
}
int delete_handler(gpointer window,
GdkEventAny *e,
gpointer data)
{
return 0;
}
int click_handler(gpointer window,
GdkEventAny *e,
gpointer data)
{
gpointer msgbox;
int buttonClicked;
msgbox = gnome_message_box_new(
MY_QUIT_QUESTION,
GNOME_MESSAGE_BOX_QUESTION,
GNOME_STOCK_BUTTON_YES,
GNOME_STOCK_BUTTON_NO,
NULL);
gtk_window_set_modal(msgbox, 1);
gtk_widget_show(msgbox);
buttonClicked = gnome_dialog_run_and_close(msgbox);
if(buttonClicked == 0)
{
gtk_main_quit();
}
return 0;
}
|
´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀÏ ÇÏ¸é µÈ´Ù.
# gcc gnome-example-c.c `gnome-config --cflags \
--libs gnomeui` -o gnome-example-c |
¼º°øÀûÀ¸·Î ÄÄÆÄÀÏÀ» ³¡³Â´Ù¸é ./gnome-example-c·Î ½ÇÇàÇϵµ·Ï ÇÑ´Ù.
11.3. GUI Builders ¿©±â¿¡¼ Á¦½ÃÇÑ ¿¹Á¦µéÀº UI¸¦ ¸¸µé±â À§Çؼ ÇÊ¿äÇÑ ÇÔ¼ö¸¦ ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢
ºÒ·¯¼ »ç¿ëÇÏ´Â ¹æ½ÄÀÌ¿´´Ù. ±×·¯³ª UI´Â Ư¼º»ó ºñÁê¾óÇÑ È¯°æ¿¡¼ µðÀÚÀÎÇÒ ¼ö
ÀÖ´Â ÅøÀ» ÀÌ¿ëÇØ¼ Äڵ带 »ý¼ºÇϴ°Ô, °³¹ß½Ã°£À» ¾Æ³¥ ¼ö ÀÖ´Ù. ±×·¡¼ GNOME¿ª½Ã
UI¸¦ µðÀÚÀÎÇÒ ¼ö ÀÖ´Â GLADE¶ó´Â UI µðÀÚÀÎ ÅøÀ» Á¦°øÇÑ´Ù.
ÀÌ ÅøÀ» ÀÌ¿ëÇϸé, °³¹ßÀÚ´Â ºñÁê¾óÇÑ È¯°æ¿¡¼ À©µµ¿ìÀÇ °¢ ¿ä¼ÒµéÀ» ¹èÄ¡ÇÒ ¼ö ÀÖ´Ù.
12. Appendix B. Common x86 Instructions InstructionsÀº Å×À̺í ÇüÅ·Π¼³¸íÀ» Çϵµ·Ï ÇÒ °ÍÀÌ´Ù. ÀÌ Å×À̺íÀº ¾Æ·¡¿Í °°Àº
³»¿ëµéÀ» ´ã°í ÀÖ´Ù.
12.1. Data Transfer Instructions
표 1. Data Transfer Instructions | Instruction | Operands | Affected Flags | | movl | I/R/M, I/R/M | O/S/Z/A/C | | word ´ÜÀ§ÀÇ µ¥ÀÌÅ͸¦ ´Ù¸¥ À§Ä¡·Î ¿Å±â±â À§Çؼ »ç¿ëÇÑ´Ù. movl %eax %ebx ´Â %eaxÀÇ µ¥ÀÌÅ͸¦ %ebx·Î º¹»çÇ϶ó´Â Àǹ̴Ù. | | movb | I/R/M, I/R/M | O/S/Z/A/C | | byte´ÜÀ§À롃 Á¦¿ÜÇϰí´Â movl°ú µ¿ÀÏÇÑ ÀÏÀ» ÇÑ´Ù. | | leal | M, I/R/M | O/S/Z/AC | | ¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ °è»êÇØ¼, ÇØ´ç ÁÖ¼Ò¸¦ Àоî¿Â´Ù. ¿¹¸¦µé¾î leal 5(%ebp, %ecx, 1)Àϰæ¿ì 5+%ebp+1*%ecx ·Î °è»êµÈ ÁÖ¼ÒÀÇ °ªÀÌ %eax¿¡ ÀúÀåµÈ´Ù. | | popl | R/M | O/S/Z/A/C | | ½ºÅÃÀÇ °¡Â¡À§¿¡ ÀÖ´Â À§Ä¡°ªÀ» °¡Á®¿Â´Ù. À̰ÍÀº movl (%esp), R/M ÈÄ addl $4 ÇÑ °Í°ú °°Àº °á°ú¸¦ º¸¿©ÁØ´Ù. | | pushl | I/R/M | O/S/Z/A/C | | ½ºÅÿ¡ °ªÀ» ¹Ð¾î ³Ö´Â´Ù. movl %eax, (%esp)ÈÄ subl $4, %espÇÑ °Í°ú °°Àº °á°ú¸¦ º¸¿©ÁØ´Ù. | | xchgl | R/M, R/M | O/S/Z/A/C | | °ªÀ» ¼·Î ¹Ù²Û´Ù. |
12.2. Integer Instructions
ºÎÈ£ÀÖ´Â Á¤¼öÇü°ú ºÎÈ£¾ø´Â Á¤¼öÇüÀÇ °è»êÀ» À§ÇÑ ¸í·ÉÀ» ¼Ò°³ÇÑ´Ù.
표 2. Data Transfer Instructions | Instruction | Operands | Affected Flags | | adcl | I/R/M, R/M | O/S/Z/A/P/C | | | | addl | I/R/M, R/M | O/S/Z/A/P/C | | ù¹øÂ° ¿ÀÆÛ·£µå¿Í µÎ¹øÂ° ¿ÀÆÛ·£µå¸¦ ´õÇÑ´Ù. °á°ú´Â µÎ¹øÂ° ¿ÀÆÛ·£µå¿¡ ÀúÀåµÈ´Ù. ¸¸¾à ´õÇÑ °á°ú°¡ ÀúÀåµÉ ·¹Áö½ºÅÍÀÇ °ø°£º¸´Ù Å«´Ù¸é, overflow°¡ ¹ß»ýÇϰí bits´Â ÂüÀÌ µÈ´Ù. ÀÌ ¸í·ÉÀº ºÎÈ£Çü°ú ºÎÈ£¾ø´Â Á¤¼öÇü ¸ðµÎ¿¡ »ç¿ëµÈ´Ù. |
13. Appendix C. ÁÖ¿ä ½Ã½ºÅÛ ÄÝµé ¿©±â¿¡¼´Â ¸®´ª½º¿¡¼ »ç¿ëÇÏ°Ô µÇ´Â Áß¿äÇÑ ½Ã½ºÅÛÄݵéÀ» °£´ÜÈ÷ ¼³¸íÇϵµ·Ï ÇÑ´Ù.
º¸ÅëÀº ½Ã½ºÅÛÄÝÀ» Á÷Á¢»ç¿ëÇϱ⺸´Ù´Â ¶óÀ̺귯¸® ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °æ¿ì°¡ ´õ ¸¹±â ¶§¹®ÀÌ´Ù.
¸®´ª½º ½Ã½ºÅÛÄÝ Äü ·¹ÆÛ·±½º¿Í
Linux Assembler ÇÏ¿ìÅõ¹®¼¸¦ Âü°íÇϱ⠹ٶõ´Ù.
14. Appendix D. ASCII ÄÚµå Ç¥
ASCII ÄÚµå´Â ´Ü¼øÇϱä ÇÏÁö¸¸, 2byte¹®ÀÚ¸¦ Áö¿øÇÒ ¼ö ¾ø´Ù´Â ´ÜÁ¡À» °¡Áø´Ù.
±×·± ÀÌÀ¯·Î ÃÖ±Ù¿¡´Â 2byteÀÌ»óÀÇ ¹®ÀÚÀÇ Áö¿øÀÌ °¡´ÉÇÑ Unicode°¡ ±¹Á¦ Ç¥ÁØÀ¸·Î äÅõǰí
ÀÖ´Ù. À¯´ÏÄÚµå´Â ¸î°¡Áö ÀÎÄÚµù ¹æ¹ýÀÌ Àִµ¥, ±×Áß UTF-8°ú UTF-32°¡ °¡Àå ³Î¸®
¾²ÀδÙ. UTF-8Àº ASCII¿Í ÇÏÀ§ ȣȯÀÌ µÈ´Ù. UTF-32´Â 4¹ÙÀÌÆ®¸¦ ÀÌ¿ëÇØ¼ ÇϳªÀÇ ¹®ÀÚ¸¦
¸¸µç´Ù.
Unicode¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº Unicode.html¹®¼¸¦ Âü°íÇϱ⠹ٶõ´Ù.
|
|