ProgrammingGroundUp 1ÆäÀÌÁö
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Programming from the Ground Up

Programming from the Ground Up

Jonathan Bartlett

À±»ó¹è

www.joinc.co.kr

yundream@gmail.com

고친 과정
고침 0.82004³â 2¿ù 09ÀÏ 19½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º

차례
1. ¼Ò°³
1.1. ÇÁ·Î±×·¡¹ÖÀÇ ¼¼°è·Î
1.2. »ç¿ëÇÏ´Â µµ±¸
2. ÄÄÇ»ÅÍ ±¸Á¶
2.1. ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸® ±¸Á¶
2.2. CPU
2.3. ¸î °¡Áö ¿ë¾îµé
2.4. interpreting Memory
2.5. µ¥ÀÌÅÍ Á¢±Ù ¹æ¹ý
3. ù¹øÂ° ÇÁ·Î±×·¥ ¸¸µé±â
3.1. Entering in the Program
3.2. ¾î¼Àºí¸® ÇÁ·Î±×·¥ÀÇ °³¿ä
3.3. Planning the Program
3.4. ÃÖ´ë ¼ýÀÚ Ã£±â
3.5. Addressing mode
4. ÇÔ¼ö¿¡ ´ëÇØ¼­ ´Ù·ç±â
4.1. º¹ÀâÇÑ ÇÁ·Î±×·¥ ´Ù·ç±â
4.2. ÇÔ¼ö ¸¸µé±â
4.3. C calling conventionÀ» ÀÌ¿ëÇÑ ¾î¼Àºí¸®¾î ÇÔ¼ö¼³¸í
4.4. ÇÔ¼ö ¿¹Á¦
4.5. Àç±Í ÇÔ¼ö
5. ÆÄÀÏ ´Ù·ç±â
5.1. À¯´Ð½º ÆÄÀÏ ¼Ò°³
5.2. ¹öÆÛ¿Í .bss
5.3. Ç¥ÁØÆÄÀϰú Ư¼ö ÆÄÀϵé
5.4. ÇÁ·Î±×·¥¿¡¼­ ÆÄÀÏÀÇ ÀÌ¿ë
5.5. º¹½À
6. ·¹ÄÚµå ´ÜÀ§ÀÇ Àбâ¿Í ¾²±â
6.1. ·¹ÄÚµå ¾²±â
6.2. ·¹ÄÚµå Àбâ
6.3. ·¹ÄÚµå ¼öÁ¤
6.4. ¸¶Ä¡¸ç
6.4.1. º¹½À
6.4.2. ¿¬½À¹®Á¦
7. °ß°íÇÑ ÇÁ·Î±×·¥ ÀÛ¼ºÇϱâ
7.1. ¿Ö ½Ã°£ÀÌ Áö¿¬µÇ´Â°¡ ?
7.2. °ß°íÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â À§ÇÑ ¸î°¡Áö ÆÁ
7.2.1. »ç¿ëÀÚ Å×½ºÆ®
7.2.2. µ¥ÀÌÅÍ Å×½ºÆ®
7.2.3. ¸ðµâ Å×½ºÆ®
7.3. ¿¡·¯ Çڵ鸵ÀÇ ±âº»
7.3.1. ¸ðµç °ÍÀº ¿¡·¯Äڵ带 °¡Áø´Ù.
7.4. °ß°íÇÑ ÇÁ·Î±×·¥À¸·Î ¸¸µé±â
8. ¶óÀ̺귯¸®¸¦ ÅëÇÑ ÇÔ¼ö °øÀ¯
8.1. °øÀ¯ ¶óÀ̺귯¸®ÀÇ ÀÌ¿ë
9. ¸Þ¸ð¸®¿¡ ´ëÇÏ¿©
9.1. ÄÄÇ»ÅÍ´Â ¸Þ¸ð¸®¸¦ ¾î¶»°Ô ¹Ù¶óº¸´Â°¡
9.2. Instruction Pointer
9.3. ¸®´ª½º ÇÁ·Î±×·¥¿¡¼­ÀÇ ¸Þ¸ð¸® ±¸Á¶
9.4. Every Memory Address is Lie
9.5. Getting More Memory
9.6. ¸Þ¸ð¸® °ü¸®
9.7. º¯¼ö¿Í »ó¼öµé
9.8. allocate_init ÇÔ¼ö
9.9. allocate ÇÔ¼ö
9.10. deallocate ÇÔ¼ö
9.11. ¼º´É ¹× ´Ù¸¥ ¸î°¡Áö ¹®Á¦µé
9.12. Allocator »ç¿ëÇϱâ
9.13. ´õ ¸¹Àº Á¤º¸µé
9.14. º¹½À
10. ÃÖÀûÈ­
10.1. ÃÖÀûÈ­°¡ ÇÊ¿äÇÑ ½ÃÁ¡
10.2. ¾îµð¸¦ ÃÖÀûÈ­ ÇÒ °ÍÀΰ¡
10.3. Áö¿ª ÃÖÀûÈ­ ¹æ¾È
10.4. Àü¿ª ÃÖÀûÈ­ ¹æ¾È
10.5. º¹½À
11. Appendix A. GUI ÇÁ·Î±×·¡¹Ö
11.1. GNOME ¶óÀ̺귯¸®
11.2. ´Ù¾çÇÑ ¾ð¾î¸¦ ÀÌ¿ëÇÑ °£´ÜÇÑ GNOME ÇÁ·Î±×·¥ ÀÛ¼º
11.3. GUI Builders
12. Appendix B. Common x86 Instructions
12.1. Data Transfer Instructions
12.2. Integer Instructions
13. Appendix C. ÁÖ¿ä ½Ã½ºÅÛ Äݵé
14. Appendix D. ASCII ÄÚµå Ç¥

ÀÌ ¹®¼­´Â ProgrammingGroundUpÀÇ ¹ø¿ª ¹®¼­´Ù. °èȹÀ¸·Î´Â ÇÏ·ç Çѽ𣾿À» ¹ø¿ª¿¡ ÅõÀÚÇÒ »ý°¢ÀÌÁö¸¸ »ý°¢Ã³·³ Àß µÉ·±Áö´Â ¸ð¸£°Ú´Ù. ´©±º°¡ Âü¿©ÇÏ´Â »ç¶÷ÀÌ ÀÖ´Ù¸é ÈξÀ ÁøÇàÀÌ »¡¶óÁú °ÍÀ̶ó°í »ý°¢µÈ´Ù.

¹ø¿ªÀº ¸Å¿ì ´À½¼ÇÏ°Ô ÀÌ·ç¾îÁú °ÍÀÌ´Ù. Áï ÇÊ¿ä¾ø´Ù°í »ý°¢ µÇ´Â ºÎºÐÀº °ú°¨È÷ »ý·«ÇÒ ¼ö ÀÖÀ¸¸ç, ºñ½ÁÇÑ ´Ù¸¥ ¸»·Ð ¹Ù²ð ¼ö ÀÖÀ¸¸ç Ãß°¡ µÉ ¼öµµ ÀÖ´Ù. ¹ø¿ª ¼ø¼­¿ª½Ã °¢ÀåÀÇ ¼ø¼­¸¦ µû¸£Áö´Â ¾ÊÀ» ¼öµµ ÀÖ´Ù(°ü½ÉÀÖ´Â ºÎºÐºÎÅÍ ¹ø¿ªÀÌ ÀÌ·ç¾îÁú °ÍÀÌ´Ù).


1. ¼Ò°³

1.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*¹é¸¸ °³ÀÇ ¿ìÆíÇÔÀ» °¡Áö°í ÀÖ´Â °ÍÀÌ´Ù. °¢°¢ÀÇ ¿µ¿ªÀº À¯ÀÏÇÏ°Ô ±¸º°µÉ ¼ö ÀÖ´Â ¹øÈ£°¡ ¸Þ°Ü Áø´Ù.

그림 1. ¸Þ¸ð¸® ¿µ¿ªÀº ¿ìÆíÇÔ°ú ºñ½ÁÇÏ´Ù

ÄÄÇ»ÅͰ¡ À§¿Í °°Àº ¹æ¹ýÀ¸·Î ¸Þ¸ð¸®¸¦ °ü¸®ÇÏ´Â ÀÌÀ¯´Â °£´ÜÇÑ °ü¸®°¡ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù. ¸¸¾à ÄÄÇ»ÅͰ¡ µ¥ÀÌÅÍÀÇ Å©±â¿¡ µû¸¥ °¡º¯Å©±âÀÇ ´Ù¾çÇÑ Å©±âÀÇ ¸Þ¸ð¸® ¿µ¿ªÀÇ Á¶ÇÕÀ» °ü¸®ÇØ¾ß ÇÑ´Ù¸é ÀÌµé ¸Þ¸ð¸®¿µ¿ªÀ» ´Ù·ç±â°¡ ¸Å¿ì ¾î·Á¿ï °ÍÀÌ´Ù.

¸Þ¸ð¸®¿¡´Â ÄÄÇ»ÅÍÀÇ ¿¬»ê¿¡ ÇÊ¿äÇÑ ¸ðµç Á¤º¸°¡ ÀúÀåµÈ´Ù. Áö±Ý ´ç½ÅÀÌ »ç¿ëÇϰí ÀÖ´Â ÄÄÇ»Å͸¦ ¿¹·Î µé¾îº¸µµ·Ï ÇÏÀÚ. Áö±Ý ´ç½ÅÀÌ »ç¿ëÇÏ´Â ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸®¿¡´Â ´ÙÀ½°ú °°Àº ³»¿ëµéÀÌ ÀúÀåµÇ¾î ÀÖÀ» °ÍÀÌ´Ù.

  • Ä¿¼­ÀÇ ½ºÅ©¸°»ó¿¡¼­ÀÇ À§Ä¡

  • ½ºÅ©¸°»ó¿¡ Á¸ÀçÇÏ´Â °¢ À©µµ¿ìÀÇ À§Ä¡¿Í Å©±âµé

  • »ç¿ëÇϰí ÀÖ´Â ÆùÆ®ÀÇ Á¤º¸µé

  • °¢ À©µµ¿ì¿¡¼­ »ç¿ëÇϰí ÀÖ´Â À§Á¬µé(¹öư, ¹Ú½º, ¸Þ´º)

  • ¾ÆÀÌÄÜÀÇ ±×·¡ÇÈ Á¤º¸

  • ´ëÈ­»óÀÚ µî¿¡ Ç¥½ÃµÇ´Â ¸Þ½ÃÁöµé

  • ±âŸ

