|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
ÆÄÀÏ ´Ù·ç±â5. ÆÄÀÏ ´Ù·ç±â ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹ÖÀÇ ¸¹Àº ºÎºÐÀº ÆÄÀÏÀ» ´Ù·ç´Â ÀÛ¾÷ÀÌ´Ù. ÄÄÇ»ÅͰ¡ ÀÏ´Ü ¸®º×µÇ¸é
ÀÌÀüÀÇ ÀÛ¾÷³»¿ëÀº ´ÜÁö ÆÄÀϷθ¸ ³²±â ¶§¹®¿¡, ¾î¶² µ¥ÀÌÅ͸¦ º¸Á¸Çϱâ À§Çؼ
µð½ºÅ©»ó¿¡ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÀÏÀº ¸Å¿ì Áß¿äÇÑ ÀÛ¾÷ÀÌ´Ù. ¸¶Âù°¡Áö·Î ÇÁ·Î±×·¥¿ª½Ã
Á¾·áÇÏ°Ô µÇ¸é ¸Þ¸ð¸®¿¡ °¡Áö°í ÀÖ´ø ¸ðµç ³»¿ëÀ» ÀÒ¾î ¹ö¸®±â ¶§¹®¿¡, Áö¼ÓÀûÀ¸·Î
³²°ÜµÎ¾î¾ßÇÒ µ¥ÀÌÅÍ(persistent data ¶ó°í ºÎ¸¥´Ù)´Â ÆÄÀÏ·Î ³²°ÜµÎ¾î¾ß ÇÑ´Ù.
5.1. À¯´Ð½º ÆÄÀÏ ¼Ò°³ ¸ðµç ¿î¿µÃ¼Á¦´Â ³ª¸§´ë·ÎÀÇ ÆÄÀÏÀ» ´Ù·ç´Â ¹æ¹ýÀ» °¡Áö°í ÀÖ´Ù. ¸®´ª½º´Â
À¯´Ð½ºÀÇ ÆÄÀÏ ´Ù·ç±â ¹æ¹ýÀ» äÅÃÇϰí ÀÖ´Ù. À¯´Ð½º ÆÄÀÏÀ» µû¸£´Â ÀÌÀ¯´Â
¸Å¿ì ´Ü¼øÇϰí, °¡Àå ¿À·¡, ±×¸®°í ³Î¸® »ç¿ëµÇ°í ÀÖ´Â Çü½ÄÀ̱⠶§¹®ÀÌ´Ù.
À¯´Ð½º ÆÄÀÏÀº ÇÁ·Î±×·¥¿¡ ÀÇÇØ¼ »ý¼ºµÇ¸ç, ¹ÙÀÌÆ®ÀÇ ¿¬¼ÓµÈ ½ºÆ®¸²À¸·Î
ÀÐÀ» ¼ö ÀÖ´Ù. ½Ã½ºÅÛ °ü¸®ÀÚ³ª ÇÁ·Î±×·¡¸Ó´Â ÆÄÀÏ¿¡ ÁÖ¾îÁø °íÀ¯ÇÑ À̸§À¸·Î
ÆÄÀÏ¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é ¿î¿µÃ¼Á¦´Â ÆÄÀÏÀ» À̸§ÀÌ ¾Æ´Ñ
file descriptor¶ó°í(ÀÌÇÏ ÆÄÀÏÁöÁ¤¹øÈ£) ºÒ¸®¿ì´Â
¼ýÀÚ·Î ÀνÄÇÑ´Ù. ÇÁ·Î±×·¥»ó¿¡¼ ¿©·¯ºÐÀº ÆÄÀÏÁöÁ¤¹øÈ£¸¦ ÀÌ¿ëÇØ¼ Àаųª
¾²´Â ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù.
¿ì¸®°¡ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÆÄÀÏÀ» ´Ù·é´Ù.
¸ÕÀú ¸®´ª½º¿¡ ¾î¶² ÆÄÀÏÀ̸§À» ¿(open)°ÍÀÎÁö¸¦ ¿äûÇÑ´Ù. ÆÄÀÏÀ»
¿¶§´Â ÀбâÀü¿ë,¾²±âÀü¿ë,Àбâ/¾²±â¸ðµÎ °¡´É,ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì
»õ·Î »ý¼ºµî ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ¿ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °ÍÀº open(2) ½Ã½ºÅÛÄÝ
À» ÀÌ¿ëÇØ¼ ÀÌ·ç¾îÁø´Ù. openÀº ÆÄÀÏÀÇ À̸§, ¸ðµå, ±ÇÇѵîÀ» ÀÎÀÚ·Î
ÀԷ¹޴´Ù. openÀº ½Ã½ºÅÛ ÄÝ ¹øÈ£·Î 5¹øÀÌ´Ù. ÆÄÀÏÀ̸§ÀÇ Ã¹¹øÂ° ¹®ÀÚ´Â
%ebx¿¡ ÀúÀåÇÏ¸é µÈ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ ¸ðµå´Â %ecx¿¡ ÀúÀåÇÑ´Ù. ¸¸¾à
Àбâ·Î ¿¬´Ù¸é 0À» ¾²±âÀ§Çؼ ¿¬´Ù¸é 03101À» ÀúÀåÇÏ¸é µÈ´Ù(¹Ýµå½Ã
°¡Àå ¾Õ¿¡ 0À» ½áÁà¾ß ÇÑ´Ù). ¼¼¹øÂ° ÀÎÀÚ´Â ±ÇÇÑ(permission)°ú °ü·ÃµÈ
¼³Á¤À» ³Ñ±â±â À§Çؼ »ç¿ëÇϴµ¥, %edx¿¡ ÇØ´ç °ªÀ» ÀúÀåÇÏ¸é µÈ´Ù.
¸¸¾à ¸ðµç À¯Àú¿¡°Ô Àбâ/¾²±â°¡ °¡´ÉÇϵµ·Ï ÇÏ°í ½Í´Ù¸é 0666À» ³Ñ±â¸é
µÈ´Ù.
openÀÛ¾÷ÀÌ ¼º°øÀûÀ¸·Î ÀÌ·ç¾îÁ³´Ù¸é ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ¸®ÅÏÇÏ°Ô µÈ´Ù.
¸®ÅϰªÀº %eax¸¦ ÅëÇØ¼ Àоî¿Ã ¼ö ÀÖ´Ù. ¸®ÅÏµÈ ¹øÈ£´Â ÆÄÀÏÀ» °¡¸®Å°´Â
¿ªÇÒÀ» ÇÑ´Ù.
ÀÌÁ¦ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀÌ¿ëÇØ¼ Àаųª ¾²´Â ÀÛ¾÷À» ÇÏ¸é µÈ´Ù.
read(2)´Â ½Ã½ºÅÛÄÝ ¹øÈ£ 3¹øÀÌ´Ù. ÀÌ ½Ã½ºÅÛÄÝÀº 3°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î
ÇÑ´Ù. ù¹øÂ° ÀÎÀÚ´Â Àб⠿øÇÏ´Â ÆÄÀÏÀÇ ÁöÁ¤ÀÚÀ̸ç %ebx¿¡ ÀúÀåÇÏ¸é µÈ´Ù.
µÎ¹øÂ° ÀÎÀÚ´Â ÀоîµéÀÎ µ¥ÀÌÅͰ¡ ÀúÀåµÉ ¹öÆÛÀÇ ÁÖ¼Ò¸¦ °¡¸®Å°¸ç %ecx¿¡ ÁÖ¼Ò°ªÀ»
ÀúÀåÇÑ´Ù. ¸¶Áö¸· ÀÎÀÚ´Â ¹öÆÛÀÇ Å©±â·Î %edx¿¡ ÀúÀåÇÑ´Ù. ¹öÆÛ´Â section
.bss¸¦ ÀÌ¿ëÇØ¼ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. read´Â ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÎ ¹®ÀÚÀÇ °¹¼ö¸¦
¸®ÅÏÇϰųª, ¿¡·¯ Äڵ带 ¸®ÅÏÇÑ´Ù. ¿¡·¯ÄÚµå´Â (-)°ª À̹ǷΠÁ¤»ó¸®Åϰª°ú
½±°Ô ±¸ºÐÇÒ ¼ö ÀÖ´Ù.
write(2)´Â ½Ã½ºÅÛÄÝ ¹øÈ£ 4¹øÀ¸·Î ¹öÆÛ¿¡ ÆÄÀÏ¿¡ ¾µ ³»¿ëÀ» ä¿ö¼ Àü´ÞÇÏ´Â °ÍÀ»
Á¦¿ÜÇϰí ÀÎÀÚ´Â read¿Í µ¿ÀÏÇÏ´Ù. write ½Ã½ºÅÛÄÝÀº ÆÄÀÏ¿¡ ¾´ µ¥ÀÌÅÍÀÇ Å©±â ȤÀº
¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù.
ÆÄÀϰü·ÃµÈ ¸ðµç ÀÛ¾÷À» ¸¶ÃÆ´Ù¸é, ¿¸°ÆÄÀÏÀ» ´Ý¾Æ¾ß ÇÑ´Ù. ÆÄÀÏÀ» ´ÝÀ» ¶§ »ç¿ëµÇ´Â
½Ã½ºÅÛÄÝÀº 6¹ø ¹øÈ£¸¦ °¡Áö´Â close(2)ÀÌ´Ù.´ÜÁö ´Ý°íÀÚ ÇÏ´Â ÆÄÀÏÀÇ ÁöÁ¤ÀÚ¸¸
ÀÎÀÚ·Î ³Ñ±â¸é µÈ´Ù.
5.2. ¹öÆÛ¿Í .bss ÀÌÀüÀå¿¡¼ ¹öÆÛ¿¡ ´ëÇØ¼ ¾ð±ÞÇߴµ¥, ÀÚ¼¼È÷ ¼³¸íÇÏÁö´Â ¾Ê¾Ò´Ù. À̹ø Àå¿¡¼´Â ¹öÆÛ¿¡
´ëÇØ¼ ÀÚ¼¼È÷ ¼³¸íÇØº¸µµ·Ï ÇÑ´Ù. ¹öÆÛ´Â ´ë·®ÀÇ µ¥ÀÌÅ͸¦ Àü´ÞÇϱâ À§Çؼ »ç¿ëµÇ´Â
¿¬¼ÓµÇ´Â ºí·°¿µ¿ªÀÌ´Ù. ´ç½ÅÀÌ ÆÄÀÏ·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àб⸦ ¿øÇÑ´Ù¸é, ¿äûÀº
¿î¿µÃ¼Á¦·Î Àü´ÞµÇ´Âµ¥, À̶§ ÀÐÀº µ¥ÀÌÅ͸¦ ¾îµð¿£°¡¿¡ ÀúÀåÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ
Àå¼Ò¸¦ ¹öÆÛ¶ó°í ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ¹öÆÛ´Â µ¥ÀÌÅÍÀÇ Àӽà ÀúÀåÀå¼Ò·Î »ç¿ëµÇ¸ç, ¹öÆÛ¸¦
ÀÌ¿ëÇÔÀ¸·Î¼ ÇÁ·Î±×·¥Àº µ¥ÀÌÅ͸¦ Á»´õ ½±°Ô ´Ù·ê ¼ö ÀÖ°Ô µÈ´Ù.
¹öÆÛ¸¦ »ý¼ºÇÒ¶§ ¿©·¯ºÐÀº °íÁ¤µÈ Å©±âÀÇ ¹öÆÛ¸¦ ¸¸µéÁö ¾Æ´Ï¸é Çʿ信 µû¶ó Å©±â°¡
º¯ÇÏ´Â ¹öÆÛ¸¦ »ý¼ºÇØ¾ß ÇÒÁö ¼±ÅÃÇØ¾ß ÇÑ´Ù. °íÁ¤µÈ Å©±âÀÇ ¹öÆÛ »ý¼ºÀº °£´ÜÇÏ´Ù.
.long ³ª .byte ¸¦ ÀÌ¿ëÇØ¼ ¹öÆÛ·Î »ç¿ëµÉ Å©±â¸¦ Á÷Á¢ ÁöÀåÇÏ¸é µÈ´Ù. ¹Ý¸é µ¿ÀûÀ¸·Î
º¯ÇÏ´Â ¹öÆÛÀÇ »ý¼ºÀº ´Ù·ç¾î¾ßÇÒ ³»¿ëÀÌ ¸¹À¸¹Ç·Î ??Àå¿¡¼ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ.
¹öÆÛ°ø°£À» È®º¸ÇÏ´Â°Ç °£´ÜÇϱä ÇÏÁö¸¸ °ø°£È®º¸¸¦ À§ÇÑ ´ÜÀ§·Î .byte¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù´Â
°Í ¶§¹®¿¡ ¸î°¡Áö ¹®Á¦Á¡ÀÌ ¹ß»ýÇÏ´Ù. ù¹øÂ°´Â °ø°£ÀÇ Å©±â¸¦ °è»êÇØ¾ß ÇÏ´Â ¹®Á¦´Ù.
¹®ÀÚ 500ÀÚ¸¦ ÀúÀåÇÏ´Â °Í°ú intÇü ¼ýÀÚ 500°³¸¦ ÀúÀåÇϱâ À§ÇÑ ¿¹¿¡¼ º¸µíÀÌ
ÀúÀåµÇ´Â ¿ø¼ÒÀÇ °¹¼ö´Â µ¿ÀÏÇÏÁö¸¸, ¿ø¼Ò°¡ Â÷ÁöÇÏ´Â Å©±â°¡ ´Ù¸§À¸·Î ÇÊ¿äÇÑ °ø°£°è»ê¿¡¼
½Ç¼ö°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ƯÈ÷ ¾î¼Àºí·¯³ª C¿Í °°Àº Áß/Àú ¼öÁØÀÇ ¾ð¾î¸¦ ÀÌ¿ëÇÒ°æ¿ì
ÀÌ·¯ÇÑ ½Ç¼ö´Â ÀÏ»óÀûÀ¸·Î ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
µÎ¹øÂ°.. ÀÌ·¯ÇÑ °ø°£Àº ÇÁ·Î±×·¥ ½ÇÇà½Ã »ý¼ºµÈ´Ù. Áß°£¿¡ ÇÊ¿ä ¾ø´Ù°í ÇØ¼ ¾ø¾Ù ¼ö ¾ø´Ù.
ÀÌ´Â °ø°£ÀÌ ³¶ºñµÉ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù.
¹°·Ð ÀÌµé ¹®Á¦¿¡ ´ëÇÑ ÇØ¹ýµµ Á¸ÀçÇϴµ¥ .text, .data ¼½¼ÇÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
.bss »ö¼ÇÀº ÀúÀå°ø°£À» È®º¸ÇÒ ¼ö ÀÖÁö¸¸ ÃʱâÈ ÇÒ¼ö´Â ¾ø´Ù. .data ¼½¼ÇÀÇ °æ¿ì
°ø°£À» È®º¸ÇÏ°í °ªÀ» ÃʱâÈ ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ Æ¯¼º ¶§¹®¿¡ °ªÀ» ÃʱâÈÇÒ ÇÊ¿ä¾ø´Â
°ø°£À» È®º¸ÇϰíÀÚ ÇÒ¶§ ÁÖ·Î »ç¿ëÇÑ´Ù. .bss´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
.section .bss
.lcomm my_buffer, 500
|
.lcommÀº 500byteÀÇ °ø°£À» ÇÒ´çÇϰí, °ø°£À» °¡¸®Å°±âÀ§ÇÑ ½Éº¼·Î
my_bufferÀ» »ý¼ºÇÑ´Ù. ¸¸µé¾îÁø °ø°£Àº ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
movl $my_buffer, %ecx
movl 500, %edx
movl 3, %eax
int $0x80
|
À§ÀÇ ÄÚµå´Â read ½Ã½ºÅÛÄÝÀ» ½ÇÇà½ÃŲ ¿¹·Î, 500¹ÙÀÌÆ®¸¸ÅÀÇ µ¥ÀÌÅ͸¦ ÀÐ¾î¼ my_buffer·Î
º¹»çÇÑ´Ù. C½ºÅ¸ÀÏ·Î ¹Ù²ã º¸ÀÚ¸é ¾Æ·¡ÀÇ ÄÚµå Á¤µµ°¡ µÉ°ÍÀÌ´Ù.
read(fd, my_buffer, 500);
|
my_bufferÀ» »ç¿ëÇÒ ¶§ °¡Àå ¾Õ¿¡ ´Þ·¯($)Ç¥½Ã°¡ ÀÖÀ½À» ÁÖ¸ñÇϱ⠹ٶõ´Ù. $Ç¥½Ã°¡
»ç¿ëÇÒ °æ¿ì immediate ¸ðµå ¾îµå·¹½º »óŰ¡ µÇ°í ¹öÆÛÀÇ ½ÃÀÛÀ§Ä¡¸¦ °¡¸®Å°°Ô µÈ´Ù.
°á°úÀûÀ¸·Î %ecx´Â my_bufferÀÇ ÀúÀå°ø°£ÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ °¡¸®Å°°Ô µÈ´Ù. C¾ð¾î¸¦
ÇØºÃ´Ù¸é °á±¹Àº Æ÷ÀÎÅÍ¿Í ºñ½ÁÇÑ °³³äÀ̶ó´Â »ý°¢ÀÌ µé °ÍÀÌ´Ù.
5.3. Ç¥ÁØÆÄÀϰú Ư¼ö ÆÄÀÏµé ´ç½ÅÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ¸é ±âº»ÀûÀ¸·Î ¿©´Â ÆÄÀϵéÀÌ ¸î°Ô ÀÖ´Ù. ¸®´ª½º´Â
´ÙÀ½°ú °°Àº 3°³ÀÇ ÆÄÀÏÀ» ±âº»ÀûÀ¸·Î »ý¼º½ÃŲ´Ù.
- STDIN
Ç¥ÁØ ÀÔ·Â(standard input)À¸·Î, Àбâ Àü¿ëÀÌ´Ù. º¸Åë Űº¸µå·ÎºÎÅÍÀÇ
ÀÔ·ÂÀ» ¹Þ¾ÆµéÀδÙ. Ç¥ÁØ ÀÔ·ÂÀ» À§ÇÑ ÆÄÀÏÁöÁ¤ÀÚ´Â ¾ðÁ¦³ª 0ÀÌ´Ù.
- STDOUT
Ç¥ÁØ Ãâ·Â(standard output)À¸·Î, ¾²±â Àü¿ëÀÌ´Ù. ¸ð´ÏÅÍ È¸é¿¡
Ãâ·ÂÇϱâ À§Çؼ »ç¿ëµÈ´Ù. Ç¥ÁØ Ãâ·ÂÀ» À§ÇÑ ÆÄÀÏÁöÁ¤ÀÚ´Â ¾ðÁ¦³ª 1ÀÌ´Ù.
- STDERR
Ç¥ÁØ ¿¡·¯(standard error)À¸·Î, ¾²±â Àü¿ëÀÌ´Ù. ¸ð´ÏÅÍ È¸é¿¡
Ãâ·Â(¾²±â)Çϱâ À§Çؼ »ç¿ëµÈ´Ù. ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. ¾îÂ÷ÇÇ ¸ð´ÏÅÍ È¸é¿¡
Ãâ·ÂÇÏ´Â °Å¶ó¸é STDOUT¿Í ´Ù¸¦°Ô ¹¹°¡ ÀÖ´À³Ä¶ó°í »õ°¢ÇÒ ¼öµµ ÀÖÀ»°Í °°´Ù.
¸¸¾à ȸéÃâ·ÂÀ» Çϴµ¥, Á¤»óÀûÀÎ ¸Þ½ÃÁö¿Í ¿¡·¯ ¸Þ½ÃÁö°¡ °°Àº ÆÄÀÏÁöÁ¤ÀÚ¸¦
¾´´Ù¸é À̸¦ ±¸ºÐÇØ ³»±â°¡ ¸Å¿ì Â¥Áõ³¯ °ÍÀÌ´Ù. Ç¥ÁØ¿¡·¯¸¦ µû·Î ºÐ¸®ÇϹǷνá
¿¡·¯¸Þ½ÃÁö¸¦ ÀϹݸ޽ÃÁö¿Í ½±°Ô ºÐ¸®ÇÒ ¼ö ÀÖ´Ù.
Űº¸µå ÀԷ°ú ȸé Ãâ·Â°°Àº °ÍµéÀ» ÆÄÀÏ·Î ´Ù·ëÀ¸·Î À̵é ÀÔ/Ãâ·ÂÀ» ½±°Ô ½ÇÁ¦ÆÄÀÏ·Î
º¸³¾ ¼öµµ ÀÖ´Ù. ÀÌ·¯ÇÑ°É ÀçÁöÇâ(redirected)À̶ó°í ÇÑ´Ù. ÀçÁöÇâ°ú °ü·ÃµÈ ³»¿ëÀº
ÀÌ ¹®¼ÀÇ ¹üÀ§¸¦ ¹þ¾î³ª¹Ç·Î ÀÚ¼¼È÷ ¼³¸íÇÏÁø ¾Ê°Ú´Ù. ÀçÁöÇâ°ú °ü·ÃµÈ ³»¿ëÀº
UNIX »ç¿ë°ú °ü·Ã ´Ù¸¥ Ã¥µéÀ» Âü°íÇϱ⠹ٶõ´Ù.
Űº¸µå, ¸ð´ÏÅÍ¿Í °°Àº °Íµé ¿Ü¿¡µµ À¯´Ð½º´Â ´Ù¸¥ ¸ðµç ÀåÄ¡µé ¿¹¸¦ µé¸é
½Ã¸®¾ó Æ÷Æ®, ¿Àµð¿À ÀåÄ¡, ³×Æ®¿öÅ© ¿¬°áµé±îÁöµµ ÆÄÀÏ·Î ´Ù·é´Ù.
»Ó¸¸ ¾Æ´Ï¶ó ÇÁ·Î¼¼½º°£ÀÇ Åë½ÅÀ» À§Çؼ »ç¿ëµÇ´Â pipe¿Í °°Àº °Íµé ¿ª½Ã ÆÄÀÏ·Î
´Ù·é´Ù. ¸ðµç°ÍÀ» ÆÄÀÏ·Î ´Ù·ç°Ô µÇ¹Ç·Î½á µ¿ÀÏÇÑ ¹æ¹ýÀ» ½á¼ À̵é ÀåÄ¡¸¦ Á¦¾îÇÒ ¼ö
ÀÖ°Ô µÈ´Ù. ±âº»ÀûÀ¸·Î read, write¸¦ ÀÌ¿ëÇÏ´Â Á¤µµ·Î ÀÌµé ¸ðµç ÀåÄ¡ÀÇ ÀÔÃâ·ÂÀ»
ÇØ°áÇÒ ¼ö ÀÖ´Ù.
5.4. ÇÁ·Î±×·¥¿¡¼ ÆÄÀÏÀÇ ÀÌ¿ë À̹ø¿¡´Â ÆÄÀÏÀ» ´Ù·ç´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÀÌ ÇÁ·Î±×·¥Àº
µÎ°³ÀÇ ÆÄÀÏÀ» ÀÌ¿ëÇÑ´Ù. ÇϳªÀÇ ÆÄÀϷκÎÅÍ ¹®ÀÚ¸¦ ÀÐ¾î µéÀ̰í ÀоîµéÀÎ ¹®ÀÚ¸¦
¿µ¹® ´ë¹®ÀÚ·Î º¯°æÇÏ´Â ÀÏÀ» ÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥ÀÇ ¾Æ·¡ÀÇ ÁÖ¿ä ºÎºÐÀ¸·Î ÀÌ·ç¾îÁø´Ù.
¸Þ¸ð¸®ÀÇ ºí·°¿¡ ÀÖ´Â ¹®ÀÚµ¥ÀÌÅ͸¦ ´ë¹®ÀÚ·Î º¯°æÇÏ´Â ÇÔ¼ö¸¦ °¡Áø´Ù.
ÀÌ ÇÔ¼ö´Â µ¥ÀÌÅͰ¡ ÀÖ´Â ¸Þ¸ð¸®ºí·°ÀÇ ÁÖ¼Ò¿Í Å©±â¸¦ ÀÎÀÚ·Î ¹Þ´Â´Ù.
ÁÖ¿ä ÄÚµåÁßÀÇ Çϳª´Â ÆÄÀÏ·Î ºÎÅÍ µ¥ÀÌÅ͸¦ ¹öÆÛ·Î ÀоîµéÀÌ´Â ÄÚµåÀÌ´Ù.
ÀÌ ÄÚµå´Â ÆÄÀÏ¿¡ ´õÀÌ»ó µ¥ÀÌÅͰ¡ ¾øÀ» ¶§±îÁö ¹öÆÛ·Î ÀÐ¾î µéÀ̰í À§ÀÇ
´ë¹®ÀÚ º¯°æÇÔ¼ö¿¡ ¹öÆÛ¸¦ ÀÎÀÚ·Î ³Ñ±â°í ½ÇÇàÇØ¼ °á°ú°ªÀ» ´Ù¸¥ ÆÄÀÏ·Î
ÀúÀåÇÑ´Ù.
Á¶±Ý º¹ÀâÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Ù º¸¸é ÇÁ·Î±×·¥ Àü¿ªÀûÀ¸·Î °íÁ¤µÇ¾î¼ »ç¿ëÇØ¾ßÇÒ
¸¹Àº »ó¼ö °ªµéÀÌ ÇÊ¿äÇØÁø´Ù. ¿¹µéµé¾î ½Ã½ºÅÛ ÄݹøÈ£´Â º¯ÇÏÁö ¾Ê´Â ¼ýÀÚ·Î ±¸¼ºµÇ¾î
Àִµ¥, »ç¿ëÇÒ ¶§¸¶´Ù ¼ýÀÚ·Î ±â¾ïÇØ³»¼ ¾²´Â°Ç ¸Å¿ì ±ÍÂúÀº ÀÏÀÏ °ÍÀÌ´Ù. ÀÌ·²°æ¿ì
.equ¸¦ ÀÌ¿ëÇÑ´Ù. .equ´Â ÀÏÁ¾ÀÇ º°ÄªÀ» ¸¸µé¾îÁÖ±â À§Çؼ »ç¿ëÇÏ´Â
Áö½Ã¾î·Î CÀÇ #define°ú ºñ½ÁÇÑ ÀÏÀ» ÇÑ´Ù.
.equÀÇ ½ÇÁúÀûÀÎ »ç¿ë¿ëµµ¸¦ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
À§¿Í °°ÀÌ Çϸé Äڵ峻¿¡¼ ½Ã½ºÅÛÄÝÀ» È£ÃâÇÒ ¶§, º¸±â Èûµç 0x80´ë½Å LINUX_SYSCALLÀ»
»ç¿ëÇÒ ¼ö ÀÖ´Ù.
0x80º¸´Ù´Â ÈξÀ ÀÐ°í ±â¾ïÇØ³»±â ½±´Ù. º¹ÀâÇÑ Äڵ忡¼ .equ´Â °¡µ¶¼ºÀ» ³ôÀ̴µ¥
Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù.
´ÙÀ½Àº ½ÇÁ¦ ÀÛµ¿°¡´ÉÇÑ ¹®ÀÚº¯ÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ÆÄÀϸíÀº file.s·Î ÀúÀåÇϵµ·Ï ÇÏÀÚ.
# ÇÏ ´Â ÀÏ : ÆÄÀÏ·Î ºÎÅÍ ¹®ÀÚ¸¦ ÀоîµéÀÌ°í ´ë¹®ÀÚ·Î ¹Ù²ÛÈÄ ´Ù¸¥ ÆÄÀÏ·Î ÀúÀåÇÑ´Ù.
# ÇÁ·Î¼¼½º : 1. ÀÐÀ» ÆÄÀÏÀ» ¿¬´Ù.
# 2. ¾µ ÆÄÀÏÀ» ¿¬´Ù.
# 3. ÆÄÀÏÀÇ ³¡ÀÌ ¾Æ´Ï¶ó¸é ´ÙÀ½ÀÇ ÇÁ·Î¼¼½º¸¦ ¹Ýº¹ÇÑ´Ù.
# 1) ÆÄÀÏ·Î ºÎÅÍ ¹®ÀÚ¿À» ÀÐ¾î¼ ¸Þ¸ð¸®¿¡ ³Ö´Â´Ù.
# 2) ¸Þ¸ð¸®·Î ºÎÅÍ °¢ ¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯°æÇÑ´Ù.
# 3) º¯°æµÈ ¹®ÀÚ´Â ÆÄÀÏ·Î ÀúÀåÇÑ´Ù.
.section .data
# »ó¼öµé
.equ SYS_OPEN, 5
.equ SYS_WRITE, 4
.equ SYS_READ, 3
.equ SYS_CLOSE, 6
.equ SYS_EXIT, 1
# open()¿¡ »ç¿ëÇÒ ¿É¼Ç
# À̵鿡 ´ëÇÑ ³»¿ëÀº open()ÇÔ¼öÀÇ manÆäÀÌÁö¸¦ Âü°íÇÑ´Ù.
.equ O_RDONLY, 0
.equ O_CREAT_WRONLY_TRUNC, 03101
# Ç¥ÁØ ÆÄÀÏ ÁöÁ¤ÀÚ
.equ STDIN, 0
.equ STDOUT, 1
.equ STDERR, 2
# ½Ã½ºÅÛ ÄÝ Áß´Ü(interrupt)
.equ LINUX_SYSCALL, 0x80
.equ END_OF_FILE, 0 # ÆÄÀÏÀÇ ³¡À» °Ë»çÇϱâ À§Çؼ »ç¿ëÇÑ´Ù.
# read()ÀÇ ¸®Åϰª°ú ºñ±³ÇÑ´Ù.
.equ NUMBER_ARGUMENTS, 2
.section .bss
# ¹öÆÛ - ÆÄÀÏ·Î ºÎÅÍ µ¥ÀÌÅ͸¦ ÀоîµéÀÎ µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§ÇÑ
# ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù.
# ¹öÆÛÀÇ Å©±â´Â ¿©·¯°¡Áö ÀÌÀ¯·Î 16,000À» ÃʰúÇÒ ¼ö ¾ø´Ù.
.equ BUFFER_SIZE, 500
.lcomm BUFFER_DATA, BUFFER_SIZE
.section .text
# ½ºÅà À§Ä¡
.equ ST_SIZE_RESERVE, 8
.equ ST_FD_IN, -4
.equ ST_FD_OUT, -8
.equ ST_ARGC, 0 # ÀÎÀÚÀÇ °¹¼ö
.equ ST_ARGV_0, 4 # ÇÁ·Î±×·¥ÀÇ À̸§
.equ ST_ARGV_1, 8 # ÀоîµéÀÏ ÆÄÀÏÀÇ À̸§
.equ ST_ARGV_2, 12 # ÀúÀåÇÒ ÆÄÀÏÀÇ À̸§
.globl _start
_start:
### ÃʱâÈ °ü·Ã ###
# ½ºÅÃÆ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù.
movl %esp, %ebp
# ½ºÅÿ¡ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£À» ÇÒ´çÇÑ´Ù.
subl $ST_SIZE_RESERVE, %esp
open_files:
open_fd_in:
### ÀоîµéÀÏ ÆÄÀÏÀ» ¿¬´Ù ###
movl $SYS_OPEN, %eax # syscallÀ» ¿¬´Ù.
movl ST_ARGV_1(%ebp), %ebx # %ebx¿¡ ÆÄÀÏÀ̸§À» ³Ö´Â´Ù.
movl $O_RDONLY, %ecx # read-only Ç÷¡±×
movl $0666, %edx # ÆÄÀÏ ±ÇÇÑÀ» 0666À¸·Î ÇÑ´Ù. ´©±¸µçÁö ÀÐ°í¾µ¼ö ÀÖ´Ù.
int $LINUX_SYSCALL # ¸®´ª½º È£Ãâ
store_fd_in:
movl %eax, ST_FD_IN(%ebp) # ¸®ÅÏµÈ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇÑ´Ù.
open_fd_out:
### ÀúÀåÇÒ ÆÄÀÏ ¿±â ###
movl $SYS_OPEN, %eax # ÆÄÀÏ ¿±â
movl ST_ARGV_2(%ebp), %ebx # ¿ ÆÄÀÏÀ̸§À» ÁöÁ¤ÇÑ´Ù.
movl $O_CREAT_WRONLY_TRUNC, %ecx # ¾²±âÀ§ÇÑ Ç÷¹±×ÀÇ ¼³Á¤
movl $0666, %edx # ÆÄÀϱÇÇÑ ¼³Á¤
int $LINUX_SYSCALL # ¸®´ª½º È£Ãâ
store_fd_out:
movl %eax, ST_FD_OUT(%ebp) # ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇÑ´Ù.
### ÁÖ¿ä ·çÇÁ ½ÃÀÛ ###
read_loop_begin:
### ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÌ´Â ºÎºÐ ###
movl $SYS_READ, %eax
movl ST_FD_IN(%ebp), %ebx # ÀоîµéÀÏ ÆÄÀÏ ÁöÁ¤ÀÚ
movl $BUFFER_DATA, %ecx # ÀоîµéÀÎ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¹öÆÛ
movl $BUFFER_SIZE, %edx # ÀоîµéÀÏ Å©±â
int $LINUX_SYSCALL # ½Ã½ºÅÛÄÝÀÇ ½ÇÇà
# ¸®ÅϰªÀº %eax¿¡ ÀúÀåµÈ´Ù.
cmpl $END_OF_FILE, %eax # ÆÄÀÏÀÇ ³¡ÀÎÁö °Ë»çÇÑ´Ù.
jle end_loop # ¸¸¾à ±×·¸´Ù¸é end_loop·Î Á¡ÇÁÇÑ´Ù.
continue_read_loop:
### ÀÔ·ÂµÈ ¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯°æÇÏ´Â ºÎºÐ ###
pushl $BUFFER_DATA # ¹öÆÛÀÇ À§Ä¡
pushl %eax # ¹öÆÛÀÇ »çÀÌÁî
call convert_to_upper # ´ë¹®ÀÚ º¯°æÇÔ¼öÀÇ È£Ãâ
popl %eax
addl $4, %esp
### º¯°æµÈ ¹®ÀÚ¸¦ ÆÄÀÏ¿¡ ¾´´Ù ###
movl %eax, %edx # ¹öÆÛÀÇ Å©±â
movl $SYS_WRITE, %eax
movl ST_FD_OUT(%ebp), %ebx # ÀúÀå¿¡ »ç¿ëÇÒ ÆÄÀÏ ÁöÁ¤ÀÚ
movl $BUFFER_DATA, %ecx # ¹öÆÛÀÇ À§Ä¡
int $LINUX_SYSCALL # write()¸¦ È£ÃâÇÑ´Ù.
### ·çÇÁ¸¦ °è¼Ó¼öÇàÇÑ´Ù. ###
jmp read_loop_begin
end_loop:
### ÆÄÀÏÀ» ´Ý´Â´Ù. ###
# ¿©±â¿¡¼´Â ¿¡·¯Ã¼Å©´Â ÇÏÁö ¾Ê´Â´Ù.
movl $SYS_CLOSE, %eax
movl ST_FD_OUT(%ebp), %ebx
int $LINUX_SYSCALL
### Á¾·á ÄÚµå ###
movl $SYS_EXIT, %eax
movl $0, %ebx
int $LINUX_SYSCALL
# ÇÏ ´Â ÀÏ : ÀÌ ÇÔ¼ö´Â ¼Ò¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¯°æÇÑ´Ù.
#
.equ LOWERCASE_A, 'a'
.equ LOWERCASE_Z, 'z'
.equ UPPER_CONVERSION, 'A' - 'a'
.equ ST_BUFFER_LEN, 8
.equ ST_BUFFER, 12
convert_to_upper:
pushl %ebp
movl %esp, %ebp
movl ST_BUFFER(%ebp), %eax
movl ST_BUFFER_LEN(%ebp), %ebx
movl $0, %edi
cmpl $0, %ebx
je end_convert_loop
convert_loop:
movb (%eax, %edi, 1), %cl
cmpb $LOWERCASE_A, %cl
jl next_byte
cmpb $LOWERCASE_Z, %cl
jg next_byte
addb $UPPER_CONVERSION, %cl
movb %cl, (%eax, %edi, 1)
next_byte:
incl %edi
cmpl %edi, %ebx
jne convert_loop
end_convert_loop:
movl %ebp, %esp
popl %ebp
ret
|
À§ ÇÁ·Î±×·¥À» touuper.s ·Î ÀúÀåÇÏ°í ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÄÄÆÄÀÏ Çϵµ·Ï ÇÏÀÚ.
# as toupper.s -o toupper.o
# ld toupper.s -o toupper
|
ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà ½ÃŰ¸é ¸ðµç ¼Ò¹®ÀÚ¸¦ ´ëºÐÀÚ·Î º¯°æ½ÃŲ´Ù. ¿¹¸¦ µé¾î¼
toupper.s ¸¦ ´ë¹®ÀÚ·Î º¯È¯½Ã۰í ÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
# ./toupper toupper.s toupper.uppercase:
|
touuper.uppercase ¸¦ Àо¸é ¿ø·¡ÀÇ ÆÄÀÏÀÇ ¸ðµç ³»¿ëÀÌ ´ë¹®ÀÚ·á º¯°æµÈ°É
È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
±×·³ ÇÁ·Î±×·¥¿¡ ´ëÇØ¼ Á»´õ ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
ÇÁ·Î±×·¥ÀÇ Ã¹¹øÂ° ¼½¼ÇÀº CONSTANTS.·Î ½ÃÀÛÇÑ´Ù.
ÇÁ·Î±×·¥¿¡¼ »ó¼ö(constant)´Â ÇÁ·Î±×·¥ÀÌ ¾î¼Àºí ȤÀº ÄÄÆÄÀÏ µÉ¶§ ÇÒ´çµÇ´Â
°ªÀ¸·Î º¯°æµÉ ¼ö ¾ø´Â °ªÀÌ´Ù. »ó¼ö¸¦ ¾ðÁ¦ ÇÒ´çÇØ¼ ¾²´À³Ä´Â ÇÁ·Î±×·¡¸ÓÀÇ
ÃëÇâ¿¡ µû¶ó ´Þ¶óÁú ¼ö ÀÖÁö¸¸, ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ °¡Àå óÀ½¿¡ µÎ´Â °ÍÀ»
¿øÄ¢À¸·Î ÇÑ´Ù. ÇÁ·Î±×·¥ Àü¿ªÀûÀ¸·Î ¿µÇâÀ» ¹ÌÄ£´Ù´Â »ó¼öÀÇ Æ¯Á¤»ó
½±°Ô È®ÀÎ °¡´ÉÇÑ À§Ä¡¿¡ µÎ´Â°Ô °ü¸®Çϱ⿡ ÁÁ±â ¶§¹®ÀÌ´Ù. À§ÀÇ ÇÁ·Î±×·¥¿¡¼´Â
ÆÄÀÏ ÁöÁ¤ÀÚ¿Í ÀÎÀÚÁ¢±Ù, ¹öÆÛÅ©±â, ½Ã½ºÅÛÄÝ ¹øÈ£ µî °áÄÚ ¹Ù²îÁö ¾Ê´Â ¸ðµç
°ªµéÀ» »ó¼ö·Î ¼±¾ðÇØ¼ »ç¿ëÇϰí ÀÖ´Ù.
¾î¼Àºí¸®¾î¿¡¼ »ó¼öÀÇ ¼±¾ðÀº .equ¸¦ ÀÌ¿ëÇÑ´Ù.
C/C++ÀÇ #define ¹®À̶ó°í º¼ ¼ö ÀÖ´Ù. »ó¼öÀÇ À̸§À» ¾Õ¿¡ ¾²°í ±×´ÙÀ½
°ªÀ» ¾²¸é µÈ´Ù.
´ÙÀ½Àº BUFFERS. ¼½¼ÇÀ¸·Î ÇÁ·Î±×·¥ÀÇ ¹öÆÛ¿Í °ü·ÃÇØ¼
»ç¿ëÇÑ´Ù. ¿©±â¿¡¼µµ ¹öÆÛÀÇ Å©±â´Â BUFFER_SIZE. »ó¼ö·Î Á¤ÀÇÇØ¼ »ç¿ëÇϰí
ÀÖ´Ù. ¸¸¾à ¹öÆÛÀÇ Å©±â¸¦ ¹Ù²Ù°í ½Í´Ù¸é BUFFER_SIZE. »ó¼öÀÇ °ª¸¸ º¯°æÇØ
ÁÖ¸é µÈ´Ù. ¹öÆÛÀÇ À̸§Àº BUFFER_DATA ·Î Çß´Ù. ¿©±â¿¡¼ »ó¼ö¸¦ »ç¿ëÇÏ¸é¼ ¾ò
À» ¼ö ÀÖ´Â ÀÕÁ¡ÀÌ Çϳª ³ª¿Ô´Âµ¥. ƯÁ¤ °ªÀ» ÀϰüµÇ°Ô °ü¸®ÇÒ ¼ö ÀÖ´Ù´Â
Á¡ÀÌ´Ù. ¸¸¾à »ó¼ö¸¦ »ç¿ëÇÏÁö ¾Ê¾Ò´Ù¸é ¹öÆÛÀÇ Å©±â¸¦ ¹Ù²Ü ¶§ ÀÏÀÏÀÌ
¹öÆÛÀÇ Å©±â¸¦ ã¾Æ¼ ¹Ù²ãÁà¾ß ÇÒ°ÍÀÌ´Ù. ±×¸¸Å ½Ç¼ö¸¦ È®·üµµ ¸¹Àºµ¥ »ó¼öÀÇ
»ç¿ëÀº ÀÌ·¯ÇÑ ½Ç¼öµµ ÁÙ¿©ÁØ´Ù.
´ÙÀ½Àº _start. ¼½¼ÇÀε¥, ¿ì¼±Àº ÄÚµåÀÇ ¸¶Áö¸·¿¡ ÀÖ´Â convert_to_upperÁ¤ÀǸ¦
¸ÕÀú º¸µµ·Ï ÇÏÀÚ. ¿©±â´Â ½ÇÁ¦·Î ¹®ÀÚÀÇ º¯°æÀ» À§ÇØ »ç¿ëµÇ´Â ÄÚµå ¿µ¿ªÀÌ´Ù.
¿ª½Ã ÇÔ¼öÀÇ Ã³À½Àº ÇÔ¼ö³»¿¡¼ »ç¿ëµÉ °¢Á¾ »ó¼ö¸¦ Á¤ÀÇÇÏ´Â Äڵ尡
µé¾î°¡ ÀÖ´Ù.
.equ LOWERCASE_A, 'a' # a¿Í z´Â ¼Ò¹®ÀÚÀÎÁö üũÇϱâ À§ÇÑ
.equ LOWERCASE_Z, 'z' # ¿ëµµ·Î »ç¿ëµÈ´Ù.
.equ UPPER_CONVERSION, 'A' - 'a' # ´ë¹®ÀÚ¿Í ¼Ò¹®ÀÚ°£ÀÇ Å©±â±³Á¤À» À§ÇÑ ¿ëµµ
|
À§ÀÇ µÎ°³ÀÇ Á¤ÀÇ´Â º¯È¯ÇÒ ¿µ¹®ÀÌ ¼Ò¹®ÀÚÀÎÁö¸¦ üũÇϱâ À§ÇÑ ¿ëµµ·Î »ç¿ëÇÑ´Ù.
ASCII(12) Å×ÀÌºí¿¡¼ ¹®ÀÚ 'a'¿Í 'z'°¡ ¿¬¼ÓÀûÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù´Â °Í¿¡ Âø¾ÈÇÑ
ÄÚµå´Ù. ¸¸¾à¿¡ ¿ì¸®°¡ ¹Þ¾ÆµéÀÎ ¹®ÀÚ°¡ ¼Ò¹®ÀÚ¶ó¸é ´ë¹®ÀÚ·Î º¯°æ½ÃÄÑÁà¾ß
Çϴµ¥, ´ë¹®ÀÚ·Î º¯°æÇϱâ À§Çؼ´Â 'A'¿¡¼ 'a'ÀÇ Â÷ÀÌ ¸¸Å¸¸ ´õÇØÁÖ¸é µÈ´Ù.
´ÙÀ½ÀÇ CÄڵ带 È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù.
#include <stdio.h>
int main()
{
printf("%d\n", 'A' - 'a');
printf("%c\n", 'a' + ('A' - 'a'));
return 0;
}
|
´ÙÀ½ ¶óÀÎÀº ½ºÅÃÀÇ À§Ä¡¸¦ °¡¸®Å°±â À§ÇÑ ¸î°³ÀÇ »ó¼ö¸¦ ¼±¾ðÇϰí ÀÖ´Ù.
ÀÌ´Â ÇÔ¼ö¿¡¼ ÀÎÀÚ¸¦ »ç¿ëÇϱâ À§Çؼ´Â ÇÔ¼ö È£ÃâÀü ½ºÅÿ¡ ÀÎÀÚ¸¦ ¹Ð¾î ³Ö´Âµ¥,
ÇÔ¼ö³»¿¡¼´Â ÀÌ ½ºÅÃÀÇ À§Ä¡¸¦ ÀÌ¿ëÇØ¼ ÀÎÀÚÀÇ °ªÀ» ¾ò¾î¿Ã ¼ö Àֱ⠶§¹®ÀÌ´Ù.
Çϱ⠶§¹®ÀÌ´Ù. ÀÌµé »ó¼ö´Â Á¢µÎ»ç¸¦ ST·Î Çϰí Àִµ¥, ¸®ÅÏ ÁÖ¼Ò´Â 4,
¹öÆÛÀÇ ±æÀÌ´Â 8, ±×¸®°í ¹öÆÛÀÇ ÁÖ¼Ò´Â 12·Î °áÁ¤Çß´Ù. ÀÌ·¸°Ô Á¤ÀÇÇØ ³õÀº
½ºÅÃÁÖ¼ÒÀÇ »ç¿ë¿ëµµ´Â convert_to_upper: À» º¸¸é Á»´õ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ»
°ÍÀÌ´Ù.
movl ST_BUFFER(%ebp), %eax
movl ST_BUFFER_LEN(%ebp), %ebx
|
À§ÄÚµå´Â ÇÔ¼öÀÇ ÀÎÀÚÀÇ °ªÀ» ½ºÅÿ¡¼ ÀоîµéÀÌ´Â ÀÏÀ» ÇÑ´Ù. ±×´ÙÀ½ %edi¿¡ 0À»
º¹»çÇÑ´Ù. %edi´Â ¹öÆÛÀÇ À§Ä¡¸¦ °¡¸®Å°´Â ÀÌÅÍ·¹ÀÌÅͿ뵵·Î »ç¿ëµÈ´Ù.
¹öÆÛÀÇ À§Ä¡´Â %eax + %edi ·Î °è»êÇÑ´Ù(À̸¦Å×¸é ¹è¿¿¡¼ ÷ÀÚ¸¦ Áõ°¡½ÃÄѼ
À§Ä¡¸¦ °¡Á®¿À´Â ¹æ½ÄÀÌ´Ù)
¸¸¾à¿¡ %ebx Áï ¹öÆÛ¿¡ ÀÖ´Â µ¥ÀÌÅÍÀÇ ±æÀ̰¡ 0À̶ó¸é ·çÇÁ¸¦ Á¾·á½ÃŲ´Ù.
cmpl $0, %ebx
je end_convert_loop
|
±×·¸Áö ¾Ê°í µ¥ÀÌÅÍÀÇ ±æÀ̰¡ 0º¸´Ù Å©´Ù¸é convert_loop:¸¦ µ¹¸é¼ ¹®ÀÚ º¯È¯
ÀÛ¾÷À» ¼öÇàÇÑ´Ù.
movb (%eax, %edi, 1), %cl
cmpb $LOWERCASE_A, %cl
jl next_byte
cmpb $LOWERCASE_Z, %cl
jg next_byte
|
¿©±â¿¡´Â movb, cmpb ¸í·ÉÀÌ »ç¿ëµÇ°íÀÖ´Ù. µÚ¿¡ b°¡ ºÙ¾ú´Âµ¥, ÀÌ´Â ¹ÙÀÌÆ®
´ÜÀ§·Î ¿¬»êÀ» ½Ç½ÃÇ϶ó´Â ¶æÀÌ µÇ°Ú´Ù. %eax·Î ºÎÅÍ %edi ¸¸Å À̵¿ÇÑÈÄ
1¹ÙÀÌÆ®¸¦ %cl·Î º¹»çÇÑ´Ù. ±×ÈÄ %clÀÌ ¼Ò¹®ÀÚ¸é ´ë¹®ÀÚ·Î º¯°æÇÏ°Ô µÈ´Ù.
ÀÌ·¸°Ô ÇØ¼ ¹®ÀÚº¯°æ°ú °ü·ÃµÈ ÄÚµå´Â ¸ðµÎ ÀÌÇØÇÏ°Ô µÇ¾ú´Ù. ÀÌÁ¦ ³²Àº °ÍÀº
ÆÄÀÏ·Î ºÎÅÍ ÀоîµéÀÌ°í ¾²´Â ºÎºÐÀÌ´Ù. À̺κÐÀ» ´Ù·ç±â À§Çؼ´Â
UNIXÀÇ open() ½Ã½ºÅÛÄÝÀ» ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ¾Ë¾Æ¾ß ÇÑ´Ù. ´ÙÀ½Àº open()
½Ã½ºÅÛÄÝÀ» »ç¿ëÇϱâ À§ÇÑ ½Ã½ºÅÛ ÄݹøÈ£¿Í ÀÎÀÚ¸¦ À§ÇÑ ·¹Áö½ºÅ͵é ÀÌ´Ù.
%eax ´Â ½Ã½ºÅÛ ÄÝ ¹øÈ£¸¦ ÀúÀåÇÑ´Ù. openÀÇ ½Ã½ºÅÛ ÄݹøÈ£´Â 5ÀÌ´Ù.
%ebx ¿¡´Â ¿°íÀÚ ÇÏ´Â ÆÄÀÏÀÇ À̸§ÀÌ µé¾î°£´Ù. ÆÄÀÏÀ̸§Àº ¹Ýµå½Ã
³¡ÀÌ null·Î ³¡³ª´Â ¹®ÀÚ¿À̾î¾ß ÇÑ´Ù.
%ecx ¿¡´Â ÆÄÀÏÀ» ¿¶§ »ç¿ëÇÒ ¿É¼ÇÀÌ µé¾î°£´Ù. Àбâ Àü¿ë, ¾²±âÀü¿ë,
Àбâ/¾²±âÁß ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì ÆÄÀÏÀ»
»ý¼ºÇÒ°ÍÀÎÁö, Á¸ÀçÇÒ °æ¿ì¿¡´Â Á¸ÀçÇÏ´Â ÆÄÀÏÀ» ¿°ÇÁö ¾Æ´Ï¸é
¿¡·¯¸¦ ¸®ÅÏÇÒ °ÇÁö µîµµ °áÁ¤ÇÒ ¼ö ÀÖ´Ù.
%edx ´Â ÆÄÀÏÀÇ ±ÇÇÑÀ» ¼³Á¤Çϱâ À§ÇØ »ç¿ëÇÑ´Ù. ¿©±â¿¡´Â ÀϹÝÀûÀÎ
À¯´Ð½º ±ÇÇÑÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÀÌ ½Ã½ºÅÛ ÄÝÀÌ ½ÇÇà ÈÄ, ¿ì¸®´Â Àбâ Àü¿ëÀÇ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ
ÆÄÀÏ ÁöÁ¤ÀÚ´Â %eax¸¦ ÅëÇØ¼ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
±×·³ ÀÌÁ¦ ÆÄÀÏÀ» ¿¾î¾ß ÇҰǵ¥, ÀÌ ÇÁ·Î±×·¥ÀÇ °æ¿ì ¿¾î¾ßµÉ ÆÄÀÏ À̸§À»
ÇÁ·Î±×·¥ ½ÇÇàÀÎÀÚ·Î ³Ñ°Ü ¹Þ°í ÀÖ´Ù. ´ÙÇེ·´°Ôµµ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀÎÀÚ´Â
½±°Ô ÀоîµéÀÏ ¼ö ÀÖ´Â À§Ä¡¿¡ null-terminate 󸮱îÁö ¸¶Ä£ ±ò²ûÇÑ »óÅ·Î
ÀúÀåµÇ¾î ÀÖ´Ù. ¸®´ª½º¿¡¼ ÇÁ·Î±×·¥ÀÌ ½ÇÇàÀÎÀÚÀÇ ÀúÀåµÈ À§Ä¡¸¦ °¡¸®Å°´Â
Æ÷ÀÎÅÍ´Â ½ºÅÿ¡ ÀúÀåÀÌ µÈ´Ù. ÀÎÀÚÀÇ ¼ö°¡ ÀúÀåµÈ Æ÷ÀÎÅÍÀÇ À§Ä¡´Â 8(%esp)¿¡
ÇÁ·Î±×·¥ÀÇ À§Ä¡´Â 12(%esp) ±×¸®°í ½ÇÁ¦ ÀÎÀÚ´Â 16(%esp)¿¡ ÀúÀåµÈ´Ù.
C ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ °æ¿ì¿¡´Â argv ¹è¿ °ªÀ» ÅëÇØ¼ ¾ò¾î¿À°Ô µÈ´Ù.
¿ì¸®ÀÇ Ã¹¹øÂ° ÇÁ·Î±×·¥¿¡¼ ÃÖ±ÙÀÇ ½ºÅà À§Ä¡´Â %ebp¿¡ ÀúÀåÇϵµ·Ï Çß´Ù. ±×¸®°í
ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ ½ºÅðø°£À» ÇÒ´çÇϰí ÀÖ´Ù. ³ªÁß¿¡ ¿©±â¿¡
¿¸°ÆÄÀÏ ÁöÁ¤ÀÚ°¡ µé¾î°¡°Ô µÈ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ¿ì¼± ù¹øÂ° ½ÇÇàÀÎÀÚ¸¦ ¾ò¾î¿Â´Ù. ÀÌ ½ÇÇàÀÎÀÚ´Â ¿ì¸®°¡ ÀоîµéÀ̱â
À§ÇÑ ¿øº» ÆÄÀÏÀÇ À̸§À̵ȴÙ. ¿øº» ÆÄÀÏÀÇ °æ¿ì¿¡´Â ´ÜÁö Àб⸸ ÇÏ¸é µÇ¹Ç·Î
Àбâ Àü¿ëÀ¸·Î ¿¾ú´Ù. ÆÄÀÏÀÇ ±ÇÇÑÀº $0666·Î %edx¸¦ ¸¦ ÅëÇØ¼ ³Ñ°å´Ù. ±× ÈÄ
%eax¿¡ ½Ã½ºÅÛÄÝÀÇ ¹øÈ£¸¦ ÀúÀåÇÏ°í ½Ã½ºÅÛÄÝÀ» ½ÇÇàÇÑ´Ù. ½ÇÇàÀÌ ¼º°øÀûÀ¸·Î
³¡³ª°Ô µÇ¸é, ¿ì¸®´Â ½ºÅÿ¡ ÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚ¸¦ ÀÐ¾î ¿Ã ¼ö ÀÖ°Ô µÈ´Ù.
Áö±Ý±îÁö¿Í °°Àº ¹æ¹ýÀ¸·Î º¹»çµÉ ÆÄÀÏ À̸§À» ¾²±â Àü¿ëÀ¸·Î ¿¬´Ù.
ÀÌÁ¦ ÆÄÀÏÀ» Àаí/¾²´Â ÁÖ¿ä ºÎºÐ¿¡ ´ëÇØ¼ ¾Ë¾Æº¸ÀÚ. ¿ì¸®´Â ÀÔ·ÂµÈ ÆÄÀÏ·Î ºÎÅÍ
°íÁ¤µÈ Å©±âÀÇ µ¥ÀÌÅ͸¦ Àоî¿À°í, À̰ÍÀ» ´ë/¼Ò¹®ÀÚ º¯È¯ ÇÔ¼ö¿¡ ³Ñ±ä ÈÄ,
±× °á°ú °ªÀ» Ãâ·Â ÆÄÀÏ¿¡ ¾²°Ô µÈ´Ù. ´ë/¼Ò¹®ÀÚ º¯È¯Àº ¹®ÀÚÇϳªÇϳª¸¦ Â÷·Ê´ë·Î
°Ë»çÇØ¼ º¯È¯ÇÏ°Ô µÈ´Ù.
µ¥ÀÌÅ͸¦ Àбâ À§Çؼ ¿ì¸®´Â read ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇϰí ÀÖ´Ù. ÀÌ ½Ã½ºÅÛ ÄÝÀº
ÆÄÀÏ ÁöÁ¤ÀÚ·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àоîµé¿©¼ ¹öÆÛ¿¡ ÁöÁ¤µÈ Å©±â¸¸Å º¹»çÇÑ´Ù.
ÀÌ ½Ã½ºÅÛÄÝÀº ½ÇÇàÀ» ¸¶Ä£ÈÄ ÀоîµéÀÎ µ¥ÀÌÅÍÀÇ Å©±â¸¦ ¸®ÅÏÇÑ´Ù. ¸¸¾à
ÆÄÀÏÀÇ ³¡À» ¸¸³ª°Ô µÇ¸é 0À» ¸®ÅÏÇÑ´Ù.
Àбâ Äڵ念¿ªÀº %eaxÀÇ °ªÀÌ ÆÄÀÏÀÇ ³¡(0)À» °¡¸®Å°°Ô µÇ¸é ºüÁ®³ª¿À°Ô µÈ´Ù.
¸¸¾à ÆÄÀÏÀÇ ³¡ÀÌ ¾Æ´Ï¶ó¸é ÀоîµéÀÎ µ¥ÀÌÅ͸¦ convert_to_upperÇÔ¼ö·Î ³Ñ°Ü¼
¹®ÀÚ¸¦ º¯È¯ÇÏ°Ô µÈ´Ù.
¸¶Áö¸·À¸·Î write ½Ã½ºÅÛÄÝÀ» ÀÌ¿ëÇØ¼ º¯È¯µÈ ¹®ÀÚµ¥ÀÌÅ͸¦ º¹»çÇÒ ÆÄÀÏ¿¡ ¾²°Ô
µÈ´Ù. ¸ðµç µ¥ÀÌÅÍÀÇ Ã³¸®°¡ ´Ù ³¡³ª°í ·çÇÁ¸¦ ¹þ¾î³ª¸é ¸¶Áö¸·À¸·Î ¿¸°
ÆÄÀÏ ÁöÁ¤ÀÚµéÀ» ¸ðµÎ ´Ý¾ÆÁØ´Ù. ÆÄÀÏÀ» ´Ý±â À§Çؼ´Â close½Ã½ºÅÛÄÝ È£ÃâÇÑ´Ù.
ÀÌ ½Ã½ºÅÛ ÄÝÀº %ebx¿¡ ´ÝÀ» ÆÄÀÏÁöÁ¤ÀÚ¸¦ ³Ñ±ä´ÙÀ½ È£ÃâÇÏ¸é µÈ´Ù.
5.5. º¹½À ¹öÆÛ¶õ ¹«¾ùÀΰ¡ ?
Ç¥ÁØ ÆÄÀÏ ÁöÁ¤ÀÚ´Â ¹«¾ùÀ̸ç, ¾îµð¿¡ »ç¿ëÇÒ ¼ö Àִ°¡ ?
.data ¼½¼Ç°ú .bss ¼½¼ÇÀÇ Â÷ÀÌ´Â ¹«¾ùÀΰ¡ .
ÆÄÀÏ·Î ºÎÅÍ ÀÐ°í ¾²±â À§Çؼ »ç¿ëÇÏ´Â ½Ã½ºÅÛÄÝ¿¡ ´ëÇØ¼ ¼³¸íÇϽÿÀ.
|
|