5Àå. ÆÄÀÏ ´Ù·ç±â
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

ÆÄÀÏ ´Ù·ç±â

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 ¼½¼ÇÀÇ Â÷ÀÌ´Â ¹«¾ùÀΰ¡ .

  • ÆÄÀÏ·Î ºÎÅÍ ÀÐ°í ¾²±â À§Çؼ­ »ç¿ëÇÏ´Â ½Ã½ºÅÛÄÝ¿¡ ´ëÇØ¼­ ¼³¸íÇϽÿÀ.

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