¸Þ¸ð¸®¿¡ µ¥ÀÌÅͰ¡ ÀÖ´Ù¸é µ¥ÀÌÅ͸¦ ´Ù·ç´Â ÇÁ·Î±×·¥µéµµ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¸Þ¸ð¸® µ¥ÀÌÅ͸¦ ¾²°Å³ª Àд ÀÏÀ» ÇÒ °ÍÀÌ´Ù. µ¥ÀÌÅͿʹ Á» ´Ù¸¥ Ư¼ºÀ» °¡Áö°í ÀÖÀ¸¹Ç·Î µ¥ÀÌÅÍ¿Í Á» ´Ù¸£°Ô Ãë±ÞµÉ ¼ö ÀÖÀ»°Å¶ó »ý°¢µÉ ¼ö ÀÖÁö¸¸ Æù ³ëÀ̸¸ ±¸Á¶¿¡ ÀÇÇØ À̵é ÇÁ·Î±×·¥¿ª½Ã µ¥ÀÌÅÍ¿Í µ¿ÀÏÇÏ°Ô ¸Þ¸ð¸®¿¡ ÀúÀåµÈ´Ù. Æù ³ëÀ̸¸ ±¸Á¶¸¦ µû¸£´Â ÄÄÇ»ÅÍÀÇ ÀÔÀå¿¡¼­ º¸ÀÚ¸é ÇÁ·Î±×·¥ ¿ª½Ã µ¥ÀÌÅÍÀÏ »ÓÀÌ´Ù.


2.2. CPU

¸Þ¸ð¸®¿¡ µ¥ÀÌÅͰ¡ ÀúÀåµÇ¾î ÀÖ´Ù°í´Â ÇÏÁö¸¸ À̰͸¸ °¡Áö°í´Â ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù. ´ÜÁö ºñÆ®ÀÇ ³ª¿­ »ÓÀ¸·Î µ¥ÀÌÅ͸¦ ¾µ¸ð ÀÖ´Â Á¤º¸·Î ¹Ù²Ù±â À§Çؼ­´Â µ¥ÀÌÅ͸¦ ÀоîµéÀ̰í, ¼öÁ¤Çϰí, ¿Å±â´Â µîÀÇ ÀÏÀ» ÇØ¾ß¸¸ÇÑ´Ù. ÀÌ·¯ÇÑ ÀÏÀº CPU°¡ ´ã´çÇÏ°Ô µÈ´Ù.

CPU´Â ÇѹøÀÇ ½Ã°£¿¡ ¸Þ¸ð¸®·Î ºÎÅÍ ¸í·É(instruction)À» ÀÐ¾î µéÀ̰í À̰͵éÀ» ½ÇÇàÇÑ´Ù. À̰ÍÀ» fetch-execute cycle ¶ó°í Çϴµ¥, ÀÌ ¸í·É¿¡´Â ´ÙÀ½°ú °°Àº ¿ä¼ÒµéÀÌ Æ÷ÇԵǾî ÀÖ´Ù.

  • Program Counter

  • Instruction Decoder

  • Data bus

  • General-purpose register

  • Arithmetic and logic unit

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 ÄÚµåÇ¥ÀÌ´Ù.

그림 2. 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 -o exit.o
            
as´Â ¼Ò½ºÆÄÀÏÀÎ exit.s¸¦ ¹ø¿ªÇؼ­ ±× °á°ú¸¦ exit.o¶ó´ÂÆÄÀÏ¿¡ ¾´´Ù. exit.o¿Í °°Àº ¹ø¿ªµÈ °á°ú¸¦ ´ã°í ÀÖ´Â ÆÄÀÏÀ» object file¶ó°í ºÎ¸¥´Ù. ¿ÀºêÁ§Æ® ÄÚµå´Â ±â°è¾î·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ¿ÀºêÁ§Æ® Äڵ尡 ±â°è¾î·Î ÀÌ·ç¾îÁ® ÀÖÀ¸´Ï ÀÌ ÀÚü·Î ¿ÏÀüÇÑ ÇÁ·Î±×·¥À̶ó°í »ý°¢ÇÒ ¼ö ÀÖ°ÚÁö¸¸ ±×·¸Áö´Â ¾Ê´Ù. ´ëºÎºÐÀÇ ±Ô¸ð°¡ ÀÖ´Â ÇÁ·Î±×·¥µéÀº ¿©·¯°³ÀÇ ¼Ò½ºÆÄÀÏ·Î ÀÌ·ç¾î Áö°í ÀÌµé ¼Ò½ºÆÄÀϵéÀº °¢°¢ º°°³ÀÇ ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» ¸¸µé¾î ³½´Ù. ±×·¯¹Ç·Î ÀÌ·¯ÇÑ ¿©·¯°³ÀÇ ¿ÀºêÁ§Æ® ÆÄÀϵéÀ» ÇÕÃļ­ ÇϳªÀÇ ½ÇÇàÆÄÀÏ·Î ¸¸µé¾î¾ß ÇÏ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. linker¶ó´Â ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ¸é ¿©·¯°³ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» Çϳª·Î ÇÕÃļ­ Ä¿³Î¿¡¼­ ½ÇÇà°¡´ÉÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù. ¸®´ª½º´Â ld¶ó´Â linkerÇÁ·Î±×·¥À» Á¦°øÇÑ´Ù. ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸µÅ© ½ÃÄѼ­ ¿ÏÀüÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù.
# ld exit.o -o exit
            
À§ÀÇ ¸í·ÉÀº ¿ÀºêÁ§Æ® ÆÄÀÏÀº exit.o¸¦ ¸µÅ©½ÃÄѼ­ ½ÇÇàÆÄÀÏÀÎ exit¸¦ ¸¸µé¾î ³½´Ù. ¸¸¾à À§ÀÇ ¸µÅ© °úÁ¤Áß ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é ÇÁ·Î±×·¥ÀÇ ¼Ò½ºÄڵ带 À߸ø ÀÛ¼ºÇßÀ» °æ¿ì°¡ ´ëºÎºÐÀÌ´Ù. ÀÌ·± °æ¿ì ¿©·¯ºÐÀº ¼Ò½ºÄڵ带 ÁÖÀÇ ±í°Ô »ìÆì¼­ ¹®Á¦°¡ µÈ ºÎºÐÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¼Ò½ºÄڵ忡 ´ëÇÑ ¼öÁ¤ÀÌ ÀÌ·ç¾î Á³´Ù¸é ´Ù½Ã assemble °ú link°úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù. ¾Æ¹«·± ¹®Á¦°¡ ¾øÀÌ ¸µÅ©±îÁö ¼º°øÇß´Ù¸é ´ÙÀ½°ú °°ÀÌ exit [1] ÇÁ·Î±×·¥À» ½ÇÇà ½Ãų ¼ö ÀÖ´Ù.
# ./exit
            
./´Â ÄÄÇ»ÅÍ¿¡°Ô ½ÇÇà½ÃÄÑ¾ß ÇÏ´Â ÇÁ·Î±×·¥ÀÌ ÀϹÝÀûÀÎ ÇÁ·Î±×·¥ ½ÇÇà °æ·Î(PATH)°¡ ¾Æ´Ñ ÇöÀç µð·ºÅ丮¿¡ ÀÖÀ½À» ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù. À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà ½ÃÄѺ¸¸é ¾Æ¹«·± º¯È­µµ ¾øÀÌ ´ÙÀ½ ÇÁ·ÒÇÁÆ®°¡ ¶³¾îÁö´Â °É È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÁ·Î±×·¥Àº ÇÏ´ÂÀÏÀÌ ¾Æ¹« °Íµµ ¾ø´Â °Í °°Áö¸¸ ³»ºÎÀûÀ¸·Î Á¾·áÇϸ鼭 Á¾·á°ªÀ» Ä¿³Î¿¡ µÇµ¹·Á Áִµ¥, ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î exit ÇÁ·Î±×·¥ÀÇ Á¾·á°ªÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
# echo $?
            
¾Æ¸¶µµ 0ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù. À̰ÍÀº ¿ì¸®°¡ ¸¸µç exitÇÁ·Î±×·¥ »Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥¿¡ °øÅëÀûÀ¸·Î Àû¿ëµÈ´Ù. ¸ðµç ÇÁ·Î±×·¥Àº Á¤»óÀûÀ¸·Î ÁÖ¾îÁø ÀÏÀ» ÇØ°áÇϰí Á¾·á ÇßÀ» ¶§´Â 0À» ¸®ÅÏÇÏ°í ½ÇÆÐÇßÀ» °æ¿ì 0ÀÌ¿ÜÀÇ ´Ù¸¥ ¼ýÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥ Á¾·á°ªÀ» ÀÌ¿ëÇØ¼­ ÇÁ·Î±×·¡¸Ó´Â ½ÇÇà½ÃÄ×´ø ÇÁ·Î±×·¥ÀÌ ÀÏÀ» Á¦´ë·Î ¼öÇàÇß´ÂÁö ¾Æ´Ï¸é ¾î¶² ¿À·ù°¡ ¹ß»ýÇß´Â Áö¸¦ È®ÀÎÇÒ ¼ö ÀְԵȴÙ. 0Àº Á¤»óÁ¾·á, 1Àº ÆÄÀÏ¿­±â ½ÇÆÐ, 2´Â À߸øµÈ °è»ê µîÀ¸·Î Á¤ÀÇÇØ¼­ °¢ »óȲ¿¡ ¸Â°Ô Á¾·á°ªÀ» ³Ñ±â°í Á¾·áÇÏ¸é µÈ´Ù.


3.2. ¾î¼Àºí¸® ÇÁ·Î±×·¥ÀÇ °³¿ä

exit.s¸¦ º¸¸é ¸¹Àº ÁÙÀÌ #ó¸® µÇ¾î ÀÖ´Â°É º¼ ¼ö ÀÖ´Ù. À̰ÍÀº ÁÖ¼®À̶ó°í ºÒ¸®¿î´Ù. ÁÖ¼®Àº ¾î¼Àºí·¯¿¡ ÀÇÇØ¼­ ÇØ¼® µÇÁö ¾Ê´Â ºÎºÐÀ¸·Î ÁÖ·Î ÇÁ·Î±×·¡¸Ó¿¡°Ô ÇÁ·Î±×·¥ Äڵ忡 ´ëÇÑ ¼³¸í, ÈùÆ®µîÀ» ¸í½ÃÇØ¼­ ÇÁ·Î±×·¡¸Ó°¡ Á»´õ ½±°Ô Äڵ带 ÆÄ¾ÇÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù. Àß ÀÛ¼ºµÈ ÁÖ¼®Àº ÇÁ·Î±×·¥À» ¸¸µé¾î³½ ´ç»çÀÚ »Ó¸¸ ¾Æ´Ï¶ó ÇÁ·Î±×·¥À» Àоî¾ß ÇÏ´Â ´Ù¸¥ (ÆÀµ¿·áµî°ú °°Àº)ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸¹Àº µµ¿òÀ» ÁØ´Ù. Àß ÀÛ¼ºµÈ ÁÖ¼®Àº ´ÙÀ½°ú °°Àº ¿ä¼ÒµéÀ» °¡Áø´Ù.

  • Äڵ尡 ÇÏ´ÂÀÏ

  • ÄÚµåÀÇ ´ë·«ÀûÀÎ È帧

  • ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÒ¸¸ÇÑ ¿©·¯°¡Áö ƯÀÌ»çÇ×µé [2]

¸î °³ÀÇ ÁÖ¼®ÈÄ¿¡ ´ÙÀ½°ú °°Àº ÁÙÀÌ µîÀåÇÑ´Ù.

.section .data
            

.section .text
            
ÅØ½ºÆ® ¼½¼ÇÀÌ ½ÃÀÛÇÔÀ» ¾Ë¸°´Ù. ÅØ½ºÆ® ¼½¼Ç¿¡´Â ÇÁ·Î±×·¥ ¸í·É (¾î¼Àºí¸® Äڵ尡 À§Ä¡ÇÑ´Ù)

.globl _start
            

_start:

ÀÌÁ¦ ½ÇÁ¦ÀûÀΠĿǻÅÍ ¸í·ÉÀÌ µîÀåÇÑ´Ù. óÀ½ µîÀåÇÑ ¸í·ÉÀº ´ÙÀ½°ú °°´Ù.

movl $1, %eax
            
ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ¾úÀ» ¶§ À̸í·ÉÀº ¼ýÀÚ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 ·¹Áö½ÃÆ®·² °¡ÁöÀÖ´Ù.

  • %eax

  • %ebx

  • %ecx

  • %edi

  • %esi

À̵é gerneal-purpose ·¹Áö½ºÅÍ¿Í ÇÔ²² ¸î°³ÀÇ special-purpose ·¹Áö½ºÅ͵µ °¡Áö°í ÀÖ´Ù.

  • %ebp

  • %esp

  • %eip

ÀÌµé ·¹Áö½ºÅÍÁß¿¡´Â %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À» ¿Ã¸®±â À§Çؼ­´Â ´ÙÀ½°ú °°Àº Äڵ尡 ÇÊ¿äÇÏ´Ù.

movl %0, %ebx
            
¸®´ª½º´Â ½Ã½ºÅÛÄÝÀ» ¸¸µé±â Àü¿¡ ÀÎÀÚÀÇ °ªÀ» Àбâ À§Çؼ­ ·¹Áö½ºÅÍÀÇ °ªÀ» ¿ä±¸ÇÑ´Ù. %eax´Â ¾ðÁ¦³ª ½Ã½ºÅÛÄÝ ¹øÈ£¸¦ ¿Ã¸®±â À§Çؼ­ »ç¿ëµÇ¸ç ÀÎÀÚ¸¦ ¿Ã¸®±â À§Çؼ­ ´Ù¸¥ ·¹Áö½ºÅ͵éÀ» »ç¿ëÇÏ°Ô µÈ´Ù. exit ½Ã½ºÅÛÄÝ¿¡¼­ º¸¸é Á¾·á »óŸ¦ ÀúÀåÇϱâ À§Çؼ­ %ebx¸¦ ÇÊ¿ä·Î ÇÔÀ» ¾Ë ¼ö ÀÖ´Ù. °¢°¢ÀÇ ½Ã½ºÅÛÄÝÀÌ ÇÊ¿ä·Î ÇÏ´Â ÀÎÀÚÀÇ °¹¼ö°¡ ¼­·Î ´Ù¸£´Ù. À̵鿡 ´ëÇÑ Á¤º¸´Â Appendix C¸¦ Âü°íÇϱ⠹ٶõ´Ù.

´ÙÀ½À¸·Î ¾Æ·¡¿Í °°Àº »ó´çÈ÷ ¼ö»óÇÑ ¸í·ÉÀÌ ³»·ÁÁø´Ù.

int $0x80
            
int ´Â C¿¡¼­ Á¤¼öÇüÀ» ³ªÅ¸³»´Â int°¡ ¾Æ´Ï´Ù. interruptÀÇ ÁÙÀÓ¸»ÀÌ´Ï È¥µ¿ÇÏÁö ¾Êµµ·Ï ÇÏÀÚ. 0x80Àº »ç¿ëÇÒ ÀÎÅÍ·´Æ®ÀÇ ¹øÈ£´Ù. ÇÁ·Î±×·¥ÀÇ ¼öÇàÁß interrupt°¡ °É¸®°Ô µÇ¸é ÇÁ·Î±×·¥ÀÇ Á¦¾î°¡ Ä¿³Î·Î ³Ñ¾î°¡°Ô µÇ°í Ä¿³ÎÀº ÇÁ·Î±×·¥ÀÌ ¿äûÇÑ ½Ã½ºÅÛÄÝÀ» ¼öÇàÇÏ°Ô µÈ´Ù. À̰ÍÀº ¹èÆ®¸Ç¿¡°Ô ±¸Á¶¿äûÀ» Çϱâ À§Çؼ­ ½ÅÈ£¸¦ º¸³»´Â °úÁ¤°ú °°´Ù. ¿©·¯ºÐÀº Çʿ信 ÀÇÇØ¼­ ¹èÆ®¸Ç¿¡°Ô ½ÅÈ£¸¦ º¸³»°í ¹èÆ®¸ÇÀº ¿©·¯ºÐÀ» ±¸Á¶ÇÏ·¯ ¿Â´Ù. ±¸Á¶°¡ µÈÈÄ¿¡´Â ? ¹°·Ð ÀÏ»ó»ýȰ·Î µÇµ¹¾Æ °¡°Ô µÉ°ÍÀÌ´Ù. ¸¶Âù°¡Áö·Î Ä¿³ÎÀÌ ÇÊ¿äÇÑ ÀÏÀ» ¸¶Ä¡°Ô µÇ¸é Á¦¾î±ÇÀº ÇÁ·Î±×·¥À¸·Î ´Ù½Ã ³Ñ¾î °¡°Ô µÈ´Ù. ¸¸¾à interrupt ½ÅÈ£¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é ¾î¶°ÇÑ ½Ã½ºÅÛ Äݵµ ¼öÇàµÇÁö ¾ÊÀ» °ÍÀÌ´Ù.

ÀÌÁ¦ ³²Àº ÀÏÀº Äڵ带 assemble½Ã۰í, ¸µÅ© ½ÃŰ°í ½ÇÇàÇÏ´Â ÀÏÀÌ´Ù. Å×½ºÆ®¸¦ À§Çؼ­ ¾î¼Àºí¸® ÄÚµåÀÇ %ebx¸¦ ´Ù¸¥ °ªÀ¸·Î ¹Ù²ÛÈÄ echo $?ÀÇ Ãâ·Â°ªÀÌ º¯ÇÏ´Â°É È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù. ´ç¿¬ÇÏÁö¸¸ %ebx°ªÀ» º¯°æÇÑ´ÙÀ½¿¡´Â assemble->¸µÅ©->½ÇÇà °úÁ¤À» °ÅÃÄ¾ß º¯°æµÈ ³»¿ëÀÌ Àû¿ëµÈ´Ù.


3.3. Planning the Program

À̹ø ÇÁ·Î±×·¥Àº Á»´õ º¹ÀâÇÑ ÀÏÀ» ÇϰԵȴÙ. ¿©·¯°³ÀÇ ¼ýÀÚ°¡ ÁÖ¾îÁö°í ÀÌÁß °¡Àå Å« ¼ýÀÚ¸¦ ã´Â ÀÏÀ» ÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ÄÄÇ»ÅÍ´Â ÇÁ·Î±×·¡¸Ó°¡ ÇÊ¿äÇÑ ¸ðµç°ÍÀ» ¼¼¹ÐÇÏ°Ô ÁöÁ¤ÇØÁà¾ß ÇÏ´Â ±â°è´Ù. ±×·¯¹Ç·Î ¿øÇϴµ¥·Î ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇϱ⠿øÇÏ´Ù¸é ÀÛ¼ºÀü¿¡ ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¸í¼¼¼­¸¦ ¸¸µé¾î ÁÖ¾î¾ß ÇÑ´Ù. ¿ì¸®°¡ ¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº ¸í¼¼¿¡ ´ëÇÑ Á¤Àǰ¡ ÀÖ¾î¾ß ÇÒ °ÍÀÌ´Ù.

  1. ¼ýÀÚÀÇ ¸ñ·ÏÀ» ¾îµð¿¡ ÀúÀåÇÒ °ÍÀΰ¡.

  2. °¡Àå Å« ¼ýÀÚ¸¦ ã±â À§Çؼ­ ¾î¶°ÇÑ ÇÁ·Î½ÃÁ®¸¦ ÇÊ¿ä·Î Çϴ°¡.

  3. ÇÁ·Î½ÃÁ®¸¦ ¼öÇàÇϱâ À§Çؼ­ ¾î´ÀÁ¤µµÀÇ °ø°£À» ÇÊ¿ä·Î Çϴ°¡

  4. °ø°£Àº ·¹Áö½ºÅÍ¿¡¼­ È®º¸ÇÒ °ÍÀΰ¡ ¾Æ´Ï¸é ¸Þ¸ð¸®¸¦ ÀÌ¿ëÇÒ °ÍÀΰ¡.

¿©·¯ºÐÀº ¸î°³ÀÇ ¼ýÀÚ Áß¿¡¼­ °¡Àå Å« ¼ýÀÚ¸¦ ã´Â ÀÏÀ» Çϱâ À§Çؼ­ ¾î¶² °èȹÀ» ¼¼¿î´Ù°Å³ª ÇÏÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ·± ÀÏÀº ±×³É ´ÚÄ¡¸é Çѹø¿¡ ¾²À¹ º¸°í °¡Àå Å« ¼ýÀÚ¸¦ °ñ¶ó ³¾ °ÍÀÌ´Ù. ¹°·Ð ¼ýÀÚÀÇ ¸ñ·ÏÀÌ ¸¹´Ù¸é ¾à°£ÀÇ °èȹÀ» ¼¼¿ö¾ß ÇϰÚÁö¸¸ Å« ¹®Á¦°¡ µÇÁö´Â ¾ÊÀ» °ÍÀÌ´Ù - ½Ã°£ÀÌ Á» °É¸®±ä ÇϰÚÁö¸¸ -. ¿ì¸®ÀÇ µÎ³ú°¡ °æÇè°ú ÇнÀ¿¡ ÀÇÇØ¼­ °ÅÀÇ ¹Ý»çÀûÀ¸·Î ±×·¯ÇÑ ÀÏÀ» ó¸®Çϱ⠶§¹®ÀÌ´Ù. ¿©·¯°³ÀÇ ¼ýÀÚ ¸ñ·ÏÁß¿¡ °¡Àå Å« ¼ýÀÚ¸¦ ã¾Æ¾ß ÇÑ´Ù¸é, ºÐ¸í ¿©·¯ºÐÀº ¾Õ¿¡¼­ ¼ýÀÚ¸¦ ÀÐ¾î °¡¸é¼­ ¾ÕÀÇ ¼ýÀÚ º¸´Ù ´õ Å©´Ù¸é ±×°ÍÀ» ¸Ó¸®¿¡ »õ°Ü µÎ°í, ¸Ó¸®¿¡ »õ°ÜµÐ ¼ýÀÚ º¸´Ù ´õ Å« ¼ýÀÚ°¡ ³ª¿Â´Ù¸é ¼ýÀÚ¸¦ ¹Ù²ãÄ¡±â ÇÒ °ÍÀÌ´Ù. °á±¹ ¸¶Áö¸· ¼ýÀÚ±îÁö ¸ðµÎ È®ÀÎÇÑ´Ù¸é ¸Ó¸®¿¡ ³²¾Æ ÀÖ´Â ¼ö°¡ °¡Àå Å« ¼ö°¡ µÈ´Ù. ÀÌ·¯ÇÑ °úÁ¤Àº °ÅÀÇ ÀÚµ¿À¸·Î ÀÌ·ç¾îÁø´Ù.

ÄÄÇ»ÅÍÀÇ °æ¿ì ÀÌ·¯ÇÑ °úÁ¤À» ´Ü°èº°·Î ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ´Ü°è¸¦ ¸íÈ®È÷ Á¤ÀÇ Çϱâ À§Çؼ­ ¾à°£ÀÇ °èȹÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ¿ì¼± °¡Àå Å« ¼ýÀÚ¸¦ °í¸£±â À§Çؼ­ »ç¿ëµÉ ¼ýÀÚÀÇ ¸ñ·ÏÀÌ ÀÖÀ» °ÍÀ̸ç ÀÌµé ¼ýÀÚÀÇ ¸ñ·ÏÀº ¸Þ¸ð¸® °ø°£¿¡ ÀúÀåµÇ¾î¾ß ÇÒ °ÍÀÌ´Ù. À̵éÀº data_items°¡ °¡¸®Å°´Â ¸Þ¸ð¸®¿¡ ÀúÀåÇϵµ·Ï °èȹÇϰڴÙ. ¿ì¸®´Â ¶ÇÇÑ ¼ýÀÚ¸ñ·Ï¿¡¼­ ÇöÀç À§Ä¡¸¦ ÀÐ¾î ¿Ã ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¾ß °ËÅäÇØ¾ßÇÒ ¼ýÀÚ¸¦ ÀÐ¾î ¿Ã ¼ö Àֱ⠶§¹®ÀÌ´Ù. ±×¸®°í °¡ÀåÅ« ¼ýÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£µµ ¸¶·ÃµÇ¾î¾ß ÇÑ´Ù. ÀÌµé ¼ýÀÚ Á¤º¸¸¦ ÀúÀåÇϱâ À§Çؼ­ ´ÙÀ½°ú °°Àº ·¹Áö½ºÅ͸¦ »ç¿ëÇϵµ·Ï °èȹÇß´Ù.

  • %edi ´Â ¸ñ·Ï¿¡¼­ ÇöÀçÀÇ À§Ä¡¸¦ ÀúÀåÇÑ´Ù.

  • %ebx ´Â ÇöÀç ¸ñ·Ï¿¡¼­ °¡Àå Å« ¼ýÀÚ¸¦ ÀúÀåÇÑ´Ù.

  • %eax ´Â °ËÅäÇÒ ¼ýÀÚ¸¦ ÀúÀåÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.

ÇÑ °¡Áö ¿¹¿ÜÀûÀ¸·Î ó¸®ÇؾßÇÒ ¼ýÀÚ°¡ Àִµ¥, ¹Ù·Î ¸ñ·ÏÀÇ °¡Àå óÀ½ °¡Á®¿Â ¼ýÀÚÀÌ´Ù. ÀÌ ¼ýÀÚ´Â ´Ù¸¥ ¾î¶² ¼ýÀڿ͵µ ºñ±³ÇÒ ¼ö ¾øÀ¸¹Ç·Î ÀÚµ¿ÀûÀ¸·Î °¡Àå Å« ¼ýÀÚ°¡ µÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¼Õ½¬¿î ¼öÇàÀ» À§Çؼ­ ÇöÀç À§Ä¡°¡ °¡¸®Å°´Â ¼ýÀÚ¸¦ 0À¸·Î ÇÏ¸é µÈ´Ù. ±×·¯¸é ¸ñ·ÏÀÇ Ã³À½ ¼ýÀÚ´Â 0°ú ºñ±³µÇ°í ÇöÀç ½ÃÁ¡¿¡¼­ °¡Àå Å« ¼ýÀÚ·Î %ebx¿¡ ÀúÀåµÉ °ÍÀÌ´Ù. ±× ´ÙÀ½¿¡´Â ¸ñ·ÏÀÇ ´ÙÀ½ ¼ýÀÚ¿Í ¹è±³ÇÏ¸é µÈ´Ù. ÀÌ·¯ÇÑ °úÁ¤À» ¼ø¼­´ë·Î ±â¼úÇØ º¸µµ·Ï ÇÏÀÚ.

  1. ¸ñ·ÏÀÇ Ã³À½ ¼ýÀÚ°¡ 0ÀÎÁö È®ÀÎÇÑ´Ù.

  2. ¸¸¾à 0À̶ó¸é Á¾·á(exit)ÇÑ´Ù.

  3. ÇöÀç À§Ä¡¸¦ 1Áõ°¡ ½ÃŲ´Ù(%edi)

  4. ´ÙÀ½ °ªÀ» ÀÐ¾î ¿Í¼­ %eax ·¹Áö½ºÅÍ¿¡ °ªÀ» ÀúÀåÇÑ´Ù.

  5. ÇöÀç °ª %eax¿Í °¡Àå Å« °ª %ebx¸¦ ºñ±³ÇÑ´Ù.

  6. ¸¸¾à ÇöÀç °ªÀÌ ÃÖ±ÙÀÇ °¡Àå Å« °ª º¸´Ù Å©´Ù¸é ÇöÀç °ªÀ» %ebx¿¡ ÀúÀåÇÑ´Ù.

  7. ¹Ýº¹ÇÑ´Ù.

À̰ÍÀ» ÇÁ·Î½ÃÁ®(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
            
½ÇÇà ÈÄ °á°ú¸¦ È®ÀÎÇØº¸µµ·Ï ÇÏÀÚ.
# ./maximum
# echo $?
            
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
            

ÀÌ °É·Î ÇØ¼­ ¿ì¸®°¡ »ç¿ëÇÒ ¸ðµç µ¥ÀÌÅÍÀÇ Áغñ¸¦ ¸¶ÃÆÀ¸´Ï, ÀÌÁ¦ º»°ÝÀûÀ¸·Î µ¥ÀÌÅ͸¦ ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷(°¡Àå Å« ¼ýÀÚ¸¦ °¡·Á³»´Â)À» ÇØ¾ß ÇÑ´Ù. À§ Äڵ带 º¸¸é # º¯¼öµé¶ó°í µÇ¾î ÀÖ´Â ÁÖ¼®À» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌµé º¯¼ö´Â ÀÛ¾÷À» À§Çؼ­ »ç¿ëµÇ´Â µ¥ÀÌÅ͵éÀ» ÀúÀåÇϱâ À§ÇÑ ¿ë±â·Î »ç¿ëÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº º¯¼öµéÀÌ »ç¿ëµÈ´Ù.

  1. ÃÖ±ÙÀÇ ÃÖ´ë°ªÀ» ÀúÀåÇϱâ À§ÇÑ º¯¼ö

  2. ¼ýÀÚ ¸ñ·Ï¿¡¼­ °¡Á®¿Í¾ßÇÒ ¼ýÀÚÀÇ À§Ä¡¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö

  3. ¼ýÀÚ ¸ñ·Ï¿¡¼­ °¡Á®¿Â ¼ýÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö

¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥Àº ¸Å¿ì °£´ÜÇϹǷΠ´ÜÁö ¸î°³ÀÇ º¯¼ö¸¸ ÇÏ¿ëÇÏ¸é µÇ¸ç, ·¹Áö½ºÅ͸®¸¸À¸·Î ÀÌµé º¯¼ö¸¦ ´ã¾Æ³¾ ¼ö ÀÖ´Ù. ±×·¯³ª ÇÁ·Î±×·¥ÀÌ Ä¿Áö°í °Å±â¿¡ µû¶ó¼­ ´Ù·ç¾î¾ßÇÏ´Â µ¥ÀÌÅ;çÀÌ Ä¿Áú °æ¿ì ·¹Áö½ºÅ͸¸À¸·Î ¸ðµç ÀÛ¾÷À» ÇÒ ¼ö ¾ø°Ô µÈ´Ù. ¿©±â¿¡ ´ëÇØ¼­´Â ³ªÁß¿¡ ´Ù·ç°Ô µÉ°ÍÀÌ´Ù.

ÀÌ ÇÁ·Î±×·¥¿¡¼­ °¡Àå Å« ¼ýÀÚ¸¦ ÀúÀåÇϱâ À§Çؼ­ %ebx¸¦ »ç¿ëÇß´Ù. %edi´Â ÇöÀç °¡Á®¿Í¾ßÇÒ ¼ýÀÚÀÇ À§Ä¡(index)¸¦ ÀúÀåÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. %edi¸¦ ÀÌ¿ëÇØ¼­ ¿ì¸®´Â data_items·Î ºÎÅÍ ¸î ¹øÂ° ¼ýÀÚ¸¦ Àоî¿Í¾ß ÇÒÁö¸¦ °áÁ¤ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ÇÁ·Î±×·¥ÀÌ ¸· ½ÃÀÛÇßÀ» ¶§´Â data_itemsÀÇ Ã¹¹øÂ° ¼ýÀÚ¸¦ °¡Á®¿Í¾ß µÇ¹Ç·Î %edi´Â 0ÀÌ ÀԷµȴÙ. ù¹øÂ° ¼ýÀÚ¸¦ °¡Á®¿Ô´Ù¸é %edi¿¡´Â 1ÀÌ µé¾î°¡°í, ´ÙÀ½ ¼ýÀÚ¸¦ °¡Á®¿Ã ¶§´Â data_itemsÀÇ µÎ¹øÂ° ¼ýÀÚ¸¦ °¡Á®¿À°Ô µÈ´Ù.

movl  $0, $edi
            
%edi´Â µ¥ÀÌÅÍ ¸ñ·ÏÀÇ ¸î¹øÂ° µ¥ÀÌÅ͸¦ °¡Á®¿Í¾ß ÇÏ´ÂÁö¸¸À» ¾Ë·ÁÁÖ´Â À妽º ÀÌ´Ù. ¿ì¸®´Â ÀÌ À妽º °ªÀ» ÀÌ¿ëÇØ¼­ data_items·Î ºÎÅÍ °ªÀ» °¡Á®¿Í¾ß Çϴµ¥ ´ÙÀ½°ú °°Àº °°´ÜÇÑ ¿¬»êÀÌ »ç¿ëµÈ´Ù.
movl data_items(,%edi,4), %eax
            
´ÙÀ½Àº ¸ñ·ÏÀ¸·Î ºÎÅÍ ¼ýÀÚ¸¦ °¡Á®¿À°í ÃÖ°í°ªÀ» ÀúÀåÇÏ´Â ·çƾÀÌ´Ù.

  1. data_items´Â ¿ì¸®°¡ °è»ê¿¡ »ç¿ëÇÒ ¼ýÀÚ ¸ñ·ÏÀÇ Ã¹¹øÂ° ¼ýÀÚ¸¦ °¡¸£Å²´Ù.

  2. ¼ýÀÚ¸ñ·ÏÀÇ ¼ýÀÚµéÀº .long ÇüÀ̹ǷΠ4byteÀÇ Å©±â¸¦ Â÷ÁöÇÑ´Ù.

  3. °¢ ¼ýÀÚ°¡ Â÷ÁöÇÏ´Â °ø°£ÀÌ 4byteÀÎ °ÍÀ» ÀÌ¿ëÇØ¼­ ´ÙÀ½ ¼ýÀÚ¸¦ °¡Á®¿Ã ¼ö ÀÖ´Ù.

  4. ¿ì¸®´Â Áö±Ý ¼ýÀÚ¿Í ´ÙÀ½ ¼ýÀÚ¸¦ ºñ±³Çؼ­ ÃÖ°í Å« ¼ýÀÚ¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.

  5. °¡Àå Å« ¼ýÀÚ´Â ¿ì¸®°¡ ÁغñÇÑ ·¹Áö½ºÅÍ¿¡ º¹»çÇÑ´Ù.

  6. ´Ù½Ã óÀ½À¸·Î µÇµ¹¾Æ °£´Ù.

À§ÀÇ ·çƾÀ» º¸¸é óÀ½À¸·Î µÇµ¹¾Æ °£´Ù°í µÇ¾î ÀÖ´Ù. óÀ½À̶ó ÇÔÀº ·çÇÁÀÇ Ã³À½ÀÎ 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¹øÀ̹ǷΠ´ÙÀ½°ú °°Àº Äڵ尡 ÇÊ¿äÇÏ´Ù.
movl $1, %eax
int  0x80 
            

À̰ÍÀ¸·Î ¿ì¸®°¡ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¸ðµç ¼³¸íÀ» ¸¶ÃÆ´Ù. ¸Å¿ì °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ¿´Áö¸¸ »ó´çÈ÷ ¸¹Àº °ÍÀ» ¹è¿ï¼ö ÀÖ¾ú´Ù. °£´ÜÇÑ ÇÁ·Î±×·¥ À̹ǷΠÀÌÇØ¿¡´Â Å« ¾î·Á¿òÀÌ ¾ø¾úÀ» °ÍÀÌ´Ù. ÀÌÇØ°¡ µÇÁö ¾Ê´Â ºÎºÐÀÌ ÀÖ´Ù¸é ÁÖ¼®°ú ÇÔ²² ÇÁ·Î±×·¥À» ÁÖÀÇ ±í°Ô ÀÐ¾î º¸±â ¹Ù¶õ´Ù. Á»´õ ¿Ïº®ÇÏ°Ô ÀÌÇØÇÏ°í ½Í´Ù¸é ÇÁ·Î±×·¥ÀÇ °¢ ½ºÅܺ°·Î ·¹Áö½ºÅÍÀÇ °ªÀÇ º¯È­¸¦ ±â·ÏÇØ°¡¸é¼­ Äڵ带 È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù.


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 ¸¸ »ç¿ëÇÑ´Ù. ´ÙÀ½Àº »ç¿ë¿¹ÀÌ´Ù.

movl ADDRESS, %eax
                    
%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·Î º¹»çÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.

movl (%eax), %ebx
                        

base-pointer addressing mode

·¹Áö½ºÅÍÁÖ¼Ò °ª¿¡ »ó¼ö°ªÀ» ´õÇÑ´Ù´Â °ÍÀ» Á¦¿ÜÇϰí´Â °£Á¢ÁÖ¼Ò ÁöÁ¤¹æ½Ä°ú ¸Å¿ì ºñ½ÁÇÑ ¹æ½ÄÀÌ´Ù. ¿¹¸¦ µé¾î ´ç½ÅÀÌ ¾î¶² ·¹ÄÚµå·Î ºÎÅÍ 4¹ÙÀÌÆ®ÀÇ

immediate mode

Immediate mode´Â ¸Å¿ì °£´ÙÇÏ´Ù. ¿øÇÏ´Â °ªÀ» ·¹Áö½ºÅͳª ¸Þ¸ð¸® ¿µ¿ªÀ¸·Î Á÷Á¢ ÀúÀåÇÏ´Â ¹æ½ÄÀÌ´Ù. ¿¹¸¦ µé¾î %eax¿¡ 12¶ó´Â °ªÀ» ÀúÀåÇϱ⠿øÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ Immediate mode¸¦ ÀÌ¿ëÇØ¼­ °£´ÜÇÏ°Ô Ã³¸®ÇÒ ¼ö ÀÖ´Ù.

movl $12,  %eax
                        
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ÀÇ Ã³À½ ¹ÙÀÌÆ®¸¦ °¡¸®Å²´Ù.

그림 3. %eax ·¹Áö½ºÅÍÀÇ ¸ð½À


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¿¡´Â ½ºÅÃÀÇ À§¿¡ ÀÖ´Â °ªÀÌ ¾Æ´Ñ ½ºÅÃÀÇ À§ÀÇ À§Ä¡ÁÖ¼Ò°¡ ÀúÀåµÈ´Ù. ¸¸¾à ÁÖ¼Ò¿¡ ÀúÀåµÈ °ªÀ» °¡Á®¿À±æ ¿øÇÑ´Ù¸é ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù.
movl 4(%esp), %eax
            
À§ÀÇ ¿¹Á¦¸¦ º¸¸é base pointer ÁÖ¼Ò¸ðµå¸¦ ÀÌ¿ëÇØ¼­ °¡Á®¿À°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. %esp¿¡¼­ 4¸¸Å­ À̵¿ÇÑ À§Ä¡¿¡ ÀúÀåµÈ °ªÀ» %eax¿¡ º¹»çÇÑ´Ù.

C¾ð¾îÀÇ calling convention¿¡¼­ ½ºÅÃÀº ÇÔ¼öÀÇ ·ÎÄú¯¼ö, ÀÎÀÚ, ¸®ÅÏÁÖ¼ÒµéÀ» ±¸ÇöÇϴµ¥ Áß¿äÇÏ°Ô »ç¿ëµÈ´Ù.

subl  $8, %esp
            
À§ÀÇ ¸í·ÉÀº %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´Â Ãâ·Â(¸®ÅÏ)À» À§Çؼ­ »ç¿ëµÈ´Ù.

°¡Àå ¸ÕÀú ÇØ¾ß ÇÒÀÏÀº ÇÔ¼öÀÇ À̸§À» Á¤ÇÏ´Â ÀÏÀÌ´Ù.

.type power,@function
            
À̰ÍÀº ÇÔ¼öÀÇ À̸§ powerÀ» ÇÔ¼ö¿¡ ¿¬°á ½ÃŰ´Â ÀÏÀ» ÇÑ´Ù. ¿ì¸®´Â 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¿Í °°Àº ¼ö°¡ µÈ´Ù¸é ÇÔ¼ö¸¦ ºüÁ®³ª¿À°Ô µÈ´Ù.

  • ¼ýÀÚ¸¦ Æò°¡ÇÑ´Ù.

  • ¼ýÀÚ°¡ 1Àΰ¡?

  • ±×·¸´Ù¸é ÆÑÅ丮¾ó ¿¬»êÀ» Á¾·áÇÏ°í °ªÀ» ¸®ÅÏÇÑ´Ù.

  • ±×·¸Áö ¾Ê´Ù¸é ¼ýÀÚ¸¦ 1°¨¼Ò ½ÃŰ°í ÆÑÅ丮¾ó ÇÔ¼ö¸¦ Àç È£ÃâÇÑ´Ù.

# ÆÑÅ丮¾ó ¿¬»êÀ» ÇÑ´Ù.
# ¿¹¸¦ µé¾î 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
            
ÀÌ µÎÁÙÀº ÇÔ¼ö¿¡¼­ »ç¿ëÇÒ ½ºÅÿµ¿ªÀ» »ý¼ºÇÑ´Ù. ÀÌ µÎÁÙÀº ¸ðµç ÇÔ¼öÀÇ ½ÃÀۺκп¡ Æ÷ÇԵȴÙ.
movl    8(%ebp), %eax
            
º£À̽º Æ÷ÀÎÅÍ ¾îµå·¹½º¸¦ ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ·Î À̵¿ÇÑ´ÙÀ½ À̰÷ÀÇ °ªÀ» %eax¿¡ º¸°¡ÇÑ´Ù. 4(%ebp)´Â ¸®ÅϾîµå·¹½º¸¦ °¡Áö°í ÀÖÀ¸¸ç, 8(%ebp)´Â ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ¸¦ °¡¸®Å°°í ÀÖÀ½À» ±â¾ïÇϱ⠹ٶõ´Ù.

´ÙÀ½ ¶óÀο¡¼­ ÇÔ¼öÀÇ ÀÎÀÚ°¡ base case¿¡ µµ´ÞÇß´ÂÁö °Ë»çÇÑ´Ù. ¸¸¾à base case Áï 1À̶ó¸é ÆÑÅ丮¾ó ¿¬»êÀ» ³¡³»°í end_factorial·Î Á¡ÇÁ ÇÑ´Ù.

cmpl    %1,  %eax
je      end_factorial
            
¸¸¾à base case¿¡ µµ´ÞÇÏÁö ¾Ê¾Ò´Ù¸é, ¿ì¸®´Â factorial ÇÔ¼ö¸¦ ´Ù½Ã È£Ãâ ÇØ¾ß ÇÑ´Ù. È£ÃâÇÒ ¶§´Â ÀÎÀÚ°ª(%eax)¸¦ 1¸¸Å­ °¨¼Ò ½ÃÄÑ¾ß ÇÑ´Ù.
decl    %eax
            
decl´Â ¸Þ¸ð¸® ¿µ¿ªÀ̳ª ·¹Áö½ºÅÍÀÇ °ªÀ» 1°¨¼Ò½Ã۱â À§Çؼ­ »ç¿ëÇÑ´Ù. ÀÎÀÚ¸¦ 1 °¨¼ÒÇÑ ´ÙÀ½¿¡´Â À̰ªÀ» ½ºÅÿ¡ ¹Ð¾î ³Ö°í ´Ù½Ã factorialÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
pushl   %eax
call    factorial
            
ÀÌÁ¦ factorialÇÔ¼ö¸¦ Àç±ÍÈ£Ãâ Çß´Ù. ÀÏ´Ü ÇÔ¼ö¸¦ È£ÃâÇÏ°í ³ª¸é ¿ì¸®´Â %esp¿Í %ebp¸¦ Á¦¿ÜÇϰí´Â ´Ù¸¥ °ªµéÀ» ¾Ë ¼ö ¾ø°ÔµÈ´Ù. ±×·¡¼­ ¿ì¸®´Â ÁÖ¾îÁø ÀÎÀÚ °ªÀ» %ebx¿¡ º¹»çÇϵµ·Ï ÇÑ´Ù.
movl    8(%ebp),  %ebx
            
ÀÌÁ¦ ÀÎÀÚ¿Í ÆÑÅ丮¾ó ÇÔ¼ö¸¦ °öÇÏ¸é µÈ´Ù. ¾Õ¿¡¼­ ¿ì¸®´Â ÇÔ¼öÀÇ ¸®ÅϰªÀº %eax ¸¦ ÅëÇØ¼­ °¡Á®¿Ã ¼ö ÀÖ´Ù´Â °ÍÀ» ¹è¿ü¾ú´Ù. ±×·¯¹Ç·Î %ebx¿Í %eax¸¦ ¼­·Î °öÇÏ¸é µÈ´Ù.
imul    %ebx, %eax
            
°öÇÑ °ªÀº %eax¿¡ ÀúÀåµÈ´Ù. À̰ªÀº ÇÔ¼ö°¡ Á¾·áÇÒ ¶§ ±×´ë·Î ¸®ÅϵȴÙ. ¾Õ¼­ ¿ì¸®°¡ ÇÔ¼ö¸¦ ½ÃÀÛÇÒ ¶§ %ebp¸¦ ¹Ð¾î ³Ö°í, %esp¸¦ %ebp·Î º¹»çÇØ¼­ Áö±ÝÀÇ ½ºÅÃÆ÷ÀÎÅ͸¦ ¸¸µé¾ú´Ù. ±×·¸´Ù¸é ÇÔ¼ö°¡ Á¾·áÇÒ¶§ À̰ÍÀ» ¿ø·¡ »óÅ·Π¸¸µå´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ¿ì¸®´Â ¾Æ·¡¿Í °°Àº Äڵ带 ÀÌ¿ëÇØ¼­ ÇöÀç ½ºÅÃÇÁ·¹ÀÓÀ» µÇµ¹¸± ¼ö ÀÖ´Ù.
end_factorial:
movl   %ebp, %esp
popl   %ebp
            
ÀÌÁ¦ ret¸í·ÉÀ» ÀÌ¿ëÇØ¼­ ¸®ÅÏÇÏ¸é µÈ´Ù.
ret
            


5. ÆÄÀÏ ´Ù·ç±â

ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹ÖÀÇ ¸¹Àº ºÎºÐÀº ÆÄÀÏÀ» ´Ù·ç´Â ÀÛ¾÷ÀÌ´Ù. ÄÄÇ»ÅͰ¡ ÀÏ´Ü ¸®º×µÇ¸é ÀÌÀüÀÇ ÀÛ¾÷³»¿ëÀº ´ÜÁö ÆÄÀϷθ¸ ³²±â ¶§¹®¿¡, ¾î¶² µ¥ÀÌÅ͸¦ º¸Á¸Çϱâ À§Çؼ­ µð½ºÅ©»ó¿¡ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÀÏÀº ¸Å¿ì Áß¿äÇÑ ÀÛ¾÷ÀÌ´Ù. ¸¶Âù°¡Áö·Î ÇÁ·Î±×·¥¿ª½Ã Á¾·áÇÏ°Ô µÇ¸é ¸Þ¸ð¸®¿¡ °¡Áö°í ÀÖ´ø ¸ðµç ³»¿ëÀ» ÀÒ¾î ¹ö¸®±â ¶§¹®¿¡, Áö¼ÓÀûÀ¸·Î ³²°ÜµÎ¾î¾ßÇÒ µ¥ÀÌÅÍ(persistent data ¶ó°í ºÎ¸¥´Ù)´Â ÆÄÀÏ·Î ³²°ÜµÎ¾î¾ß ÇÑ´Ù.


5.1. À¯´Ð½º ÆÄÀÏ ¼Ò°³

¸ðµç ¿î¿µÃ¼Á¦´Â ³ª¸§´ë·ÎÀÇ ÆÄÀÏÀ» ´Ù·ç´Â ¹æ¹ýÀ» °¡Áö°í ÀÖ´Ù. ¸®´ª½º´Â À¯´Ð½ºÀÇ ÆÄÀÏ ´Ù·ç±â ¹æ¹ýÀ» äÅÃÇϰí ÀÖ´Ù. À¯´Ð½º ÆÄÀÏÀ» µû¸£´Â ÀÌÀ¯´Â ¸Å¿ì ´Ü¼øÇϰí, °¡Àå ¿À·¡, ±×¸®°í ³Î¸® »ç¿ëµÇ°í ÀÖ´Â Çü½ÄÀ̱⠶§¹®ÀÌ´Ù. À¯´Ð½º ÆÄÀÏÀº ÇÁ·Î±×·¥¿¡ ÀÇÇØ¼­ »ý¼ºµÇ¸ç, ¹ÙÀÌÆ®ÀÇ ¿¬¼ÓµÈ ½ºÆ®¸²À¸·Î ÀÐÀ» ¼ö ÀÖ´Ù. ½Ã½ºÅÛ °ü¸®ÀÚ³ª ÇÁ·Î±×·¡¸Ó´Â ÆÄÀÏ¿¡ ÁÖ¾îÁø °íÀ¯ÇÑ À̸§À¸·Î ÆÄÀÏ¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é ¿î¿µÃ¼Á¦´Â ÆÄÀÏÀ» À̸§ÀÌ ¾Æ´Ñ file descriptor¶ó°í(ÀÌÇÏ ÆÄÀÏÁöÁ¤¹øÈ£) ºÒ¸®¿ì´Â ¼ýÀÚ·Î ÀνÄÇÑ´Ù. ÇÁ·Î±×·¥»ó¿¡¼­ ¿©·¯ºÐÀº ÆÄÀÏÁöÁ¤¹øÈ£¸¦ ÀÌ¿ëÇØ¼­ Àаųª ¾²´Â ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù.

¿ì¸®°¡ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÆÄÀÏÀ» ´Ù·é´Ù.

  1. ¸ÕÀú ¸®´ª½º¿¡ ¾î¶² ÆÄÀÏÀ̸§À» ¿­(open)°ÍÀÎÁö¸¦ ¿äûÇÑ´Ù. ÆÄÀÏÀ» ¿­¶§´Â ÀбâÀü¿ë,¾²±âÀü¿ë,Àбâ/¾²±â¸ðµÎ °¡´É,ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì »õ·Î »ý¼ºµî ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ¿­ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °ÍÀº open(2) ½Ã½ºÅÛÄÝ À» ÀÌ¿ëÇØ¼­ ÀÌ·ç¾îÁø´Ù. openÀº ÆÄÀÏÀÇ À̸§, ¸ðµå, ±ÇÇѵîÀ» ÀÎÀÚ·Î ÀԷ¹޴´Ù. openÀº ½Ã½ºÅÛ ÄÝ ¹øÈ£·Î 5¹øÀÌ´Ù. ÆÄÀÏÀ̸§ÀÇ Ã¹¹øÂ° ¹®ÀÚ´Â %ebx¿¡ ÀúÀåÇÏ¸é µÈ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ ¸ðµå´Â %ecx¿¡ ÀúÀåÇÑ´Ù. ¸¸¾à Àбâ·Î ¿¬´Ù¸é 0À» ¾²±âÀ§Çؼ­ ¿¬´Ù¸é 03101À» ÀúÀåÇÏ¸é µÈ´Ù(¹Ýµå½Ã °¡Àå ¾Õ¿¡ 0À» ½áÁà¾ß ÇÑ´Ù). ¼¼¹øÂ° ÀÎÀÚ´Â ±ÇÇÑ(permission)°ú °ü·ÃµÈ ¼³Á¤À» ³Ñ±â±â À§Çؼ­ »ç¿ëÇϴµ¥, %edx¿¡ ÇØ´ç °ªÀ» ÀúÀåÇÏ¸é µÈ´Ù. ¸¸¾à ¸ðµç À¯Àú¿¡°Ô Àбâ/¾²±â°¡ °¡´ÉÇϵµ·Ï ÇÏ°í ½Í´Ù¸é 0666À» ³Ñ±â¸é µÈ´Ù.

  2. openÀÛ¾÷ÀÌ ¼º°øÀûÀ¸·Î ÀÌ·ç¾îÁ³´Ù¸é ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ¸®ÅÏÇÏ°Ô µÈ´Ù. ¸®ÅϰªÀº %eax¸¦ ÅëÇØ¼­ Àоî¿Ã ¼ö ÀÖ´Ù. ¸®ÅÏµÈ ¹øÈ£´Â ÆÄÀÏÀ» °¡¸®Å°´Â ¿ªÇÒÀ» ÇÑ´Ù.

  3. ÀÌÁ¦ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀÌ¿ëÇØ¼­ Àаųª ¾²´Â ÀÛ¾÷À» ÇÏ¸é µÈ´Ù. read(2)´Â ½Ã½ºÅÛÄÝ ¹øÈ£ 3¹øÀÌ´Ù. ÀÌ ½Ã½ºÅÛÄÝÀº 3°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ù¹øÂ° ÀÎÀÚ´Â Àб⠿øÇÏ´Â ÆÄÀÏÀÇ ÁöÁ¤ÀÚÀ̸ç %ebx¿¡ ÀúÀåÇÏ¸é µÈ´Ù. µÎ¹øÂ° ÀÎÀÚ´Â ÀоîµéÀÎ µ¥ÀÌÅͰ¡ ÀúÀåµÉ ¹öÆÛÀÇ ÁÖ¼Ò¸¦ °¡¸®Å°¸ç %ecx¿¡ ÁÖ¼Ò°ªÀ» ÀúÀåÇÑ´Ù. ¸¶Áö¸· ÀÎÀÚ´Â ¹öÆÛÀÇ Å©±â·Î %edx¿¡ ÀúÀåÇÑ´Ù. ¹öÆÛ´Â section .bss¸¦ ÀÌ¿ëÇØ¼­ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. read´Â ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÎ ¹®ÀÚÀÇ °¹¼ö¸¦ ¸®ÅÏÇϰųª, ¿¡·¯ Äڵ带 ¸®ÅÏÇÑ´Ù. ¿¡·¯ÄÚµå´Â (-)°ª À̹ǷΠÁ¤»ó¸®Åϰª°ú ½±°Ô ±¸ºÐÇÒ ¼ö ÀÖ´Ù.

    write(2)´Â ½Ã½ºÅÛÄÝ ¹øÈ£ 4¹øÀ¸·Î ¹öÆÛ¿¡ ÆÄÀÏ¿¡ ¾µ ³»¿ëÀ» ä¿ö¼­ Àü´ÞÇÏ´Â °ÍÀ» Á¦¿ÜÇϰí ÀÎÀÚ´Â read¿Í µ¿ÀÏÇÏ´Ù. write ½Ã½ºÅÛÄÝÀº ÆÄÀÏ¿¡ ¾´ µ¥ÀÌÅÍÀÇ Å©±â ȤÀº ¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù.

  4. ÆÄÀϰü·ÃµÈ ¸ðµç ÀÛ¾÷À» ¸¶ÃÆ´Ù¸é, ¿­¸°ÆÄÀÏÀ» ´Ý¾Æ¾ß ÇÑ´Ù. ÆÄÀÏÀ» ´ÝÀ» ¶§ »ç¿ëµÇ´Â ½Ã½ºÅÛÄÝÀº 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ÀÇ ½ÇÁúÀûÀÎ »ç¿ë¿ëµµ¸¦ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

.equ LINUX_SYSCALL  0x80
            
À§¿Í °°ÀÌ Çϸé Äڵ峻¿¡¼­ ½Ã½ºÅÛÄÝÀ» È£ÃâÇÒ ¶§, º¸±â Èûµç 0x80´ë½Å LINUX_SYSCALLÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
int  $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() ½Ã½ºÅÛÄÝÀ» »ç¿ëÇϱâ À§ÇÑ ½Ã½ºÅÛ ÄݹøÈ£¿Í ÀÎÀÚ¸¦ À§ÇÑ ·¹Áö½ºÅ͵é ÀÌ´Ù.

  1. %eax ´Â ½Ã½ºÅÛ ÄÝ ¹øÈ£¸¦ ÀúÀåÇÑ´Ù. openÀÇ ½Ã½ºÅÛ ÄݹøÈ£´Â 5ÀÌ´Ù.

  2. %ebx ¿¡´Â ¿­°íÀÚ ÇÏ´Â ÆÄÀÏÀÇ À̸§ÀÌ µé¾î°£´Ù. ÆÄÀÏÀ̸§Àº ¹Ýµå½Ã ³¡ÀÌ null·Î ³¡³ª´Â ¹®ÀÚ¿­À̾î¾ß ÇÑ´Ù.

  3. %ecx ¿¡´Â ÆÄÀÏÀ» ¿­¶§ »ç¿ëÇÒ ¿É¼ÇÀÌ µé¾î°£´Ù. Àбâ Àü¿ë, ¾²±âÀü¿ë, Àбâ/¾²±âÁß ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì ÆÄÀÏÀ» »ý¼ºÇÒ°ÍÀÎÁö, Á¸ÀçÇÒ °æ¿ì¿¡´Â Á¸ÀçÇÏ´Â ÆÄÀÏÀ» ¿­°ÇÁö ¾Æ´Ï¸é ¿¡·¯¸¦ ¸®ÅÏÇÒ °ÇÁö µîµµ °áÁ¤ÇÒ ¼ö ÀÖ´Ù.

  4. %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¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. ¸¸µé¾îÁø ½ÇÇàÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ½ÇÇà ½Ãų ¼ö ÀÖ´Ù.
# ./write-records
            
½ÇÇàµÇ°í ³ª¸é 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 Å×½ºÆ®´Ù. °£´ÜÈ÷ ¸»Çؼ­ °æ°è°ªÀ» ÀÔ·ÂÇßÀ» ¶§ ¾î¶² ¹®Á¦°¡ ¹ß»ýÇÏ´ÂÁö¸¦ Å×½ºÆ® ÇÏ´Â °ÍÀÌ´Ù.

´ÙÀ½Àº ÀÌ·¯ÇÑ Å×½ºÆ®¸¦ À§Çؼ­ Ưº°È÷ ´ÙÀ½°ú °°Àº °ªµéÀ» Áß¿äÇÏ°Ô Å×½ºÆ® ÇØ¾ß ÇÑ´Ù.

  • ¼ýÀÚ 0

  • ¼ýÀÚ 1

  • ¹üÀ§¿¡ µé¾î°¡´Â ¼ýÀÚ

  • ¹üÀ§¸¦ ÃʰúÇÏ´Â ¼ýÀÚ

  • ¹üÀ§¿¡¼­ °¡Àå Å« ¼ýÀÚ

  • ¹üÀ§¿¡¼­ °¡Àå ÀÛÀº ¼ýÀÚ

  • ¹üÀ§¿¡¼­ °¡Àå ÀÛÀº ¼ýÀÚº¸´Ù ÇѴܰè ÀÛÀº ¼ýÀÚ

  • ¹üÀ§¿¡¼­ °¡Àå Å« ¼ýÀÚº¸´Ù ÇѴܰè Å« ¼ýÀÚ

¿¹¸¦ µé¾î¼­ 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µîÀ» ÀÌ¿ëÇØ¼­ ¸í·ÉÀ» Á¡ÇÁÇÏ°Ô µÉ°æ¿ì´Â ¾î¶»°Ô µÉ°¡ ? ÀÌ·² °æ¿ì¿¡ ÄÄÇ»ÅÍ´Â ´ÙÀ½ ¸í·ÉÀÌ ¾Æ´Ñ ´Ù¸¥ À§Ä¡ÀÇ ¸í·ÉÀ» ½ÇÇàÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·²°æ¿ì ¿ì¸®´Â ÀϹÝÀûÀ¸·Î ¾Æ·¡¿Í °°Àº Äڵ带 »ç¿ëÇÏ°Ô µÉ°ÍÀÌ´Ù.

jmp somewhere
            
ÀÌ ÄÚµå´Â ¾Æ·¡ÀÇ ÄÚµå¿Í µ¿ÀÏÇÑ ÀÏÀ» ÇÑ´Ù.
movl $somewhere, %eip
            
¾Ë´Ù½ÃÇÇ somewhere´Â ÇÁ·Î±×·¥ÀÇ ¿µ¿ªÀ» ÂüÁ¶Çϱâ À§ÇÑ »ó¡ÀÌ´Ù. ±×·¯¹Ç·Î %eip°¡ Á÷Á¢ somewhere¸¦ ÂüÁ¶Çϵµ·Ï ÇÏ´Â °ÍÀº Çã¿ëÀÌ µÇÁö ¾Ê´Â´Ù. ±×·¯³ª '$'Ç¥½Ã¸¦ ÀÌ¿ëÇÏ°Ô µÉ°æ¿ì À̸¦ Çã¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ´Â $Ç¥½Ã°¡ immediate mode addressiong¸ðµå·Î somewhere¸¦ °ªÀ¸·Î ´Ù·ê ¼ö ÀÖµµ·Ï ÇØÁֱ⠶§¹®ÀÌ´Ù. ¸¸¾à '$'Ç¥½Ã¸¦ »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì direct addressing mode°¡ µÇ´Âµ¥, ±×·²°æ¿ì somewhereÀÇ ÁÖ¼Ò¿¡ ÀÖ´Â °ªÀÌ %eip·Î À̵¿ÀÌ µÇ¾î¹ö¸°´Ù. À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â °á°ú°¡ ¾Æ´Ï´Ù. ¾Æ·¡´Â ½ÇÁ¦ ÀÚÁÖ »ç¿ëµÇ´Â ÄÚµå´Ù.
movl $0, $ebx
            
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) ½ºÅÃÆ÷ÀÎÅͰ¡ Áõ°¡ÇÏ´Â ¹æ½ÄÀÌ´Ù.

pushl %eax
            
À§ÀÇ ÄÚµå´Â ¾Æ·¡¿Í µ¿ÀÏÇÏ´Ù.
movl %eax, (%esp)
subl $4, %esp
            
%eax´Â 4¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °¡Áø´Ù. À̰ÍÀ» ½ºÅÿ¡ ¹Ð¾î ³Ö¾úÀ¸´Ï, ´ÙÀ½°ªÀ» ³ÖÀ» ¶§¿¡´Â 4¹ÙÀÌÆ® ¸¸Å­ µÚ·Î ¹Ð·Á¼­ °ªÀ» ³Ö¾î¾ß ÇÒ °ÍÀÌ´Ù. À̸¦ À§Çؼ­ sublÀ» ÀÌ¿ëÇØ¼­ %esp¿¡¼­ 4¸¸Å­À» »©ÁÖ¾ú´Ù.
popl %eax
            
À§ÀÇ ÄÚµå´Â 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Çü½ÄÀ¸·Î ¸¸µéµµ·Ï ÇÑ´Ù.
# as alloc.s -o alloc.o
ÀÌÁ¦ Äڵ带 ºÐ¼®ÇØ º¸µµ·Ï ÇÏÀÚ.


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)À» È£ÃâÇϰí, ¸®ÅϰªÀ» °Ë»çÇÑ´Ù.
cmpl  $0, %eax
je    error
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
            
.bss sectionÀ» º¸¸é record_buffer¸¦ ÀÔÃâ·Â ¹öÆÛ·Î ÀÌ¿ëÇϰí Àִµ¥, °íÁ¤µÈ Å©±â·Î ÇÒ´çµÇ¾î ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÀÌ°É ¿ì¸®°¡ ¸¸µç ¸Þ¸ð¸® °ü¸®ÀÚ¸¦ ÀÌ¿ëÇØ¼­ µ¿ÀûÀ¸·Î ÇÒ´çÇϵµ·Ï Äڵ带 ¼öÁ¤ÇÑ ÈÄ Å×½ºÆ® ÇÏ¸é µÈ´Ù. ¿ì¸®°¡ ¼öÁ¤ÇÒ ºÎºÐÀÇ ¿øº» ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
.section .bss
.lcomm, record_buffer, RECORD_SIZE
            
¿ì¼± °íÁ¤µÈ Å©±âÀÇ record_buffer´Â Çʿ䰡 ¾øÀ» °ÍÀÌ´Ù. µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛÀÇ ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °ø°£¸¸ ÀÖÀ¸¸é µÈ´Ù. ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£Àº 4byte¸é ÃæºÐÇÏ´Ù. ½ÃÀÛÁÖ¼Ò¸¦ ÀúÀåÇÒ °ø°£Àº .data ¿µ¿ª¿¡ ¼±¾ðÇÏ¸é µÈ´Ù.
record_buffer_ptr:
.long 0
                
´ÙÀ½À¸·Î ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÈ µÚ, ¸Þ¸ð¸® °ü¸®ÀÚ¸¦ ÃʱâÈ­ ½Ã۱â À§Çؼ­ allocate_init ¸¦ È£ÃâÇÏ´Â Äڵ带 Ãß°¡ÇÑ´Ù.
call 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
                
¼º°øÀûÀ¸·Î ½ÇÇàÆÄÀÏÀ» ¸¸µé¾ú´Ù¸é, ½ÇÇà½ÃÄѼ­ Å×½ºÆ®Çغ¸µµ·Ï ÇÏÀÚ.
# ./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¿¡¼­ Á¤º¸¸¦ °¡Á®¿À´Â µîÀÇ ¹æ¹ýÀ¸·Î ÀÌ·¯ÇÑ ÇÔ¼öÀÇ ½ÇÇàÀ» ÃÖ¼ÒÈ­ ½Ãų¼ö ÀÖÀ¸¸ç, ½ÇÁ¦ ÀÌ·¯ÇÑ ¹æ¹ýÀ» ÀÌ¿ëÇØ¼­ ÇÁ·Î±×·¥À» ÃÖÀûÈ­ ½ÃÄ×´Ù.


10.5. º¹½À

  • Áö¿ªÃÖÀûÈ­¿Í Àü¿ªÃÖÀûÈ­ÀÇ Â÷À̸¦ ¼³¸íÇ϶ó.

  • Áö¿ªÃÖÀûÈ­ ¹æ¾ÈÀÇ ¸î°¡Áö ¹æ¹ýÀ» ¼³¸íÇ϶ó.


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Àº Å×À̺í ÇüÅ·Π¼³¸íÀ» Çϵµ·Ï ÇÒ °ÍÀÌ´Ù. ÀÌ Å×À̺íÀº ¾Æ·¡¿Í °°Àº ³»¿ëµéÀ» ´ã°í ÀÖ´Ù.

  • Instruction ÄÚµå

  • »ç¿ëµÇ´Â operands

  • »ç¿ëµÇ´Â flags

  • instruction¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸í


12.1. Data Transfer Instructions

표 1. Data Transfer Instructions

InstructionOperandsAffected Flags
movlI/R/M, I/R/MO/S/Z/A/C
word ´ÜÀ§ÀÇ µ¥ÀÌÅ͸¦ ´Ù¸¥ À§Ä¡·Î ¿Å±â±â À§Çؼ­ »ç¿ëÇÑ´Ù. movl %eax %ebx ´Â %eaxÀÇ µ¥ÀÌÅ͸¦ %ebx·Î º¹»çÇ϶ó´Â Àǹ̴Ù.
movbI/R/M, I/R/MO/S/Z/A/C
byte´ÜÀ§À롃 Á¦¿ÜÇϰí´Â movl°ú µ¿ÀÏÇÑ ÀÏÀ» ÇÑ´Ù.
lealM, I/R/MO/S/Z/AC
¸Þ¸ð¸®ÀÇ À§Ä¡¸¦ °è»êÇØ¼­, ÇØ´ç ÁÖ¼Ò¸¦ Àоî¿Â´Ù. ¿¹¸¦µé¾î leal 5(%ebp, %ecx, 1)Àϰæ¿ì 5+%ebp+1*%ecx ·Î °è»êµÈ ÁÖ¼ÒÀÇ °ªÀÌ %eax¿¡ ÀúÀåµÈ´Ù.
poplR/MO/S/Z/A/C
½ºÅÃÀÇ °¡Â¡À§¿¡ ÀÖ´Â À§Ä¡°ªÀ» °¡Á®¿Â´Ù. À̰ÍÀº movl (%esp), R/M ÈÄ addl $4 ÇÑ °Í°ú °°Àº °á°ú¸¦ º¸¿©ÁØ´Ù.
pushlI/R/MO/S/Z/A/C
½ºÅÿ¡ °ªÀ» ¹Ð¾î ³Ö´Â´Ù. movl %eax, (%esp)ÈÄ subl $4, %espÇÑ °Í°ú °°Àº °á°ú¸¦ º¸¿©ÁØ´Ù.
xchglR/M, R/MO/S/Z/A/C
°ªÀ» ¼­·Î ¹Ù²Û´Ù.


12.2. Integer Instructions

ºÎÈ£ÀÖ´Â Á¤¼öÇü°ú ºÎÈ£¾ø´Â Á¤¼öÇüÀÇ °è»êÀ» À§ÇÑ ¸í·ÉÀ» ¼Ò°³ÇÑ´Ù.

표 2. Data Transfer Instructions

InstructionOperandsAffected Flags
adclI/R/M, R/MO/S/Z/A/P/C
 
addlI/R/M, R/MO/S/Z/A/P/C
ù¹øÂ° ¿ÀÆÛ·£µå¿Í µÎ¹øÂ° ¿ÀÆÛ·£µå¸¦ ´õÇÑ´Ù. °á°ú´Â µÎ¹øÂ° ¿ÀÆÛ·£µå¿¡ ÀúÀåµÈ´Ù. ¸¸¾à ´õÇÑ °á°ú°¡ ÀúÀåµÉ ·¹Áö½ºÅÍÀÇ °ø°£º¸´Ù Å«´Ù¸é, overflow°¡ ¹ß»ýÇϰí bits´Â ÂüÀÌ µÈ´Ù. ÀÌ ¸í·ÉÀº ºÎÈ£Çü°ú ºÎÈ£¾ø´Â Á¤¼öÇü ¸ðµÎ¿¡ »ç¿ëµÈ´Ù.


13. Appendix C. ÁÖ¿ä ½Ã½ºÅÛ Äݵé

¿©±â¿¡¼­´Â ¸®´ª½º¿¡¼­ »ç¿ëÇÏ°Ô µÇ´Â Áß¿äÇÑ ½Ã½ºÅÛÄݵéÀ» °£´ÜÈ÷ ¼³¸íÇϵµ·Ï ÇÑ´Ù. º¸ÅëÀº ½Ã½ºÅÛÄÝÀ» Á÷Á¢»ç¿ëÇϱ⺸´Ù´Â ¶óÀ̺귯¸® ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °æ¿ì°¡ ´õ ¸¹±â ¶§¹®ÀÌ´Ù. ¸®´ª½º ½Ã½ºÅÛÄÝ Äü ·¹ÆÛ·±½º¿Í Linux Assembler ÇÏ¿ìÅõ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.


14. Appendix D. ASCII ÄÚµå Ç¥

그림 4. ASCII ÄÚµå Ç¥

ASCII ÄÚµå´Â ´Ü¼øÇϱä ÇÏÁö¸¸, 2byte¹®ÀÚ¸¦ Áö¿øÇÒ ¼ö ¾ø´Ù´Â ´ÜÁ¡À» °¡Áø´Ù. ±×·± ÀÌÀ¯·Î ÃÖ±Ù¿¡´Â 2byteÀÌ»óÀÇ ¹®ÀÚÀÇ Áö¿øÀÌ °¡´ÉÇÑ Unicode°¡ ±¹Á¦ Ç¥ÁØÀ¸·Î äÅõǰí ÀÖ´Ù. À¯´ÏÄÚµå´Â ¸î°¡Áö ÀÎÄÚµù ¹æ¹ýÀÌ Àִµ¥, ±×Áß UTF-8°ú UTF-32°¡ °¡Àå ³Î¸® ¾²ÀδÙ. UTF-8Àº ASCII¿Í ÇÏÀ§ ȣȯÀÌ µÈ´Ù. UTF-32´Â 4¹ÙÀÌÆ®¸¦ ÀÌ¿ëÇØ¼­ ÇϳªÀÇ ¹®ÀÚ¸¦ ¸¸µç´Ù.

Unicode¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº Unicode.html¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.

주석

[1]

À¯´Ð½º¿Í ¸®´ª½º´Â À©µµ¿ì¿Í ´Þ¸® È®ÀåÀÚ(extensions)¸¦ °¡Áú Çʿ䰡 ¾ø´Ù. À©µµ¿ìÁî¶ó¸é ½ÇÇàÆÄÀÏÀÇ °æ¿ì .exeµîÀÇ È®ÀåÀÚ¸¦ ¸í½ÃÇØ¾ß ÇÏÁö¸¸ À¯´Ð½º¿¡¼­´Â ¾î¶°ÇÑ È®ÀåÀÚµµ °¡Áú Çʿ䰡 ¾ø´Ù.

[2]

°°Àº ÀÏÀ» ÇÏ´Â ÇÁ·Î±×·¥ÀÌ¶óµµ ¸Å¿ì ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ÀÛ¼ºµÉ ¼ö ÀÖ´Ù. ÀϹÝÀûÀÎ ¹æ¹ýÀÌ »ç¿ëµÉ ¼ö ÀÖÁö¸¸ ¿©·¯ºÐ¸¸ÀÇ ³ëÇϿ츦 ÀÌ¿ëÇØ¼­ ÀÛ¼ºµÉ ¼ö ÀÖÀ¸¸ç, À̰æ¿ì ´Ù¸¥ ÇÁ·Î±×·¡¸Ó°¡ Äڵ带 ºÐ¼®Çϴµ¥ ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ Æ¯ÀÌ »çÇ×µéÀ» ¸í½ÃÇØ µÎ¸é ´Ù¸¥ ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸¹Àº µµ¿òÀ» ÁÙ ¼ö ÀÖ´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.