FreeBSD Assembly Language Programming

 

Preface

ÀúÀÚ : G. Adam Stanislav

Whiz Kid Technomagic

 

¿ªÀÚ : ÃÖÁøÈñ

jhchoi@os.korea.ac.kr

 

 À¯´Ð½º(unix) ȯ°æ¿¡¼­ÀÇ ¾î¼Àºí¸® ¾ð¾î ÇÁ·Î±×·¡¹Ö(assembly language programming)Àº °ÅÀÇ ¹®¼­È­µÇÁö ¾Ê¾Ò´Ù. ÀÌ°ÍÀº ¸¹Àº »ç¶÷µéÀÌ ¿©·¯ À¯´Ð½º ½Ã½ºÅÛÀÌ ¼­·Î ´Ù¸¥ ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­(microprocessor)¸¦ ±â¹ÝÀ¸·Î µ¿ÀÛÇÏ°í Àֱ⠶§¹®¿¡ À̽ļº(portability)À» À§Çؼ­¶ó¸é °ÅÀÇ ¸ðµç Äڵ带 C·Î ½á¾ß ÇÑ´Ù°í »ý°¢ÇØ ¿Ô±â ¶§¹®ÀÌ´Ù.

 

 ½ÇÁ¦·Î´Â C Á¶Â÷ ¿Ïº®ÇÑ À̽ļºÀ» Á¦°øÇÏÁö ¸øÇϱ⠶§¹®¿¡ ÇϳªÀÇ À¯´Ð½º¿¡¼­ ´Ù¸¥ Á¾·ùÀÇ À¯´Ð½º·Î Æ÷ÆÃ(porting)ÇÒ ¶§ ´ëºÎºÐÀÇ C ÇÁ·Î±×·¥Àº ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ·± ÇÁ·Î±×·¥Àº ÄÄÆÄÀÏµÈ ½Ã½ºÅÛ¿¡ ÀÇÁ¸ÀûÀÎ Á¶°Ç¹®(conditional statements)À» ÀÜ¶à »ç¿ëÇÑ °æ¿ì°¡ ¸¹´Ù.

 

 ¸ðµç À¯´Ð½º ¼ÒÇÁÆ®¿þ¾î°¡ C³ª ±× ¹ÛÀÇ °í¼öÁØ ¾ð¾î(high level language)·Î ¾º¿©Á®¾ß ÇÑ´Ù°í ¹Ï°í ÀÖ´Ù ÇÒÁö¶óµµ ¾î¼Àºí¸® ÇÁ·Î±×·¡¸Ó´Â ¿©ÀüÈ÷ ÇÊ¿äÇÏ´Ù. ¾î¼Àºí¸® ÇÁ·Î±×·¡¸Ó°¡ ¾ø´Ù¸é C ¶óÀ̺귯¸®(library)¿¡¼­ Ä¿³Î¿¡ Á¢±ÙÇÏ´Â ºÎºÐÀ» ´©°¡ ¾µ °ÍÀΰ¡?

 

 ÀÌ Æ©Å丮¾ó(tutorial)¿¡¼­ ÇÊÀÚ´Â ¾î¼Àºí¸® ¾ð¾î¸¦ ÀÌ¿ëÇÏ¿© À¯´Ð½º ÇÁ·Î±×·¥- ƯÈ÷ FreeBSD -À» ¾²´Â ¹æ¹ýÀ» °£´ÜÈ÷ ¼³¸íÇÒ °ÍÀÌ´Ù. ÇÊÀÚ´Â ÀÌ ¹®¼­°¡ ¾ðÁ¨°¡´Â FreeBSD ¾î¼Àºí¸® ¾ð¾îÀÇ ¿Ïº®ÇÑ °¡À̵尡 µÉ ¼ö Àֱ⸦ ±â¿øÇÑ´Ù.

 

 ÀÌ Æ©Å丮¾óÀº ¾î¼Àºí¸® ¾ð¾îÀÇ ±âº» ³»¿ëÀ» ¼³¸íÇÏÁø ¾Ê´Â´Ù. ÀÌ·¯ÇÑ ±âº» ³»¿ëÀ» ¼³¸íÇÑ ¼ö¸¹Àº ÀÚ·áµéÀÌ ÀÖÀ¸´Ï ÂüÁ¶Çϱ⠹ٶõ´Ù.(¾î¼Àºí¸® ¾ð¾î¸¦ ¿Ïº®ÇÏ°Ô ¼³¸íÇÑ ¿Â¶óÀÎ °¡À̵带 ¾ò°í ½Í´Ù¸é Randall HydeÀÇ Art of Assembly Language¸¦ ÃßõÇϸç, ÀμâµÈ Ã¥À» ¿øÇÑ´Ù¸é Jeff DuntemannÀÇ Assembly Language Step-by-StepÀ» ÃßõÇÑ´Ù.) ¾î·µç ÀÏ´Ü ÀÌ Æ©Å丮¾óÀ» ³¡±îÁö ÀÐÀº ÈÄ¿¡´Â ´ëºÎºÐÀÇ ¾î¼Àºí¸® ÇÁ·Î±×·¡¸Ó°¡ ºü¸£°í È¿À²ÀûÀÎ FreeBSD ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ±¸¼ºÇß´Ù.

 

Chapter 1 – The Tools

1.1. The Assembler

 ¾î¼Àºí¸® ¾ð¾î ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§ °¡Àå Áß¿äÇÑ µµ±¸´Â ¾î¼Àºí·¯, Áï ¾î¼Àºí¸® ¾ð¾î Äڵ带 ±â°è¾î(machine language)·Î º¯È¯ÇØ ÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù.

 

 FreeBSD¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¾î¼Àºí·¯·Î´Â Å©°Ô µÎ °¡Áö Á¾·ùÀÇ °ÍÀÌ ÀÖ´Ù. ±× Áß Çϳª´Â as (1)Àε¥, ÀüÅëÀûÀÎ À¯´Ð½º ¾î¼Àºí¸® ¾ð¾îÀÇ ¹®¹ýÀ» µû¸£°í ÀÖÀ¸¸ç ÀϹÝÀûÀ¸·Î ½Ã½ºÅÛ¿¡ ±âº» žÀçµÇ¾î ÀÖ´Ù.

 

 ´Ù¸¥ Çϳª´Â /usr/ports/devel/nasmÀÌ´Ù. ÀÌ°ÍÀº ÀÎÅÚ(Intel)ÀÇ ¹®¹ýÀ» µû¸£´Âµ¥, ¿©·¯ ¿î¿µ üÁ¦¸¦ À§ÇÑ ¾î¼Àºí¸® Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù´Â Å« ÀåÁ¡ÀÌ ÀÖ´Ù. ÀÌ ¾î¼Àºí·¯´Â º°µµ·Î ¼³Ä¡ÇØ¾ß ÇÏÁö¸¸ °ø°³ ¼ÒÇÁÆ®¿þ¾îÀ̱⠰ÆÁ¤ÇÒ °ÍÀº ¾ø´Ù.

 

 ÀÌ Æ©Å丮¾óÀº nasmÀÇ ¹®¹ýÀ» »ç¿ëÇϴµ¥, ÀÌ´Â ´Ù¸¥ ¿î¿µÃ¼Á¦ ȯ°æ¿¡¼­ ¾î¼Àºí¸® ¾ð¾î¸¦ »ç¿ëÇÏ´ø ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¸ÓµéÀÌ ÀÌÇØÇϱ⠽±µµ·Ï Çϱâ À§ÇÑ ¹è·ÁÀÌ´Ù. ¶Ç, ¼ÖÁ÷È÷ ¸»ÇÏÀÚ¸é ÇÊÀÚ°¡ »ç¿ëÇÏ°í ÀÖ´Â ¾î¼Àºí·¯À̱⠶§¹®À̱⵵ ÇÏ´Ù.

 

1.2. The Linker

 ´ëºÎºÐÀÇ ÄÄÆÄÀÏ·¯¿Í ¸¶Âù°¡Áö·Î ¾î¼Àºí·¯ÀÇ °á°ú¹°(output)Àº ½ÇÇà °¡´ÉÇÑ ÆÄÀÏ·Î ¸µÅ©(link)µÉ ÇÊ¿ä°¡ ÀÖ´Ù. Ç¥ÁØ ld (1) ¸µÄ¿(linker)´Â FreeBSD¿¡ žÀçµÇ¾î Àִµ¥, ¾î¶² ¾î¼Àºí·¯¿¡ ÀÇÇؼ­ ¸¸µé¾îÁø ÄÚµå¶óµµ ½ÇÇà ÆÄÀÏ·Î ¸¸µé¾î ÁØ´Ù.

 

Chapter 2 – System Calls

2.1. Default Calling Convention

 FreeBSD´Â ±âº»ÀûÀ¸·Î CÀÇ È£Ãâ ¹æ½Ä(calling convention)À» »ç¿ëÇÑ´Ù. °Ô´Ù°¡ Ä¿³ÎÀÌ int 80h¸¦ »ç¿ëÇÏ¿© Á¢±ÙµÇ¾ú´Ù ÇÒÁö¶óµµ, Ä¿³ÎÀº ÇÁ·Î±×·¥ int 80h¸¦ ¹Ù·Î »ç¿ëÇÑ °ÍÀÌ ¾Æ´Ï¶ó int 80h¸¦ »ç¿ëÇÏ´Â ÇÔ¼ö¸¦ È£ÃâÇß´Ù°í °¡Á¤ÇÑ´Ù.

 

 ÀÌ·¯ÇÑ °ü·Ê´Â ¹è¿ì Æí¸®Çϸç MS DOS¿¡¼­ »ç¿ëµÈ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®(Microsoft)ÀÇ °ü·Ê¿¡ ºñÇØ ¿ì¿ùÇÑ Á¡ÀÌ ¸¹´Ù. ÀÌ·¸°Ô ¸»ÇÒ ¼ö ÀÖ´Â ´ëÇ¥ÀûÀÎ ±Ù°Å´Â À¯´Ð½º¿¡¼­ »ç¿ëÇÏ´Â °ü·Ê¿¡ µû¸£¸é ¾î¶² ¾ð¾î·Î ÀÛ¼ºµÈ ÇÁ·Î±×·¥ÀÌ¶óµµ Ä¿³Î¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.

 

 ´ç¿¬ÇÑ ¸»ÀÌÁö¸¸ ¾î¼Àºí¸® ¾ð¾î·Î ÀÛ¼ºµÈ ÇÁ·Î±×·¥µµ Ä¿³Î¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. °¡·É, ´ÙÀ½°ú °°ÀÌ ÆÄÀÏÀ» ¿­ ¼ö ÀÖ´Ù.

 

             kernel:

                          int 80h       ; Call kernel

                          ret

 

             open:

                          push dword mode

                          push dword flags

                          push dword path

                          mov eax, 5

                          call kernel

                          add esp, byte 12

                          ret

 

 ÀÌ ÄÚµå´Â ¸Å¿ì °£°áÇϸç À̽ÄÇϱ⵵ ½±°Ô ÀÛ¼ºµÇ¾ú´Ù. ¸¸¾à ¾î¶² Äڵ带 ´Ù¸¥ ÀÎÅÍ·´Æ®¸¦ »ç¿ëÇϰųª ¸Å°³ º¯¼ö(parameter)¸¦ ´Ù¸¥ ¹æ½ÄÀ¸·Î ³Ñ±â´Â À¯´Ð½º ½Ã½ºÅÛÀ¸·Î Æ÷ÆÃÇÑ´Ù¸é kernel ÇÁ·Î½ÃÁ®(precedure)¸¸ ´Ù½Ã ÀÛ¼ºÇÏ¸é µÈ´Ù.

 

 ÇÏÁö¸¸ ¾î¼Àºí¸® ÇÁ·Î±×·¡¸Ó´Â CPU ÁÖ±â(cycle)À» ÃÖ´ëÇÑ ÁÙÀÌ°í ½Í¾îÇÏ´Â °æÇâÀÌ ÀÖ´Ù. À§ÀÇ ¿¹´Â call/ret Á¶ÇÕ(combination)ÀÌ »ç¿ëµÇ¾ú´Âµ¥, dword¸¦ Ǫ½Ã(push)ÇÏ´Â ¸í·É¾î(instruction) Çϳª¸é ÀÌ Äڵ带 Á¦°ÅÇÒ ¼ö ÀÖ´Ù.

 

             open:

                          push dword mode

                          push dword flags

                          push dword path

                          mov eax, 5

                          push eax        ; Or any other dword

                          int 80h

                          add esp, byte 16

 

EAX¿¡ ÀúÀåµÇ´Â 5´Â openÀ̶ó´Â Ä¿³Î ÇÔ¼öÀÇ ½Äº°ÀÚ(identifier)ÀÌ´Ù.

 

2.2. Alternate Calling Convention

 FreeBSD´Â ¾ÆÁÖ À¶Å뼺 ÀÖ´Â ½Ã½ºÅÛÀÌ´Ù. ÀÌ ¿î¿µÃ¼Á¦´Â Ä¿³ÎÀ» È£ÃâÇÒ ¼ö ÀÖ´Â ´Ù¸¥ ¹æ¹ýµµ Á¦°øÇÑ´Ù. ÇÏÁö¸¸ ÀÌ·¯ÇÑ È£Ãâ ¹æ½ÄÀÌ Á¦´ë·Î µ¿ÀÛÇÏ·Á¸é ¸®´ª½º(Linux) ¾Ö¹Ä·¹À̼Ç(emulation)ÀÌ ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.

 

 ¸®´ª½º´Â À¯´Ð½º °è¿­ÀÇ ½Ã½ºÅÛ Áß ÇϳªÁö¸¸ Ä¿³ÎÀº ·¹Áö½ºÅÍ¿¡ ¸Å°³ º¯¼ö¸¦ ³Ñ±â´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ ½Ã½ºÅÛ ÄÝ(call) °ü·Ê¸¦ µû¸£°í ÀÖ´Ù. ÇÔ¼öÀÇ ¹øÈ£°¡ EAX ·¹Áö½ºÅÍ¿¡ ÀúÀåµÈ´Ù´Â °ÍÀº À¯´Ð½ºÀÇ È£Ãâ °ü·Ê¿Í °°´Ù. ÇÏÁö¸¸ ¸Å°³ º¯¼ö´Â ½ºÅÿ¡ ³Ñ°ÜÁö´Â °ÍÀÌ ¾Æ´Ï¶ó EBX, ECX, EDX, ESI, EDI, EBP ·¹Áö½ºÅÍ¿¡ ³Ñ°ÜÁø´Ù.

 

             open:

                          mov eax, 5

                          mov ebx, path

                          mov ecx, flags

                          mov edx, mode

                          int 80h

 

 ÀÌ °ü·Ê´Â À¯´Ð½ºÀÇ °ü·Ê¿¡ ºñÇØ Ä¿´Ù¶õ ´ÜÁ¡ÀÌ ÀÖ´Ù. Áï, ÇÁ·Î±×·¡¸Ó´Â Ä¿³ÎÀÇ ±â´ÉÀ» ÀÌ¿äÇÒ ¶§¸¶´Ù ·¹Áö½ºÅ͵éÀ» ½ºÅÿ¡ Ǫ½ÃÇÏ°í ¿äû ÀÛ¾÷ÀÌ ³¡³ª¸é ´Ù½Ã ÆË(pop)ÇØ¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ´ÜÁ¡Àº Äڵ带 Å©°í ´À¸®°Ô ¸¸µç´Ù. ±×·³¿¡µµ ºÒ±¸ÇÏ°í FreeBSD´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô ¼±ÅñÇÀ» ÁÖ°í ÀÖ´Ù.

 

 ¸¸¾à ÇÁ·Î±×·¡¸Ó°¡ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®/¸®´ª½º È£Ãâ °ü·Ê¸¦ ¼±ÅÃÇÑ´Ù¸é ½Ã½ºÅÛ¿¡°Ô ÀÌ È£Ãâ °ü·Ê¸¦ »ç¿ëÇÑ´Ù´Â »ç½ÇÀ» Å뺸ÇØ ÁÖ¾î¾ß ÇÑ´Ù. Áï, ÇÁ·Î±×·¥ÀÌ ¾î¼ÀºíµÇ°í ¸µÅ©µÈ ÈÄ¿¡ ½ÇÇà ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ Ç¥½Ã¸¦ ÇØ µÎ¾î¾ß ÇÑ´Ù.

             % brandelf –f Linux filename

 

2.3. Which Convention Should You Use?

 ¸¸¾à FreeBSD¿¡ ±¹ÇÑµÈ Äڵ带 ÀÛ¼ºÇÏ°í ÀÖ´Ù¸é À¯´Ð½º È£Ãâ °ü·Ê¿¡ µû¶ó¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ È£Ãâ ¹æ½ÄÀÌ º¸´Ù ºü¸£°í, ·¹Áö½ºÅÍ¿¡ Àü¿ª º¯¼ö(global variable)¸¦ ÀúÀåÇÒ ¼ö ÀÖ°Ô ÇØÁÖ¸ç, ½ÇÇà ÆÄÀÏ¿¡ Ç¥½Ã¸¦ ÇÒ ÇÊ¿äµµ ¾ø´Ù. °Ô´Ù°¡ ÇÁ·Î±×·¥ÀÌ ¼³Ä¡µÉ ½Ã½ºÅÛ¿¡ ¸®´ª½º ¾Ö¹Ä·¹ÀÌ¼Ç ÆÐÅ°Áö¸¦ ¼³Ä¡ÇØ¾ß ÇÑ´Ù´Â Á¦¾à Á¶°Çµµ Á¦°ÅÇÒ ¼ö ÀÖ´Ù.

 

 ´ëºÎºÐÀÇ °æ¿ì¿¡´Â ¸®´ª½º¿¡¼­µµ µ¹¾Æ°¡´Â À̽ļº ÀÖ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇϸ鼭µµ FreeBSD »ç¿ëÀÚ¿¡°Ô °¡´ÉÇÑ ÇÑ È¿À²ÀûÀ¸·Î ½ÇÇàµÇ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ°í ½ÍÀ» °ÍÀÌ´Ù. ¿ì¼± ±âº»ÀûÀÎ ³»¿ëÀ» Á» ´õ ¼³¸íÇÑ ÈÄ¿¡ À̽ļº°ú È¿À²¼ºÀ» µ¿½Ã¿¡ ¸¸Á·½Ãų ¼ö ÀÖ´Â ¹æ¹ýÀ» ¼³¸íÇÒ °ÍÀÌ´Ù.

 

 

Chapter 3 – Call Numbers

 ¾î¶² ¼­ºñ½º¸¦ ¿øÇÏ´ÂÁö Ä¿³Î¿¡°Ô ¾Ë¸®±â À§ÇØ EAX ·¹Áö½ºÅÍ¿¡ ½Äº° ¹øÈ£¸¦ ÀúÀåÇÑ´Ù. ¹°·Ð ±× ¹øÈ£°¡ ¾î¶² ¼­ºñ½º¸¦ ÁöÁ¤ÇÏ´Â °ÍÀÎÁö ¾Ë¾ÆµÑ ÇÊ¿ä°¡ ÀÖ´Ù.

 

3.1. The syscalls file

 ½Äº° ¹øÈ£´Â syscalls ÆÄÀÏ¿¡ ±â·ÏµÇ¾î ÀÖ´Ù. locate syscalls ¸í·ÉÀ» ³»¸®¸é ½Ã½ºÅÛ¿¡ ÀÖ´Â ´Ù¾çÇÑ ÇüÅÂÀÇ syscalls ÆÄÀÏÀ» ã¾Æ Áִµ¥, ÀÌ ÆÄÀϵéÀº ¸ðµÎ syscalls.master ÆÄÀÏ¿¡¼­ ÀÚµ¿ »ý¼ºµÈ °ÍÀÌ´Ù.

 

 ±âº»ÀûÀÎ À¯´Ð½º È£Ãâ °ü·Ê¸¦ À§ÇØ Á¤ÀÇµÈ ¸¶½ºÅÍ ÆÄÀÏ(master file)Àº     /usr/src/sys/ kern/syscalls.master ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. ¸¸¾à ¸®´ª½º ¾Ö¹Ä·¹ÀÌ¼Ç ¸ðµå¿¡¼­ ±¸ÇöµÈ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ È£Ãâ °ü·Ê¸¦ »ç¿ëÇÏ°í ½Í´Ù¸é /usr/src/sys/i386/linux/syscalls.master¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

 

N.B.: FreeBSD¿Í Linux°¡ È£Ãâ °ü·Ê¸¸ ´Þ¸® »ç¿ëÇÏ´Â °ÍÀº ¾Æ´Ï´Ù´Â »ç½Ç¿¡ ÁÖ¸ñÇØ¾ß ÇÑ´Ù. °°Àº ÇÔ¼ö¿¡ ´Ù¸¥ ½Äº° ¹øÈ£¸¦ ÇÒ´çÇÑ °æ¿ìµµ ÀÖ´Ù.

 

syscalls.master¿¡´Â ½Ã½ºÅÛ ÄݵéÀÌ ¾î¶»°Ô ±¸¼ºµÇ¾î ÀÖ´ÂÁö¿¡ ´ëÇÑ ¼³¸íÀÌ ÀÖ´Ù.

 
0       STD     NOHIDE  { int nosys(void); } syscall nosys_args int
1       STD     NOHIDE  { void sys_exit(int rval); } exit sys_exit_args void
2       STD     POSIX   { int fork(void); }
3       STD     POSIX   { ssize_t read(int fd, void *buf, size_t nbyte); }
4       STD     POSIX   { ssize_t write(int fd, const void *buf, size_t nbyte); }
5       STD     POSIX   { int open(char *path, int flags, int mode); }
6       STD     POSIX   { int close(int fd); }

etc...

.

°¡Àå ¿ÞÂÊÀÇ ¼ýÀÚ°¡ EAX¿¡ ÀúÀåµÉ °ªÀÌ´Ù.

 

±×¸®°í °¡Àå ¿À¸¥ÂÊ¿¡ ÀÖ´Â °ªÀÌ ¾î¶² ¸Å°³ º¯¼ö°¡ Ǫ½ÃµÇ¾î¾ß ÇÏ´ÂÁö¸¦ ³ªÅ¸³»´Â °ªÀÌ´Ù. ÀÌ °ªµéÀº ¿À¸¥ÂÊ¿¡¼­ ¿ÞÂÊÀÇ ¼ø¼­·Î Ǫ½ÃµÈ´Ù.

 

EXAMPLE 3.1: °¡·É, ÆÄÀÏÀ» ¿­±â À§ÇØ mode¸¦ ¸ÕÀú Ǫ½ÃÇØ¾ß ÇÏ°í flags¿Í path°¡ ÀúÀåµÈ ÁÖ¼Ò¸¦ Ǫ½ÃÇÑ´Ù´Â Àǹ̰¡ µÈ´Ù.

 

Chapter 4 – Return Values

 ¸¸¾à ½Ã½ºÅÛ ÄÝÀÌ ¾î¶² °á°ú°ªÀ» ¸®ÅÏ(return)ÇÏÁö ¾Ê´Â´Ù¸é À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ¾ø´Â °æ¿ìµµ ¸¹ÀÌ ÀÖÀ» °ÍÀÌ´Ù. °¡·É, ¿­¸° ÆÄÀÏ(open file)ÀÇ ÆÄÀÏ ±â¼úÀÚ(file descriptor), ¹öÆÛ¿¡¼­ ÀÐÀº ¹ÙÀÌÆ® ¼ö, ½Ã½ºÅÛ ½Ã°£ µîÀÌ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Â ¸®ÅÏ°ªÀÇ ¿¹ÀÌ´Ù.

 

 °Ô´Ù°¡ ¿¡·¯°¡ ¹ß»ýÇßÀ» ¶§, ½Ã½ºÅÛÀÌ »ç¿ëÀÚ¿¡°Ô ¿¡·¯¸¦ Å뺸ÇØ ÁÙ ¼ö´Üµµ ÇÊ¿äÇÏ´Ù. ÀÌ·¯ÇÑ ¿¡·¯ÀÇ °æ¿ì¿¡´Â ÆÄÀÏÀÌ ¾ø´ÙµçÁö, ½Ã½ºÅÛ ÀÚ¿øÀÌ °í°¥µÇ¾ú´ÙµçÁö, À¯È¿ÇÏÁö ¾ÊÀº ¸Å°³ º¯¼ö°¡ ³Ñ¾î ¿Â °æ¿ì µîÀÌ ÇØ´çµÈ´Ù.

 

4.1. Man Pages

 À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ »ç¿ëµÇ´Â ´Ù¾çÇÑ ½Ã½ºÅÛ Äݵ鿡 ´ëÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Â ÀüÅëÀûÀÎ ¹æ¹ýÀº ¸Ç ÆäÀÌÁö(man page)¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. FreeBSD´Â ¸Ç ÆäÀÌÁöÀÇ 2Àý¿¡¼­ ½Ã½ºÅÛ ÄÝÀ» ¼³¸íÇÏ°í ÀÖÁö¸¸ °¡²û 3Àý¿¡¼­ ¼Ò°³µÇ´Â ½Ã½ºÅÛ Äݵµ ÀÖ´Ù.

 

 °¡·É, open(2)¸¦ º¸¸é ´ÙÀ½°ú °°Àº Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

 

 ¸¸¾à ¼º°øÇϸé open() ÇÔ¼ö´Â ¾çÀÇ Á¤¼ö¸¦ ¸®ÅÏÇϴµ¥, ÀÌ°ÍÀº ¿¬ ÆÄÀÏÀÇ ±â¼úÀÚ´Ù. ÀÌ ÇÔ¼ö°¡ –1À» ¸®ÅÏÇϸé ÇÔ¼öÀÇ È£ÃâÀÌ ½ÇÆÐÇÑ °ÍÀÌ°í errno º¯¼ö¿¡ ¿¡·¯ÀÇ Á¾·ù°¡ ±â·ÏµÈ´Ù.

 

 À¯´Ð½º¿Í FreeBSD¸¦ óÀ½ Á¢ÇÏ´Â ¾î¼Àºí¸® ÇÁ·Î±×·¡¸Ó¶ó¸é ¹Ù·Î errno´Â ¾îµð¿¡ ÀÖ°í ¾î¶»°Ô ±× °ªÀ» ¾òÀ» ¼ö Àִ°¡¶ó´Â Áú¹®À» ´øÁú °ÍÀÌ´Ù.

 

N.B.: ¸Ç ÆäÀÌÁö¿¡ ÀÖ´Â Á¤º¸µéÀº C ÇÁ·Î±×·¥À» À§ÇÑ °ÍµéÀÌ´Ù. ¾î¼Àºí¸® ÇÁ·Î±×·¡¸ÓµéÀº ÀÌ ÀÌ»óÀÇ ºÎ°¡ÀûÀÎ Á¤º¸°¡ ÇÊ¿äÇÏ´Ù.

 

4.2. Where Are The Return Values?

 ºÒÇàÇÏ°Ôµµ ¸®ÅÏ °ªÀÌ ÀúÀåµÇ´Â Àå¼Ò´Â ½Ã½ºÅÛ ÄÝÀÇ Á¾·ù¿¡ µû¶ó ´Ù¸£´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛ ÄÝÀº EAX¿¡ ¸®ÅÏ °ªÀ» ÀúÀåÇÏÁö¸¸ ÀüºÎ ¿©±â¿¡ ÀúÀåÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. óÀ½ »ç¿ëÇÏ´Â ½Ã½ºÅÛ ÄÝÀº ¸®ÅÏµÈ ÈÄ¿¡ EAX ·¹Áö½ºÅ͸¦ °Ë»çÇØ º¸´Â °ÍÀÌ ÁÁÀº ÇÁ·Î±×·¡¹Ö ½À°üÀÌ´Ù. ¸¸¾à EAX¿¡ ¸®ÅÏ°ªÀÌ ¾ø´Ù¸é ´Ù¸¥ °÷À» ã¾ÆºÁ¾ß ÇÒ °ÍÀÌ´Ù.

 

N.B.: ÇÊÀÚ°¡ »ç¿ëÇß´ø ¸ðµç ½Ã½ºÅÛ ÄÝÀº EAX¿¡ ¸®ÅÏ°ªÀ» ÀúÀåÇß´Ù. ´Ü ÇÑ°¡Áö ¿¹¿Ü°¡ ÀÖ¾ú´Âµ¥, SYS_fork°¡ ¹Ù·Î ±×°ÍÀÌ´Ù. ÀÌ ½Ã½ºÅÛ ÄÝÀº EDX ·¹Áö½ºÅÍ¿¡ ¸®ÅÏ°ªÀ» ÀúÀåÇß´Ù. ¹°·Ð ÇÊÀÚ°¡ ¸ðµç ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇØ º» °ÍÀº ¾Æ´Ï±â ¶§¹®¿¡ EAX ·¹Áö½ºÅ͸¦ °Ë»çÇØ º¸´Â °úÁ¤À» »ý·«Çؼ± ¾ÈµÈ´Ù.

 

TIP: ¸¸¾à ƯÁ¤ ½Ã½ºÅÛ ÄÝÀÇ ¸®ÅÏ°ªÀÌ ÀúÀåµÇ´Â À§Ä¡¸¦ µµÀúÈ÷ ¾Ë ¼ö°¡ ¾ø´Ù¸é libc ¶óÀ̺귯¸®ÀÇ ¼Ò½º Äڵ带 ºÐ¼®ÇØ º¸´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. ÀÌ ¶óÀ̺귯¸®¿¡¼­ Ä¿³Î°ú ¾î¶»°Ô ÀÎÅÍÆäÀ̽º¸¦ Çü¼ºÇÏ´Â Áö¿¡ ÁÖ¸ñÇØ º¸¶ó.

 

4.3. Where Is errno?

 »ç½ÇÀº ¾îµð¿¡µµ errno´Â ¾ø´Ù. errno´Â À¯´Ð½º Ä¿³ÎÀÌ ¾Æ´Ñ C ¾ð¾îÀÇ ÇÑ ºÎºÐÀÌ´Ù. Ä¿³Î ¼­ºñ½º¿¡ ¹Ù·Î Á¢±ÙÇÒ ¶§ error ÄÚµå´Â ÀϹÝÀûÀÎ ¸®ÅÏ°ªÀÌ ÀúÀåµÇ´Â EAX¿¡ ±â·ÏµÈ´Ù.

 

 ÀÌ°ÍÀº ´ë´ÜÈ÷ Èï¹Ì ÀÖ´Â ±¸Á¶¸¦ Çü¼ºÇÑ´Ù. ¿¡·¯°¡ ¾ø´Ù¸é ¿¡·¯ Äڵ嵵 ´ç¿¬È÷ ¾øÀ» °ÍÀÌ°í ¿¡·¯°¡ ÀÖ´Ù¸é ¸®ÅÏ°ªµµ Àǹ̰¡ ¾øÀ» °ÍÀÌ´Ù. µû¶ó¼­ ÇϳªÀÇ ·¹Áö½ºÅÍ¿¡ ¿¡·¯ ÄÚµå¿Í ¸®ÅÏ°ªÀ» °¢°¢ÀÇ °æ¿ì¿¡ ÀúÀåÇÏ´Â °ÍÀÌ´Ù.

 

4.4 Determining an Error Occurred

Ç¥ÁØ FreeBSDÀÇ È£Ãâ °ü·Ê¸¦ »ç¿ëÇÒ ¶§, ½Ã½ºÅÛ ÄÝÀÌ ¼º°øÇϸé carry flag°¡ Ŭ¸®¾î(clear)µÇ°í ½ÇÆÐÇÏ¸é ¼³Á¤µÈ´Ù.

 

 ¸®´ª½º ¾Ö¹Ä·¹ÀÌ¼Ç ¸ðµå¸¦ »ç¿ëÇÒ ¶§´Â EAX¿¡ ÀúÀåµÈ °ªÀÌ ¾çÀÇ Á¤¼ö¸é È£ÃâÀÌ ¼º°øÇÑ °ÍÀÌ°í ±× °ªÀº ¸®ÅÏ°ªÀÌ µÈ´Ù. ¿¡·¯°¡ ¹ß»ýÇßÀ» °æ¿ì¿¡´Â EAX¿¡ ÀúÀåµÈ °ªÀÌ À½¼öÀÏ °ÍÀÌ´Ù.

 

Chapter 5 – Creating Portable Code

 À̽ļºÀº ÀϹÝÀûÀ¸·Î ¾î¼Àºí¸® ¾ð¾î°¡ À¯¸®ÇÑ Á¡Àº ¾Æ´Ï´Ù. ÇÏÁö¸¸ ¾î¼Àºí¸® ÇÁ·Î±×·¥À» ¼­·Î ´Ù¸¥ Ç÷§Æû(platform)À» À§ÇØ ÀÛ¼ºÇÏ´Â °æ¿ì-ƯÈ÷ nasmÀ¸·Î-°¡ ÀÖÀ» ¼ö ÀÖ´Ù.  ÇÊÀÚ´Â Windows¿Í FreeBSD °°ÀÌ ´Ù¸¥ ¿î¿µÃ¼Á¦¸¦ À§ÇÑ ¾î¼Àºí¸® ¾ð¾î ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇØ ¿Ô´Ù.

 

 ¾î´À Á¤µµ Â÷ÀÌ´Â ÀÖ°ÚÁö¸¸ À¯»çÇÑ ±¸Á¶¸¦ °¡Áø µÎ Ç÷§Æû¿¡¼­ ½ÇÇàµÇ´Â Äڵ带 ÀÛ¼ºÇÏ°íÀÚ ÇÑ´Ù¸é ÀÌ ÀÏÀÌ °áÄÚ ºÒ°¡´ÉÇÑ °ÍÀÌ ¾Æ´Ï¶ó´Â »ç½Ç¿¡ ÁÖ¸ñÇØ¾ß ÇÑ´Ù.

 

 °¡·É, FreeBSD´Â À¯´Ð½ºÀ̸ç Linux´Â À¯´Ð½º¿Í À¯»çÇÑ ±¸Á¶¸¦ °¡Áø ¿î¿µÃ¼Á¦ÀÌ´Ù. ÇÊÀÚ´Â ÀÌ µÑ »çÀÌÀÇ Â÷ÀÌÁ¡À» ´ÜÁö ¼¼ °¡Áö ¹Û¿¡ ¾ð±ÞÇÏÁö ¾Ê¾Ò´Ù. Áï, È£Ãâ °ü·Ê¿Í ÇÔ¼ö ¹øÈ£, ±×¸®°í ¸®ÅÏ°ªÀÇ ÀúÀå À§Ä¡°¡ ±×°ÍÀε¥, ÀÌ ¿ÜÀÇ ±¸Á¶´Â °ÅÀÇ µ¿ÀÏÇϱ⠶§¹®¿¡ ±»ÀÌ ¾ð±ÞÇÏÁö ¾ÊÀº °ÍÀ̾úÀ½À» ±â¾ïÇϱ⠹ٶõ´Ù.

 

5.1. Dealing With Function Numbers

 ¸¹Àº °æ¿ì¿¡ ÇÔ¼ö ¹øÈ£´Â °°´Ù. ÇÏÁö¸¸ °°Áö ¾ÊÀº ÇÔ¼ö°¡ ÀÖ´õ¶óµµ ±×¸® Å« ¹®Á¦´Â ¾Æ´Ï´Ù. Äڵ带 ÀÛ¼ºÇÒ ¶§, ¹øÈ£¸¦ »ç¿ëÇÏ´Â ´ë½Å ½ÇÇàµÉ ½Ã½ºÅÛ¿¡ µû¶ó ´Þ¸® ¼±¾ðµÇ´Â »ó¼ö(constant)¸¦ »ç¿ëÇϸé ÀÌ ¹®Á¦´Â ÇØ°áµÈ´Ù.

 

%ifdef LINUX
%define SYS_execve 11
%else
%define SYS_execve 59
%endif

 

5.2. Dealing With Conventions

 È£Ãâ °ü·Ê¿Í ¸®ÅÏ°ª(errno ¹®Á¦)ÀÇ ¹®Á¦´Â ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¸é ¾î·ÆÁö ¾Ê°Ô ÇØ°áÇÒ ¼ö ÀÖ´Ù.

 

%ifdef LINUX
 
%macro system 0
 call kernel
%endmacro
 
align 4
kernel:
 push ebx
 push ecx
 push edx
 push esi
 push edi
 push ebp
 
 mov ebx, [esp+32]
 mov ecx, [esp+36]
 mov edx, [esp+40]
 mov esi, [esp+44]
 mov ebp, [esp+48]
 int 80h
 
 pop ebp
 pop edi
 pop esi
 pop edx
 pop ecx
 pop ebx
 
 or eax, eax
 js .errno
 clc
 ret
 
.errno:
 neg eax
 stc
 ret
 
%else
 
%macro system 0
 int 80h
%endmacro
 
%endif

 

5.3. Dealing With Other Portability Issues

 À§¿¡¼­ Á¦½ÃÇÑ ÇØ°á ¹æ¹ýÀ¸·Î ´ëºÎºÐÀÇ °æ¿ì¿¡ FreeBSD¿Í Linux »çÀÌÀÇ À̽ļº ÀÖ´Â Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖÁö¸¸ ÀϺÎÀÇ Ä¿³Î ¼­ºñ½º´Â Á¤¸» ½É°¢ÇÒ ¸¸Å­ ´Ù¸¥ °æ¿ì°¡ ÀÖ´Ù.

 

 ÀÌ·± °æ¿ì, ƯÁ¤ ½Ã½ºÅÛ ÄÝÀ» À§ÇÑ Çڵ鷯(handler)¸¦ Ç÷§Æû¸¶´Ù °¢°¢ ÀÛ¼ºÇÏ°í Á¶°ÇºÎ ¾î¼Àºí¸®(conditional assembly)¸¦ »ç¿ëÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ´ÙÇàÈ÷µµ ´ëºÎºÐÀÇ Äڵ忡¼­ Ä¿³Î ¼­ºñ½º¸¦ È£ÃâÇÏ´Â ºÎºÐÀº ¸¹Áö ¾ÊÀ¸¹Ç·Î Á¶°Ç¹®ÀÌ ±×¸® ¸¹ÀÌ ³ª¿ÀÁö´Â ¾ÊÀ» °ÍÀÌ´Ù.

 

5.4 Using a Library

 À̽ļº ¹®Á¦¸¦ ÇÇÇÏ´Â ¶Ç ÇÑ°¡Áö ¹æ¹ýÀº ½Ã½ºÅÛ ÄÝÀÇ ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇÏ¿© ÁÖ¿ä Äڵ忡¼­ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. Áï, FreeBSD¸¦ À§ÇÑ ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇÏ°í ÀÌ¿Í´Â º°µµ·Î Linux¸¦ À§ÇÑ ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇÏ¿© »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¸»ÇÑ´Ù.

 

 ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇÒ ¶§, °¢ ½Ã½ºÅÛ ÄÝÀ» ºÐ¸®µÈ º°µµÀÇ ÇÔ¼ö(¸¸¾à ¿©·¯ºÐÀÌ ÀüÅëÀûÀÎ ¾î¼Àºí¸® ¾ð¾îÀÇ ¿ë¾î¸¦ ¼±È£ÇÑ´Ù¸é ÇÁ·Î½ÃÁ®¶ó Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.)·Î ÀÛ¼ºÇ϶ó. ¶ÇÇÑ ¸Å°³ º¯¼ö¸¦ ³Ñ±â´Â CÀÇ È£Ãâ °ü·Ê¸¦ »ç¿ëÇ϶ó. ±×·¯³ª ¿©ÀüÈ÷ È£Ãâ ¹øÈ£(call number)¸¦ ³Ñ±â±â À§ÇØ EAX´Â »ç¿ëÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡ ¸í¹éÈ÷ ´Ù¸¥ ÇÔ¼öµé¿¡´Â ·¹À̺í(label)À» ºÙ¿© µÎ¸é FreeBSD ¶óÀ̺귯¸®´Â ¸Å¿ì ´Ü¼øÇØ Áú °ÍÀÌ´Ù.

 
sys.open:
sys.close:
[etc...]
 int 80h
 ret

 

 Linux ¶óÀ̺귯¸®¿¡´Â º¸´Ù ¸¹Àº ´Ù¸¥ ÇÔ¼öµéÀÌ ÇÊ¿äÇÏ°ÚÁö¸¸ ¸Å°³ º¯¼öÀÇ ¼ö°¡ °°Àº ½Ã½ºÅÛ ÄݵéÀ» ¹­¾î ´Ü¼øÈ­½Ãų ¼ö ÀÖ´Ù.

 

sys.exit:
sys.close:
[etc... one-parameter functions]
 push ebx
 mov ebx, [esp+12]
 int 80h
 pop ebx
 jmp sys.return
 
...
 
sys.return:
 or eax, eax
 js sys.err
 clc
 ret
 
sys.err:
 neg eax
 stc

             ret

 

 ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ¿© À̽ļºÀ» ³ôÀÌ´Â ¹æ¹ýÀº ÇÁ·Î±×·¡¸Ó°¡ Ç÷§Æû ¸¶´Ù ´Ù¸¥ ÆÄÀÏ¿¡ Äڵ带 ºÐ¸®ÇÏ¿© ÀÛ¼ºÇØ¾ß ÇϹǷΠóÀ½¿¡´Â ºÒÆíÇÏ°ÚÁö¸¸ ¸¹Àº ÀåÁ¡ÀÌ ÀÖ´Ù. ¸ÕÀú, ¶óÀ̺귯¸®´Â Çѹø ÀÛ¼ºÇØ µÎ¸é ¿©·¯ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. °Ô´Ù°¡ ¶óÀ̺귯¸®¸¦ ´Ù¸¥ ÇÁ·Î±×·¡¸Ó¸¦ À§ÇØ °ø°³ÇÒ ¼öµµ ÀÖÀ¸¸ç, ´Ù¸¥ »ç¶÷ÀÌ ÀÛ¼ºÇÑ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© °³¹ß È¿À²À» ³ôÀÏ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ¹¹¶ó Çصµ °¡Àå Å« ÀåÁ¡À» ²ÅÀ¸¶ó¸é ¿ª½Ã À̽ļºÀÌ´Ù. Ç÷§Æû ¸¶´Ù ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇØ ³õÀ¸¸é ÇÁ·Î±×·¥À» ´Ù¸¥ ¿î¿µÃ¼Á¦·Î Æ÷ÆÃÇÒ ¶§, ÇÁ·Î±×·¥Àº ±×´ë·Î µÎ°í ¶óÀ̺귯¸®¸¸ ´Ù½Ã ÀÛ¼ºÇÏ¸é µÈ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù.

 

 ¸¸¾à ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ¹æ½ÄÀÌ ¸¶À½¿¡ µéÁö ¾ÊÀ¸¸é º°µµÀÇ ¾î¼Àºí¸® ¾ð¾î ÆÄÀÏ¿¡ ¸ðµç ½Ã½ºÅÛ ÄÝÀ» ÀúÀåÇØ ³õ°í ÀÛ¼ºÇÑ ÇÁ·Î±×·¥À» ±× ÆÄÀÏ°ú ¸µÅ© ½ÃÅ°´Â °ÍÀÌ ±×³ª¸¶ ±¦ÂúÀº ¹æ¹ýÀÌ µÉ °ÍÀÌ´Ù. ÇÁ·Î±×·¥À» Æ÷ÆÃÇÒ ¶§ ¹Ýµå½Ã °ÅÃÄ¾ß ÇÏ´Â °úÁ¤Àº ÀÛ¼ºÇÑ ÇÁ·Î±×·¥°ú ¸µÅ©ÇÏ¿© ´Ù½Ã »õ·Î¿î °³Ã¼ ÆÄÀÏ(object file)À» »ý¼ºÇØ ³»´Â °ÍÀÌ´Ù.

 

5.5. Using an Include File

¼ÒÇÁÆ®¿þ¾î¸¦ ¼Ò½º ÄÚµå ÇüÅ·Π¹ßÇ¥ÇÑ´Ù¸é ¸ÅÅ©·ÎµéÀ» º°µµÀÇ ÆÄÀÏ·Î ¸ð¾Æ ³õ°í ÁÖ Äڵ忡¼­ ÀÎŬ·çµå(include)½ÃÅ°´Â ¹æ½ÄÀ» ÅÃÇÒ ¼ö ÀÖ´Ù.

 

 ÀÌ·¯ÇÑ ÇüÅ·ΠÀÛ¼ºµÈ ¼ÒÇÁÆ®¿þ¾î¸¦ Æ÷ÆÃÇÒ ¶§´Â ÀÎŬ·çµåµÈ ÆÄÀϸ¸ ÀçÀÛ¼º ÇÏ¿© Æ÷ÆÃÀ» ¸¶¹«¸® ÁöÀ» ¼öµµ ÀÖ´Ù. Áï, ¶óÀ̺귯¸®³ª ¿ÜºÎ °³Ã¼ ÆÄÀϵµ ÇÊ¿äÄ¡ ¾ÊÀ¸¸ç ÇÁ·Î±×·¥ Äڵ嵵 ¼öÁ¤ÇÒ ÇÊ¿ä ¾øÀÌ Æ÷ÆÃÀ» ¸¶¹«¸®ÇÒ ¼ö ÀÖ´Ù´Â ¶æÀÌ´Ù.

 

N.B.: ÀÌ ¹æ¹ýÀÌ ¹Ù·Î ÀÌ Æ©Å丮¾ó¿¡¼­ »ç¿ëÇÒ Æ÷Æà ¹æ½ÄÀÌ´Ù. ÇÊÀÚ´Â »ç¿ëÇÒ ÀÎŬ·çÆ® ÆÄÀÏÀ» system.inc¶ó Á¤ÇÏ°í »õ·Î¿î ½Ã½ºÅÛ ÄÝÀ» ´Ù·ê ¶§¸¶´Ù Ãß°¡ÇÒ °ÍÀÌ´Ù.

 

 ±×·³ Ç¥ÁØ ÆÄÀÏ ±â¼úÀÚ¸¦ Á¤ÀÇÇϸ鼭 system.inc ÆÄÀÏÀÇ ³»¿ëÀ» ÀÛ¼ºÇØ ³ª°¡µµ·Ï ÇÏ°Ú´Ù.

 
%define stdin 0
%define stdout 1
%define stderr 2

 

 ´ÙÀ½À¸·Î °¢ ½Ã½ºÅÛ ÄÝÀÇ ½Éº¼¸¯ À̸§(symbolic name)À» »ý¼ºÇÑ´Ù.

 
%define SYS_nosys 0
%define SYS_exit  1
%define SYS_fork  2
%define SYS_read 3
%define SYS_write 4
; [etc...]

 

±×¸®°í ÄÚµå Àüü¿¡¼­ »ç¿ëµÇÁö ¾Ê´Â ÇÁ·Î½ÃÁ® Áß ÄÚµå ±æÀÌ°¡ ª°í ±ä À̸§À» °¡Áø °ÍµéÀ» Ãß°¡½ÃŲ´Ù. ÀÌ·± ÇÁ·Î½ÃÁ®µéÀº Äڵ忡¼­ ÀÚÁÖ »ç¿ëµÇÁø ¾ÊÀ» °ÍÀÌ´Ù.

 

section .code
align 4
access.the.bsd.kernel:
 int 80h
 ret

 

±×¸®°í ½Ã½ºÅÛ ÄÝ ¹øÈ£¸¦ ¸Å°³ º¯¼ö·Î °®´Â ¸ÅÅ©·Î¸¦ »ý¼ºÇÑ´Ù.

 
%macro system 1
 mov eax, %1
 call access.the.bsd.kernel
%endmacro

 

¸¶Áö¸·À¸·Î °¢ ½Ã½ºÅÛ ÄÝ¿¡ ÇØ´çÇÏ´Â ¸ÅÅ©·Î¸¦ »ý¼ºÇÑ´Ù. ÀÌ ¸ÅÅ©·Î´Â ¸Å°³ º¯¼ö°¡ ¾ø´Ù.

 
%macro sys.exit 0
 system SYS_exit
%endmacro
 
%macro sys.fork 0
 system SYS_fork
%endmacro
 
%macro sys.read 0
 system SYS_read
%endmacro
 
%macro sys.write 0
 system SYS_write
%endmacro
 
; [etc...]

 

 ÇÊÀÚ´Â ´õ ¸¹Àº ½Ã½ºÅÛ ÄÝÀ» ´Ù·ç¸é¼­ ÀÌ ÆÄÀÏ¿¡ ¿©·¯ ³»¿ëÀ» Ãß°¡ ½ÃÄÑ ³ª°¥ °ÍÀÌ´Ù.

 

Chapter 6 – Our First Program

 ÀÌÁ¦ ù ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ Áغñ°¡ µÇ¾ú´Ù. ù ÇÁ·Î±×·¥Àº ¸ðµç ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ ¹è¿ï ¶§ °ÅÀÇ Àǹ«ÀûÀ¸·Î Á¢ÇÏ°Ô µÇ´Â hello, world ÇÁ·Î±×·¥ÀÌ´Ù.

            
            1:            %include            'system.inc'
  2:
  3: section .data
  4: hello db 'Hello, World!', 0Ah
  5: hbytes equ $-hello
  6:
  7: section .code
  8: global _start
  9: _start:
 10: push dword hbytes
 11: push dword hello
 12: push dword stdout
 13: sys.write
 14:
 15: push dword 0
 16: sys.exit

 

 Ã¹¹ø° ¶óÀο¡¼­´Â system.inc ÆÄÀÏ¿¡¼­ Á¤ÀÇµÈ ¸ÅÅ©·Î¿Í Äڵ带 ÀÎŬ·çµå ÇÏ°í ÀÖ´Ù.

 

 ¶óÀÎ 3-5´Â µ¥ÀÌÅÍ ¿µ¿ªÀÌ´Ù. ¶óÀÎ 3Àº µ¥ÀÌÅÍ ¼½¼Ç/¼¼±×¸ÕÆ®·Î ½ÃÀÛÇÏ°í ¶óÀÎ 4´Â ¡°Hello, World!¡±¶ó´Â ¹®ÀÚ¿­À» ÀúÀåÇÏ°í ÀÖ´Ù.  ¶óÀÎ 5´Â ¶óÀÎ 4¿¡¼­ Á¤ÀÇµÈ ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ °ªÀ¸·Î ÇÏ´Â »ó¼ö¸¦ ¸¸µç´Ù.

 

 ¶óÀÎ 7-16Àº Äڵ带 Æ÷ÇÔÇÏ°í ÀÖ´Ù. FreeBSD°¡ ¸ðµç ÇÁ·Î±×·¥ÀÌ _start¶ó´Â ·¹À̺íÀÌ ºÙÀº ÁöÁ¡¿¡¼­ ½ÃÀ۵Ǿî¾ß ÇÏ´Â elf ÆÄÀÏ Æ÷¸ËÀ» »ç¿ëÇÑ´Ù´Â »ç½Ç¿¡ ÁÖ¸ñÇ϶ó.(º¸´Ù Á¤È®È÷ ¸»ÇÏÀÚ¸¸ ¸µÄ¿°¡ _start¸¦ ½ÃÀÛ ÁöÁ¡À¸·Î »ý°¢ÇÑ´Ù.) ÀÌ ·¹À̺íÀº Àü¿ª º¯¼ö(global variable)À̾î¾ß ÇÑ´Ù.

 

¶óÀÎ 10-13¿¡¼­´Â ½Ã½ºÅÛ¿¡°Ô hello ¹®ÀÚ¿­ÀÇ hbytes ¸¸Å­ stdoutÀ¸·Î ½á ´Þ¶ó´Â ¿äûÀ» ÇÏ°í ÀÖ´Ù.

 

¶óÀÎ 15-16¿¡¼­´Â ½Ã½ºÅÛ¿¡°Ô 0À» ¸®ÅÏ°ªÀ¸·Î °®°í ÇÁ·Î±×·¥À» Á¾·á ½ÃÄÑ ´Þ¶ó´Â ¿äûÀ¸ ÇÏ°í ÀÖ´Ù. SYS_exit ½Ã½ºÅÛ ÄÝÀº °áÄÚ ¸®ÅϵÇÁö ¾Ê±â ¶§¹®¿¡ ÄÚµå´Â ¿©±â¿¡¼­ ³¡³­´Ù.

 

             N.B.: ¸¸¾à µ¶ÀÚ°¡ MS DOS ¾î¼Àºí¸® ¾ð¾î¸¦ ÀÍÈ÷°í À¯´Ð½º ȯ°æÀ¸·Î ÀÌÀüÇØ ¿Â °ÍÀ̶ó¸é Ãâ·ÂÀ» À§Çؼ­ ºñµð¿À Çϵå¿þ¾î¿¡ Á÷Á¢ ¾²´Â Äڵ带 ÀÛ¼ºÇßÀ» °ÍÀÌ´Ù. FreeBSD³ª ±âŸ ´Ù¸¥ À¯´Ð½º ȯ°æ¿¡¼­´Â ÀÌ ¹®Á¦¿¡ ´ëÇØ °ÆÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. Ãâ·Â¿¡ °ü·ÃµÈ ÀÛ¾÷À» ó¸®ÇØ¾ß ÇÑ´Ù¸é stdoutÀ̶ó´Â ÆÄÀÏ¿¡ ±â·ÏÇϱ⸸ ÇÏ¸é µÈ´Ù. stdoutÀº ºñµð¿À ½ºÅ©¸°ÀÌ µÉ ¼öµµ ÀÖ°í ÅÚ³Ý Å͹̳Î(telnet terminal) ȤÀº ½ÇÁ¦ ÆÄÀÏ ½ÉÁö¾î ´Ù¸¥ ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀÏ ¼öµµ ÀÖ´Ù. ÀÌ°ÍÀº ÀüÀûÀ¸·Î ½Ã½ºÅÛÀÌ ÀÌÇØÇÏ´Â ¹æ½Ä¿¡ µû¶ó ´Ù¸¥ °ÍÀÌ´Ù.

 

6.1. Assembling the Code

 ÀÏ´Ü ¿¡µðÅÍ¿¡ ¾î¼Àºí¸® ¾ð¾î Äڵ带 ŸÀÌÇÎÇÏ°í hello.asmÀ̶ó´Â À̸§À¸·Î ÀúÀåÇÏÀÚ. ÀÌ ÆÄÀÏÀ» ¾î¼ÀºíÇÏ·Á¸é nasmÀÌ ÇÊ¿äÇÏ´Ù.

 

6.1.1. Installing NASM

 nasmÀÌ ¾ø´Ù¸é ´ÙÀ½°ú °°ÀÌ Å¸ÀÌÇÎÇÏ¿© nasmÀ» ¼³Ä¡ÇÏÀÚ.

 

% su
Password:your root password
# cd /usr/ports/devel/nasm
# make install
# exit
%

 

 ¸¸¾à nasmÀÇ ¼Ò½º Äڵ带 À¯ÁöÇÏ°í ½ÍÁö ¾Ê´Ù¸é make install ´ë½Å make install cleanÀ» ŸÀÌÇÎÇØ¾ß ÇÑ´Ù.

 

 À§ÀÇ µÎ ¹æ¹ý Áß ¾î¶² °ÍÀ» ÅÃÇϵçÁö FreeBSD´Â ÀÎÅͳݿ¡¼­ nasmÀ» ´Ù¿î ¹Þ¾Æ ÄÄÆÄÀÏÇÏ°í ½Ã½ºÅÛ¿¡ ¼³Ä¡ÇØ ÁÙ °ÍÀÌ´Ù.

 

N.B: ¸¸¾à ½Ã½ºÅÛÀÌ FreeBSD°¡ ¾Æ´Ï¶ó¸é nasmÀÇ È¨ÆäÀÌÁö¿¡ °¡¼­ Á÷Á¢ ¼Ò½º¸¦ ±¸ÇØ¾ß ÇÑ´Ù. ¹°·Ð ¿©±â¿¡¼­ ¾òÀº ¼Ò½º·Îµµ FreeBSD Äڵ带 ¾î¼ÀºíÇÒ ¼ö ÀÖ´Ù.

 

 ÀÌÁ¦ ¿©·¯ºÐÀº ´ÙÀ½°ú °°ÀÌ ¾î¼Àºí, ¸µÅ©¸¦ ¼öÇàÇÏ°í Äڵ带 ½ÇÇà½Ãų ¼ö ÀÖ´Ù.

% nasm -f elf hello.asm
% ld -s -o hello hello.o
% ./hello
Hello, World!

%

 

Chapter 7 – Writing Unix Filters

 À¯´Ð½º ¾ÖÇø®ÄÉÀ̼Ç(application)ÀÇ ÀϹÝÀûÀΠŸÀÔÀº ÇÊÅÍ(filter) -stdin¿¡¼­ µ¥ÀÌÅ͸¦ Àаí ó¸®ÇÑ ÈÄ, stdoutÀ¸·Î Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ ÀÇ ÇüŸ¦ °¡Áø´Ù.

 

 ÀÌ Àå¿¡¼­´Â °£´ÜÇÑ ÇÊÅ͸¦ °³¹ßÇϸ鼭 stdin¿¡¼­ µ¥ÀÌÅ͸¦ Àд ¹æ¹ý°ú stdoutÀ¸·Î µ¥ÀÌÅ͸¦ ¾²´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¼ °ÍÀÌ´Ù. ÀÌ ÇÊÅÍ´Â ÀÔ·Â ¹ÞÀº µ¥ÀÌÅ͸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î 16Áø¼ö·Î º¯È¯ÇÏ°í º¯È¯µÈ µ¥ÀÌÅ͸¦ Ãâ·ÂÇÑ´Ù.

 

%include 'system.inc'
 
section .data
hex db '0123456789ABCDEF'
buffer db 0, 0, ' '
 
section .code
global _start
_start:
 ; read a byte from stdin
 push dword 1
 push dword buffer
 push dword stdin
 sys.read
 add esp, byte 12
 or eax, eax
 je .done
 
 ; convert it to hex
 movzx eax, byte [buffer]
 mov edx, eax
 shr dl, 4
 mov dl, [hex+edx]
 mov [buffer], dl
 and al, 0Fh
 mov al, [hex+eax]
 mov [buffer+1], al
 
 ; print it
 push dword 3
 push dword buffer
 push dword stdout
 sys.write
 add esp, byte 12
 jmp short _start
 
.done:
 push dword 0
 sys.exit

 

 µ¥ÀÌÅÍ ¼½¼Ç(data section)¿¡¼­ hex¶ó´Â ¹è¿­À» ¸¸µé¾ú´Ù. ÀÌ ¹è¿­Àº 16Áø¼ö ÀÚ¸®¼ö¸¦ ¿À¸§ Â÷¼øÀ¸·Î ÀúÀåÇÏ°í ÀÖ´Ù. ÀÌ ¹è¿­¿¡ ÀÌ¾î ¹Ù·Î ÀԷ°ú Ãâ·Â ¸ðµÎ¿¡ »ç¿ëµÉ ¹öÆÛ°¡ ¼±¾ðµÈ´Ù. ÀÌ ¹öÆÛÀÇ Ã¹ µÎ ¹ÙÀÌÆ®´Â 0À¸·Î ÃʱâÈ­µÇ¾î ÀÖ´Ù. ÀÌ ¹öÆÛ°¡ µÎ °³ÀÇ 16Áø¼ö ÀÚ¸®¼ö¸¦ ¾µ Àå¼ÒÀÌ´Ù.(¹öÆÛÀÇ Ã¹¹ø° ¹ÙÀÌÆ®´Â ÀÔ·ÂÀ» À§ÇÑ Àå¼Ò·Îµµ »ç¿ëµÈ´Ù.) ±×¸®°í ¼¼ ¹ø° ¹ÙÀÌÆ®´Â °ø¶õ(space)ÀÌ´Ù.

 ÀÌ ÄÚµå ¼½¼ÇÀº ³× ºÎºÐÀ¸·Î ±¸¼ºµÈ´Ù. ÇÑ ¹ÙÀÌÆ®¸¦ Àаí ÀÌ°ÍÀ» 16Áø¼ö·Î º¯È¯½ÃŲ ÈÄ, °á°ú¸¦ ¾²°í ÇÁ·Î±×·¥À» Á¾·á ½ÃŲ´Ù.

 

 ¹ÙÀÌÆ® ´ÜÀ§·Î Àбâ À§ÇØ ½Ã½ºÅÛ¿¡°Ô stdinÀ¸·Î ºÎÅÍ ÇÑ ¹ÙÀÌÆ®¸¦ ÀÐ¾î ´Þ¶ó´Â ¿äûÀ» ÇÏ°í ÀÌ°ÍÀ» bufferÀÇ Ã¹¹ø° ¹ÙÀÌÆ®¿¡ ÀúÀåÇÑ´Ù. ½Ã½ºÅÛÀº EAX¿¡ ÀÐÀº ¹ÙÀÌÆ® ¼ö¸¦ ¸®ÅÏÇÑ´Ù. µé¾î¿Â µ¥ÀÌÅÍ°¡ ÀÖÀ¸¸é 1ÀÌ µÉ °ÍÀÌ°í ¾øÀ¸¸é 0ÀÌ µÉ °ÍÀÌ´Ù. µû¶ó¼­ EAXÀÇ °ªÀ» °Ë»çÇØ¾ß ÇÑ´Ù. ¸¸¾à EAXÀÇ °ªÀÌ 0À̸é .doneÀ¸·Î ºÐ±âÇÏ°í 0ÀÌ ¾Æ´Ï¸é ´ÙÀ½ ¸í·É¾î¸¦ °è¼Ó ½ÇÇàÇÑ´Ù.

 

             N.B.: ÀÌ ¿¹¿¡¼­´Â Äڵ带 ´Ü¼øÈ­½ÃÅ°±â À§ÇØ ¿¡·¯ »óȲÀ» ¹«½ÃÇÏ°í ÀÖ´Ù.

 

 16Áø¼ö º¯È¯Àº buffer¿¡¼­ ¹ÙÀÌÆ®¸¦ ÀÐ¾î µé¿© º¯È¯À» ¼öÇàÇÏ°í EAX ·¹Áö½ºÅÍ¿¡ º¯È¯ °ªÀ» ÀúÀåÇÑ´Ù. (½ÇÁ¦·Î´Â ALÀÌ´Ù.) ÀÌÈÄ »óÀ§ 4ºñÆ®¸¦ ÇÏÀ§ 4ºñÆ®¿Í ºÐ¸®½ÃÄÑ º¯È¯ÇØ¾ß ÇÒ ÇÊ¿ä°¡ Àֱ⠶§¹®¿¡ ¹ÙÀÌÆ®¸¦ EDX·Î º¹»çÇÑ´Ù. ±×¸®°í ¹öÆÛÀÇ Ã¹¹ø° µÎ ¹ÙÀÌÆ®¿¡ ºÐ¸®ÇÑ 4ºñÆ®ÀÇ º¯È¯ °ªÀ» °¢°¢ ÀúÀåÇÑ´Ù.

 

 ´ÙÀ½À¸·Î ½Ã½ºÅÛ¿¡ ¹öÆÛÀÇ 3 ¹ÙÀÌÆ®- µÎ 16Áø¼ö ÀÚ¸®¼ö¿Í °ø¶õ- ¸¦ stdout¿¡ ½á ´Þ¶ó´Â ¿äûÀ» ÇÑ´Ù. ±× ÈÄ ÇÁ·Î±×·¥ÀÇ ½ÃÀÛ ºÎ·Î ºÐ±âÇÏ¿© ´ÙÀ½ ¹ÙÀÌÆ®¸¦ ó¸®ÇÑ´Ù.

 

ó¸®ÇÒ ÀÔ·ÂÀÌ ´õ ¾øÀ¸¸é ½Ã½ºÅÛ¿¡°Ô 0À» ¸®ÅÏÇϸ鼭 ÇÁ·Î±×·¥À» Á¾·áÇØ ´Þ¶ó´Â ¿äûÀ» Çϴµ¥, ÀÌ°ÍÀº ÇÁ·Î±×·¥ÀÌ ¼º°øÀûÀ¸·Î Á¾·áµÇ¾úÀ½À» ¶æÇÏ´Â ÀüÅëÀûÀÎ °ªÀÌ´Ù.

 

 ÀÌÁ¦ ÀÌ ¼Ò½º ÆÄÀÏÀ» hex.asmÀ̶ó´Â À̸§À¸·Î ÀúÀåÇÑ ÈÄ ´ÙÀ½°ú °°ÀÌ Å¸ÀÌÇÎÇÑ´Ù.(^DÀÇ Àǹ̴ Ctrl Å°¸¦ ´©¸¥ »óÅ¿¡¼­ D¸¦ ´©¸£¶ó´Â ¶æÀÌ´Ù.)

 

% nasm -f elf hex.asm
% ld -s -o hex hex.o
% ./hex
Hello, World!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come!
48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D %

 

N.B.:  ¸¸¾à MS DOS ȯ°æ¿¡¼­ À¯´Ð½º ȯ°æÀ¸·Î ÀÌÀüÇØ ¿Â ÇÁ·Î±×·¡¸Ó¶ó¸é °¢ ¶óÀÎÀÌ 0D 0A°¡ ¾Æ´Ñ 0A·Î ³¡³­´Ù´Â »ç½Ç¿¡ ÀǾÆÇØ ÇÒ °ÍÀÌ´Ù. ÀÌ°ÍÀº À¯´Ð½º°¡ cr/lfÀÇ °ü·Ê¸¦ µû¸£Áö ¾Ê°í 0A °ªÀ» °®´Â »õ ¶óÀÎ(new line) ¹®ÀÚ ¸¸À¸·Î ¶óÀÎÀÇ ³¡À» Ç¥½ÃÇϱ⠶§¹®ÀÌ´Ù.

 

¿¹Á¦ Äڵ忡¼­ ¾î¶² Á¡À» °³¼±ÇÒ ¼ö ÀÖÀ»±î? ¸¹Àº ºÎºÐÀÌ ÀÖ°ÚÁö¸¸ Ãâ·Â Çü½ÄÀÌ Æ¯È÷ ¹ÌºñÇÏ´Ù. Áï, ÅؽºÆ®ÀÇ ÇÑ ¶óÀÎÀ» º¯È¯ÇÏ¿© È­¸é¿¡ Ãâ·ÂÇϴµ¥, »õ·Î¿î ÅؽºÆ®ÀÇ º¯È¯¹®ÀÌ ÀÌÀüÀÇ Ãâ·Â°ú °ø¶õ Çϳª¸¸À¸·Î ±¸ºÐµÇ¾î Ãâ·ÂµÇ´Â °ÍÀº ½â À¯ÄèÇÏÁö ¸øÇÑ ÀÏÀÌ´Ù. ÀÌ·¯ÇÑ Á¡Àº ´ÙÀ½ ÄÚµå¿Í °°ÀÌ ´ÙÀ½ ¶óÀÎÀ» Ãâ·ÂÇϱâ Àü¿¡ ´ÙÀ½ ¶óÀÎÀ¸·Î Ãâ·Â À§Ä¡¸¦ ÀçÁ¶Á¤Çϵµ·Ï Äڵ带 ¼öÁ¤ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

%include 'system.inc'
 
section .data
hex db '0123456789ABCDEF'
buffer db 0, 0, ' '
 
section .code
global _start
_start:
 mov cl, ' '
 
.loop:
 ; read a byte from stdin
 push dword 1
 push dword buffer
 push dword stdin
 sys.read
 add esp, byte 12
 or eax, eax
 je .done
 
 ; convert it to hex
 movzx eax, byte [buffer]
 mov [buffer+2], cl
 cmp al, 0Ah
 jne .hex
 mov [buffer+2], al
 
.hex:
 mov edx, eax
 shr dl, 4
 mov dl, [hex+edx]
 mov [buffer], dl
 and al, 0Fh
 mov al, [hex+eax]
 mov [buffer+1], al
 
 ; print it
 push dword 3
 push dword buffer
 push dword stdout
 sys.write
 add esp, byte 12
 jmp short .loop
 
.done:
 push dword 0
 sys.exit

 

 ¿ì¸®´Â CL ·¹Áö½ºÅÍ¿¡ °ø¶õÀ» ÀúÀåÇØ¿Ô´Ù. ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® À©µµ¿ì¿Í´Â ´Þ¸® À¯´Ð½ºÀÇ ½Ã½ºÅÛ ÄÝÀº °á°ú °ªÀ» ¸®ÅÏÇϱâ À§ÇØ »ç¿ëÇÏ´Â ·¹Áö½ºÅ͸¦ Á¦¿ÜÇÏ°í´Â ¾î¶² ·¹Áö½ºÅÍÀÇ °ªµµ ¼öÁ¤ÇÏÁö ¾Ê±â ¶§¹®¿¡ °ø¶õÀ» CL ·¹Áö½ºÅÍ¿¡ ÀúÀåÇÏ´Â °ÍÀÌ ¹®Á¦µÉ °Ç ¾ø´Ù.

 

 ÀÌ°ÍÀº ÇÁ·Î±×·¡¸Ó°¡ CL ·¹Áö½ºÅÍÀÇ °ªÀ» Çѹø¸¸ ¼³Á¤ÇØ ÁÖ¸é µÈ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. µû¶ó¼­ .loop¶ó´Â ·¹À̺íÀ» Ãß°¡ÇÏ°í ´ÙÀ½ ¹ÙÀÌÆ®¸¦ ó¸®ÇØ¾ß ÇÒ ¶§ _start·Î ºÐ±âÇÏÁö ¾Ê°í .loopÀ¸·Î ºÐ±âÇÑ´Ù. ¶ÇÇÑ .hex ·¹À̺íÀ» Ãß°¡ÇÏ¿© bufferÀÇ ¼¼¹ø° ¹ÙÀÌÆ®·Î °ø¶õÀ̳ª »õ ¶óÀÎ ¹®ÀÚ¸¦ ÀúÀåÇϴµ¥ »ç¿ëÇÑ´Ù.

 

 ÀÏ´Ü hex.asm¿¡ ÀÌ·¯ÇÑ º¯È­¸¦ ¹Ý¿µÇßÀ¸¸é ´ÙÀ½°ú °°ÀÌ Å¸ÀÌÇÎÇ϶ó.

% nasm -f elf hex.asm
% ld -s -o hex hex.o
% ./hex
Hello, World!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
Here I come!
48 65 72 65 20 49 20 63 6F 6D 65 21 0A
^D %

 

 »õ ¹öÁ¯Àº Á» ³ª¾Æ º¸ÀÌÁö¸¸ ÄÚµå ÀÚü°¡ ºñÈ¿À²ÀûÀÎ ¸éÀÌ ¸¹´Ù. ÀÌ·± ÀÌÀ¯·Î ÇÊÀÚ´Â ÇÑ ¹ÙÀÌÆ® ´ç µÎ¹ø È£ÃâµÇ´Â ½Ã½ºÅÛ ÄÝÀ» ¸¸µé°í ÀÖ´Ù.(ÇѹøÀº Àаí ÇѹøÀº Ãâ·ÂÇÑ´Ù.)

 

 

 

Chapter 8 – Buffered Input and Output

 ÀԷ°ú Ãâ·ÂÀ» ¹öÆÛ¸µÇϸé Äڵ带 Á» ´õ È¿À²ÀûÀ¸·Î ±¸ÇöÇÒ ¼ö ÀÖ´Ù. ÀÌ·± ÀÌÀ¯·Î Çѹø¿¡ Àüü ¹ÙÀÌÆ®¸¦ Àоî¿Ã ÀÔ·Â ¹öÆÛ¸¦ ¸¸µç ÈÄ, ¹öÆÛ¿¡¼­ ÇÑ ¹ÙÀÌÆ®¾¿ °¡Á®¿Í ó¸®ÇÏ´Â Çü½ÄÀ» µµÀÔÇÒ °ÍÀÌ´Ù. ¶Ç, Ãâ·Â ¹öÆÛ¸¦ ¸¸µé¾î¼­ ÀÌ ¹öÆÛ°¡ °¡µæ Âû ¶§¿¡¸¸ stdout¿¡ Ãâ·Â Çϵµ·Ï ¼öÁ¤ÇÒ °ÍÀÌ´Ù.

 

 ÇÁ·Î±×·¥Àº ´õ ÀÌ»óÀÇ ÀÔ·ÂÀÌ ¾øÀ» ¶§ Á¾·áµÈ´Ù. ÇÏÁö¸¸ ¸¶Áö¸·¿¡´Â ¿©ÀüÈ÷ Ä¿³Î¿¡°Ô Ãâ·Â ¹öÆÛ¸¦ stdout¿¡ ½á´Þ¶ó´Â ¿äûÀ» ÇØ¾ß ÇÑ´Ù. ¹°·Ð ¹öÆÛ°¡ ºñ¾î ÀÖ´Ù¸é ÀÌ·¯ÇÑ ¿äûÀ» ÇÒ ÇÊ¿ä°¡ ¾øÀ» °ÍÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ Á¾·á ½Ã Ãâ·Â ¹öÆÛÀÇ ³»¿ëÀ» Á¤¸®ÇØ¾ß ÇÑ´Ù´Â »ç½ÇÀ» ÀØ°í Ãâ·ÂÀÌ ¿ÏÀüÇÏÁö ¾Ê´Ù°í Åõ´ú´ëÁö ¾Ê±â ¹Ù¶õ´Ù.

 

%include 'system.inc'
 
%define BUFSIZE 2048
 
section .data
hex db '0123456789ABCDEF'
 
section .bss
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
 
section .code
global _start
_start:
 sub eax, eax
 sub ebx, ebx
 sub ecx, ecx
 mov edi, obuffer
 
.loop:
 ; read a byte from stdin
 call getchar
 
 ; convert it to hex
 mov dl, al
 shr al, 4
 mov al, [hex+eax]
 call putchar
 
 mov al, dl
 and al, 0Fh
 mov al, [hex+eax]
 call putchar
 
 mov al, ' '
 cmp dl, 0Ah
 jne .put
 mov al, dl
 
.put:
 call putchar
 jmp short .loop
 
align 4
getchar:
 or ebx, ebx
 jne .fetch
 
 call read
 
.fetch:
 lodsb
 dec ebx
 ret
 
read:
 push dword BUFSIZE
 mov esi, ibuffer
 push esi
 push dword stdin
 sys.read
 add esp, byte 12
 mov ebx, eax
 or eax, eax
 je .done
 sub eax, eax
 ret
 
align 4
.done:
 call write  ; flush output buffer
 push dword 0
 sys.exit
 
align 4
putchar:
 stosb
 inc ecx
 cmp ecx, BUFSIZE
 je write
 ret
 
align 4
write:
 sub edi, ecx ; start of buffer
 push ecx
 push edi
 push dword stdout
 sys.write
 add esp, byte 12
 sub eax, eax
 sub ecx, ecx ; buffer is empty now
 ret

 

 ÀÌÁ¦ .bss¶ó°í ¸í¸íµÇ¾î ÀÖ´Â ¼Ò½º ÄÚµåÀÇ ¼¼¹ø° ¼½¼ÇÀ» »ìÆ캸ÀÚ. ÀÌ ¼½¼ÇÀº ½ÇÇà ÆÄÀÏ¿¡ Æ÷ÇԵǾî ÀÖÁö ¾Ê±â ¶§¹®¿¡ ÃʱâÈ­ÇÒ ¼ö°¡ ¾ø´Ù. ÇÊÀÚ´Â db ´ë½Å¿¡ resb¸¦ »ç¿ëÇϴµ¥, ÀÌ°ÍÀº ´ÜÁö ¿äûµÈ Å©±â¸¸Å­ ÃʱâÈ­µÇÁö ¾ÊÀº ¸Þ¸ð¸®¸¦ ¿¹¾àÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.

 

 ½Ã½ºÅÛÀÌ ·¹Áö½ºÅ͸¦ ¼öÁ¤ÇÏÁö ¾Ê´Â´Ù´Â »ç½ÇÀº Å« ÀåÁ¡ÀÌ µÉ ¼ö ÀÖ´Ù. ·¹Áö½ºÅÍÀÇ °ªÀÌ º¯ÇÏÁö ¾Ê±â ¶§¹®¿¡ ¿©·¯ ¿ëµµ·Î ·¹Áö½ºÅ͸¦ »ç¿ëÇϴµ¥, ¸¸¾à ·¹Áö½ºÅÍ °ªÀÌ º¯ÇÑ´Ù¸é .data ¼½¼Ç¿¡ Àü¿ª º¯¼ö¸¦ ¼±¾ðÇÏ°í ÀúÀåÇØ µÎ¾î¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ Á¡ÀÌ ¹Ù·Î ·¹Áö½ºÅÍ·Î ¸Å°³ º¯¼ö¸¦ Àü´ÞÇÏ´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ È£Ãâ °ü·Ê¿¡ ºñÇØ ½ºÅÿ¡ ½Ã½ºÅÛ ÄÝÀÇ ¸Å°³ º¯¼ö¸¦ Àü´ÞÇÏ´Â À¯´Ð½º È£Ãâ °ü·Ê°¡ ¿ì¼öÇÏ´Ù°í ¸»ÇÏ´Â ÀÌÀ¯ÀÌ´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î ÇÊÀÚ´Â ¿©·¯ ¿ëµµ·Î ·¹Áö½ºÅ͸¦ È°¿ëÇÏ¿© ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù.

 

 EDI¿Í ESI ·¹Áö½ºÅÍ´Â ´ÙÀ½¿¡ ÀÐÀ» ¹ÙÀÌÆ®³ª ¾µ ¹ÙÀÌÆ®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ·Î »ç¿ëµÈ´Ù. ¶ÇÇÑ EBX¿Í ECX´Â µÎ ¹öÆÛ¿¡ ³²¾Æ ÀÖ´Â ¹ÙÀÌÆ®ÀÇ ¼ö¸¦ ¼¼´Â µ¥ »ç¿ëµÇ±â ¶§¹®¿¡ ÇÁ·Î±×·¥ÀÌ Ãâ·ÂÀ» ÇØ¾ß ÇÒ »óȲÀÎÁö ÀÔ·ÂÀ» ¹Þ¾Æ¾ß ÇÒ »óȲÀÎÁö¸¦ ÆÇ´ÜÇÒ ¼ö ÀÖ´Ù.

 

 ÀÌÁ¦ ÀÌ ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´Â Áö »ìÆ캸µµ·Ï ÇÏÀÚ.

 

% nasm -f elf hex.asm
% ld -s -o hex hex.o
% ./hex
Hello, World!
Here I come!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
48 65 72 65 20 49 20 63 6F 6D 65 21 0A
^D %

 

 ¿¹»óÄ¡ ¸øÇß´ø ¹®Á¦°¡ Çϳª ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ^D¸¦ ´©¸¦ ¶§±îÁö Ãâ·Â ¹öÆÛÀÇ ³»¿ëÀ» ¸ðµÎ Ãâ·ÂÇÏÁö ¾Ê´Â´Ù. ÀÌ·¯ÇÑ ¹®Á¦´Â »õ ¶óÀÎ ¹®ÀÚ¸¦ 0A·Î º¯È¯ÇÒ ¶§¸¶´Ù Ãâ·Â ¹öÆÛÀÇ ³»¿ëÀ» Ãâ·ÂÇϵµ·Ï Äڵ带 ¼öÁ¤ÇÏ¸é °£´ÜÈ÷ ÇØ°áµÉ ¼ö ÀÖ´Ù. ÇÊÀÚ´Â ¼öÁ¤ÇÑ ¼¼ ¶óÀο¡ > Ç¥½Ã¸¦ ÇØ µÎ¾ú´Ù.(hex.asmÀÇ Äڵ忡 > ±îÁö º¹»çÇÏÁø ¸»±â ¹Ù¶õ´Ù.)

 

%include 'system.inc'
 
%define BUFSIZE 2048
 
section .data
hex db '0123456789ABCDEF'
 
section .bss
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
 
section .code
global _start
_start:
 sub eax, eax
 sub ebx, ebx
 sub ecx, ecx
 mov edi, obuffer
 
.loop:
 ; read a byte from stdin
 call getchar
 
 ; convert it to hex
 mov dl, al
 shr al, 4
 mov al, [hex+eax]
 call putchar
 
 mov al, dl
 and al, 0Fh
 mov al, [hex+eax]
 call putchar
 
 mov al, ' '
 cmp dl, 0Ah
 jne .put
 mov al, dl
 
.put:
 call putchar
> cmp al, 0Ah
> jne .loop
> call write
 jmp short .loop
 
align 4
getchar:
 or ebx, ebx
 jne .fetch
 
 call read
 
.fetch:
 lodsb
 dec ebx
 ret
 
read:
 push dword BUFSIZE
 mov esi, ibuffer
 push esi
 push dword stdin
 sys.read
 add esp, byte 12
 mov ebx, eax
 or eax, eax
 je .done
 sub eax, eax
 ret
 
align 4
.done:
 call write  ; flush output buffer
 push dword 0
 sys.exit
 
align 4
putchar:
 stosb
 inc ecx
 cmp ecx, BUFSIZE
 je write
 ret
 
align 4
write:
 sub edi, ecx ; start of buffer
 push ecx
 push edi
 push dword stdout
 sys.write
 add esp, byte 12
 sub eax, eax
 sub ecx, ecx ; buffer is empty now
 ret

 

 ÀÌÁ¦ °á°ú¸¦ È®ÀÎÇØ º¸ÀÚ.

 

% nasm -f elf hex.asm
% ld -s -o hex hex.o
% ./hex
Hello, World!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
Here I come!
48 65 72 65 20 49 20 63 6F 6D 65 21 0A
^D %

 

644 ¹ÙÀÌÆ®ÀÇ ½ÇÇà ÆÄÀÏ Ä¡°ï ³ª»ÚÁö ¾ÊÀº °á°ú°¡ ¾Æ´Ñ°¡?

 

8.1. How To Unread a Character

 

WARNING: ÀÌ Àý¿¡¼­ ´Ù·ê ³»¿ëÀº ´Ù¼Ò ¾î·Á¿î ÁÖÁ¦¿¡ ¼ÓÇÑ´Ù. ÇÏÁö¸¸ ÄÄÆÄÀÏ·¯ À̷п¡ Àͼ÷ÇÑ ÇÁ·Î±×·¡¸Ó¿¡°Ô´Â Àç¹ÌÀÖ´Â ÁÖÁ¦°¡ µÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à ÀÌ ÀýÀ» °Ç³Ê ¶Ù°í ½Í´Ù¸é ´ÙÀ½ ÀåÀ¸·Î °Ç³Ê ¶Ú ÈÄ, ³ªÁß¿¡ Àо »ó°ü¾ø´Ù.

 

 ¿ì¸®ÀÇ ¿¹Á¦ ÇÁ·Î±×·¥¿¡´Â ÇÊ¿ä ¾ø´Â Ư¡ÀÌÁö¸¸ º¸´Ù º¹ÀâÇÑ ÇÊÅ͵éÀº ¹®ÀÚ¸¦ Àбâ Àü¿¡ ¹Ì¸® ´ÙÀ½ ¹®ÀÚ¸¦ Àо ƯÁ¤ Á¶°ÇÀ» ¸¸Á·ÇÏ´ÂÁö È®ÀÎÇÏ´Â °úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù.(À̸¦ look-ahead¶ó ÇÑ´Ù.) ¸¸¾à ´ÙÀ½ ¹®ÀÚ°¡ ƯÁ¤ÇÑ ¹®ÀÚ¶ó¸é(Áï, °ø¶õÀ̳ª Ư¼ö ¹®ÀÚ°¡ ¾Æ´Ï°í) ÀÌ °ªÀº ÇöÀç ó¸®ÇÏ°í ÀÖ´Â ÅäÅ«(token)ÀÇ ÀϺÎÀÌ°í ±× ÀÌ¿ÜÀÇ ¹®ÀÚ¶ó¸é ÇöÀç Åä±ÙÀÌ ¾Æ´Ò °ÍÀÌ´Ù.

 

 ÅؽºÆ® ¹®ÀÚ¿­·Î ±¸¼ºµÈ ÀÔ·Â ½ºÆ®¸²(input stream)À» ÆĽÌ(parsing)ÇØ¾ß ÇÏ´Â »óȲÀ» »ý°¢ÇØ º¸ÀÚ.(ÄÄÆÄÀÏ·¯¸¦ ±¸ÇöÇÑ´Ù¸é ÇʼöÀûÀÎ ÀÛ¾÷ÀÌ´Ù.) ¸¸¾à ÇÑ ¹®ÀÚ³ª ¼ýÀÚ°¡ ´Ù¸¥ ¹®ÀÚ¿¡ ¿¬ÀÌ¾î ³ª¿Â´Ù¸é ÀÌ°ÍÀº ó¸®ÇÏ°í ÀÖ´Â ÅäÅ«ÀÇ ÀϺÎÀÌ´Ù. ¶Ç, ´ÙÀ½ ¹®ÀÚ°¡ °ø¶õÀ̳ª Ư¼ö ¹®ÀÚ¶ó¸é ÇöÀç ÅäÅ«ÀÇ ÀϺΰ¡ ¾Æ´Ï¶ó´Â ÆÇ´ÜÀÌ °¡´ÉÇÏ´Ù.

 

 ÀÌ°ÍÀº Àç¹ÌÀÖ´Â ¹®Á¦¸¦ ¹ß»ý½ÃŲ´Ù. ÀÔ·Â ½ºÆ®¸²ÀÇ µÚ ºÎºÐ¿¡ ÀÖ´Â ´ÙÀ½ ¹®ÀÚ¸¦ ¹Ì¸® Àоî ÆÇ´ÜÇÑ ÈÄ, ¾î¶»°Ô ´Ù½Ã ÀÔ·Â ½ºÆ®¸²À¸·Î µÇµ¹¸± ¼ö ÀÖÀ¸¸ç, ÃßÈÄ ÀÌ ¹®ÀÚ¸¦ ¾î¶»°Ô ´Ù½Ã ÀÐÀ» ¼ö Àְڴ°¡?

 

 ÇÑ °¡Áö °¡´ÉÇÑ ¹æ¹ýÀº ´ÙÀ½ ¹®ÀÚ¸¦ ÇϳªÀÇ ¹®ÀÚ º¯¼ö¿¡ ÀúÀåÇÏ°í Ç÷¡±×¸¦ ¼³Á¤ÇÏ´Â °ÍÀÌ´Ù. ¿ì¸®´Â getchar°¡ Ç÷¡±×¸¦ °Ë»çÇÏ¿© ¼³Á¤µÇ¾î ÀÖÀ» °æ¿ì¿¡´Â ÀÔ·Â ¹öÆÛ ´ë½Å ¹®ÀÚ º¯¼ö¿¡¼­ ¹ÙÀÌÆ®¸¦ ÀÐ¾î ¿À°í Ç÷¡±×¸¦ Ŭ¸®¾î Çϵµ·Ï ¼öÁ¤ ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ó¸® ¼Óµµ´Â ÀúÇ쵃 °ÍÀÌ´Ù.

 

 C ¾ð¾î¿¡´Â ungetc() ÇÔ¼ö°¡ Àִµ¥, ÀÌ ÇÔ¼ö°¡ ¹Ù·Î À§¿Í °°Àº ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. ¿ì¸® Äڵ忡¼­ ÀÌ·¯ÇÑ ±â´ÉÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Â °¡Àå ºü¸¥ ¹æ¹ýÀº ¹«¾ùÀϱî? ÇÊÀÚ´Â µ¶Àڵ鿡°Ô ¾ÕÀ¸·Î µ¹¾Æ°¡¼­ getchar ÇÁ·Î½ÃÁ®ÀÇ ±¸ÇöÀ» »ìÆ캸°í Çѹø °í¹ÎÇØ º¸±â¸¦ ±ÇÇÏ°í ½Í´Ù. ±×¸®°í ³ª¼­ »ý°¢ÀÌ Á¤¸®µÇ¸é ÇÊÀÚÀÇ ÇØ°á ¹æ¹ýÀ» º¸¾Æ Áֱ⠹ٶõ´Ù.

 

¹Ì¸® ÀÐÀº ¹®ÀÚ¸¦ ´Ù½Ã ½ºÆ®¸²À¸·Î µ¹·Á ³õ´Â ÀÏÀº ó¸®ÇÒ ¹öÆÛÀÇ ½ÃÀÛÀ¸·Î ¾î¶² ¹®ÀÚºÎÅÍ ÇÒ °ÍÀ̳ÄÀÇ ¹®Á¦·Î ±Í°áµÈ´Ù.

 

¸ÕÀú EBXÀÇ °ªÀ» °Ë»çÇÏ¿© ¹öÆÛ°¡ ºñ¾î ÀÖ´ÂÁö ¿©ºÎ¸¦ °Ë»çÇϴµ¥, EBXÀÇ °ªÀÌ 0ÀÌ¸é  read ÇÁ·Î½ÃÁ®¸¦ È£ÃâÇÑ´Ù.

 

ÇÁ·Î±×·¥ÀÌ Ã³¸®ÇÒ ¹®ÀÚ°¡ ÀÖ´Ù¸é lodsb¸¦ »ç¿ëÇÏ°í EBXÀÇ °ªÀ» °¨¼Ò½ÃŲ´Ù. lodsb ¸í·É¾î´Â ´ÙÀ½ÀÇ ÄÚµå¿Í µ¿ÀÏÇÑ ÀÏÀ» ¼öÇàÇÑ´Ù.

 
 mov al, [esi]
 inc esi

 

Àоî¿Â ¹ÙÀÌÆ®´Â read ÇÁ·Î½ÃÁ®°¡ È£ÃâµÇ±â Àü¿¡´Â ¿©ÀüÈ÷ ¹öÆÛ¿¡ ³²¾Æ ÀÖ´Ù. ÇÁ·Î±×·¥Àº read°¡ ¾ðÁ¦ È£ÃâµÉÁö Á¤È®È÷ ¾Ë ¼ö ¾øÁö¸¸ getchar°¡ ´Ù½Ã È£ÃâµÇ±â Àü¿¡´Â readµµ È£ÃâµÇÁö ¾Ê´Â´Ù´Â °Í Á¤µµ´Â ¾Ë°í ÀÖ´Ù. µû¶ó¼­ ¸¶Áö¸·À¸·Î Àоú´ø ¹®ÀÚ¸¦ ´Ù½Ã ÀÔ·Â ½ºÆ®¸²À¸·Î µÇµ¹¸®±â À§Çؼ­ ÇØ¾ß ÇÏ´Â ÀÏÀº ESI ·¹Áö½ºÅÍÀÇ °ªÀ» °¨¼Ò½ÃÅ°°í EBX ·¹Áö½ºÅÍÀÇ °ªÀ» Áõ°¡½ÃÅ°´Â °ÍÀÌ´Ù.

 

ungetc:
 dec esi
 inc ebx
 ret

 

ÇÏÁö¸¸ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¸¸¾à ¹Ì¸® º¸¾Æ¾ß ÇÒ ¹®ÀÚ°¡ Çѹø¿¡ ±â²¯ ÇÑ ¹®ÀÚ¶ó¸é º° ¹®Á¦ ¾ø°ÚÁö¸¸ ÇÑ °³ ÀÌ»óÀÇ ¹®ÀÚ¸¦ ¹Ì¸® º¸¾Æ¾ß ÇÑ´Ù¸é ungetc ÇÁ·Î½ÃÁ®°¡ ¿©·¯ ¹ø ¹Ýº¹ÇÏ¿© È£ÃâµÈ´Ù. ´ëºÎºÐÀÇ °æ¿ì ÀÌ·¯ÇÑ °æ¿ì¿¡µµ ¹®Á¦°¡ ¾ø°ÚÁö¸¸ ¸ðµç °æ¿ì¿¡ Á¤»ó µ¿ÀÛÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ¿Ö ±×·²±î?

 

getchar´Â read¸¦ ±»ÀÌ È£ÃâÇÏÁö ¾Ê¾Æµµ µ¿ÀÛÇϱ⠶§¹®¿¡ ¹Ì¸® Àоú´ø ¹ÙÀÌÆ®µéÀº ¿©ÀüÈ÷ ¹öÆÛ¿¡ ³²¾Æ ÀÖÀ¸¸ç ´ç¿¬È÷ ungetc ÇÁ·Î½ÃÁ®µµ Á¤»óÀûÀ¸·Î µ¿ÀÛÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ getchar°¡ read¸¦ È£ÃâÇÏ¸é ¹öÆÛÀÇ ³»¿ëÀÌ º¯ÇÑ´Ù.

 

ÇÁ·Î±×·¥Àº Ç×»ó getchar·Î ÀÐÀº ¸¶Áö¸· ¹ÙÀÌÆ®¿¡ ´ëÇØ Á¤»óÀûÀ¸·Î µ¿ÀÛÇÑ ungetc¿¡ ÀÇÁ¸ÇÒ ¼ö ÀÖÁö¸¸ Àü¿¡ Àоú´ø °ªµé¿¡ ÀÇÁ¸ÇÒ ¼ø ¾ø´Ù.

 

¸¸¾à ÇÁ·Î±×·¥ÀÌ ÇÑ ¹ÙÀÌÆ® ÀÌ»óÀ» ¹Ì¸® ÀÐ¾î µéÀδٸé ÇÁ·Î±×·¡¸Ó´Â ¾î·µç µÎ °¡ÁöÀÇ ¼±ÅÃÀ» ÇØ¾ß ÇÑ´Ù.

 

°¡´ÉÇÏ´Ù¸é ÇÁ·Î±×·¥À» ÇÑ ¹ÙÀÌÆ®¸¸À» ¹Ì¸® ÀÐ¾î µéÀ̵µ·Ï ¼öÁ¤ÇÑ´Ù. ÀÌ°ÍÀÌ °¡Àå °£´ÜÇÑ ¹æ¹ýÀÌ´Ù.

 

¼öÁ¤ÀÌ ºÒ°¡´ÉÇÏ´Ù¸é ¹«¾ùº¸´Ù ¸ÕÀú ÇÁ·Î±×·¥ÀÌ Çѹø¿¡ ÀÔ·Â ½ºÆ®¸²À¸·Î µÇµ¹·Á¾ß ÇÏ´Â ¹®ÀÚÀÇ ÃÖ´ë ¼ö¸¦ °áÁ¤ÇØ¾ß ÇÑ´Ù. ÃÖ´ë ¼ö´Â 16ÀÇ ¹è¼ö·Î ¸¸µé¾î ³õ´Â °ÍÀÌ ÁÁÀºµ¥, 16ÀÇ ¹è¼ö°¡ ¸Þ¸ð¸®¿¡ÀÇ ¿öµå ´ÜÀ§À̱⠶§¹®¿¡ Á¤·ÄÀÌ È¿À²ÀûÀÌ´Ù. ±×¸®°í ÄÚµåÀÇ .bss ¼½¼ÇÀ» ¼öÁ¤ÇÏ°í spare¶ó´Â ¹öÆÛ¸¦ ÀÔ·Â ¹öÆÛ ¹Ù·Î ¾Õ¿¡ ¼±¾ðÇÑ´Ù.

 

section .bss
 resb 16 ; or whatever the value you came up with
ibuffer resb BUFSIZE

obuffer             resb             BUFSIZE

 

¶Ç ÇÁ·Î±×·¥À» ¹Ì¸® ÀÐÀº ¹ÙÀÌÆ® °ªÀ» AL ·¹Áö½ºÅÍ¿¡ ÀúÀåÇÏ´Â °ÍÀ¸·Î ¼öÁ¤ÇÑ´Ù.

 

ungetc:
 dec esi
 inc ebx
 mov [esi], al
 ret

 

Chapter 9 – Command Line Arguments

 Ä¿¸Çµå ¶óÀÎ(command line)¿¡¼­ ÀԷ°ú Ãâ·Â ÆÄÀÏÀÇ À̸§À» ³Ñ°Ü ¹ÞÀ» ¼ö ÀÖ´Ù¸é hex ÇÁ·Î±×·¥Àº ´õ¿í À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

 À¯´Ð½º ½Ã½ºÅÛÀº ÇÁ·Î±×·¥À» ½ÃÀÛ ½ÃÅ°±â Àü¿¡ ½ºÅÿ¡ ¸î °³ÀÇ µ¥ÀÌÅ͸¦ Ǫ½ÃÇØ ³õ°í ÇÁ·Î±×·¥ÀÇ _startÀÌ ÀÖ´Â ºÎºÐÀ¸·Î ºÐ±âÇÑ´Ù. ÇÊÀÚ´Â ºÐ¸í ºÐ±â(jump)ÇÑ´Ù°í Çߴµ¥, ºÐ±â¿Í È£Ãâ(call)Àº ´Ù¸£´Ù´Â »ç½Ç¿¡ À¯ÀÇÇØ¾ß ÇÑ´Ù. ÀÌ°ÍÀº [esp+offset]À» Àаųª µ¥ÀÌÆ®¸¦ ½ºÅÿ¡ ÆË ¿¬»êÀ» Àû¿ëÇÏ¿© µ¥ÀÌÅÍ¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù´Â »ç½ÇÀ» ÀǹÌÇÑ´Ù.

 

 ½ºÅÃÀÇ »ó´Ü(top)¿¡´Â Ä¿¸Çµå ¶óÀÎ ÀÎÀÚÀÇ ¼ö°¡ ÀúÀåµÇ¾î ÀÖ´Ù. ÀÌ°ÍÀº º¸Åë argc¶ó°í ºÒ·È´Ù.(argument count)

 

 Ä¿¸Çµå ¶óÀÎ ÀÎÀÚµéÀº ¹Ù·Î ¿¬À̾î argc ¸¸Å­ ÀúÀåµÇ´Âµ¥, ÀÌ ÀÎÀÚµéÀº º¸Åë argv (argument values)¶ó´Â À̸§À¸·Î ÂüÁ¶µÈ´Ù. Áï, argv[0], argv[1], ..., argv[argc-1] °°Àº Çü½ÄÀ¸·Î ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ °ªµéÀº ½ÇÁ¦ ÀÎÀÚ°¡ ¾Æ´Ï¶ó ÀÎÀÚ¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. (½Ç ÀÎÀÚÀÇ ¸Þ¸ð¸® ÁÖ¼ÒÀÌ´Ù.) ±×¸®°í ÀÎÀÚµéÀº NULLÀ» Á¾·á ¹®ÀÚ·Î ÇÏ´Â ¹®ÀÚ¿­ÀÌ´Ù.

 

 argv ¸®½ºÆ®ÀÇ ³¡Àº NULL Æ÷ÀÎÅÍ°¡ ¼³Á¤µÇ¾î ÀÖ´Ù. Áï Æ÷ÀÎÅÍ °ªÀ¸·Î 0ÀÌ ¼³Á¤µÇ¾î ÀÖ´Ù´Â ¶æÀÌ´Ù. Ä¿¸Çµå ¶óÀÎ ÀÎÀÚ¿¡ ´ëÇؼ­´Â ÇÒ ¸»ÀÌ ¸¹Áö¸¸ ¿ì¸®ÀÇ ¸ñÀû¿¡´Â ÀÌ Á¤µµÀÇ ³»¿ëÀ¸·Î ÃæºÐÇÏ´Ù.

            

N.B.: MS DOS ÇÁ·Î±×·¡¹Ö ȯ°æ¿¡ Àͼ÷ÇÑ »ç¶÷µé¿¡°Ô À¯´Ð½º ȯ°æ°úÀÇ °¡Àå Å« Â÷ÀÌÁ¡Àº  °¢ ÀÎÀÚµéÀÌ ºÐ¸®µÈ ¹®ÀÚ¿­·Î ±¸¼ºµÇ¾î ÀÖ´Ù´Â °ÍÀÌ°í, µÎ ¹ø° Â÷ÀÌÁ¡Àº ¹ÞÀ» ¼ö ÀÖ´Â ÀÎÀÚÀÇ ¼ö¿¡´Â ¾î¶² ÇÑ°è°¡ ¾ø´Ù´Â °ÍÀÌ´Ù.

 

 ÀÌ Á¤µµ ¾Ë¾Ò´Ù¸é hex.asmÀÇ ´ÙÀ½ ¹öÁ¯À» Á¦ÀÛÇÒ Áغñ´Â ³¡³­ °ÍÀÌ´Ù. ÇÏÁö¸¸ ´ÙÀ½ ¹öÁ¯ Á¦ÀÛ¿¡ µé¾î°¡±â¿¡ ¾Õ¼­ system.inc ÆÄÀÏ¿¡ ¸î °³ÀÇ ¶óÀÎÀ» Ãß°¡ÇØ¾ß ÇÑ´Ù.

 

¸ÕÀú ½Ã½ºÅÛ ÄÝ ¹øÈ£ ¸®½ºÆ®¿¡ µÎ °³ÀÇ »õ·Î¿î ¿£Æ®¸®¸¦ Ãß°¡ÇÑ´Ù.

%define SYS_open 5
%define SYS_close 6

 

±×¸®°í ÆÄÀÏÀÇ ³¡¿¡ µÎ°³ÀÇ ¸ÅÅ©·Î¸¦ Ãß°¡ÇÑ´Ù.

 

%macro sys.open 0
 system SYS_open
%endmacro
 
%macro sys.close 0
 system SYS_close
%endmacro

 

´ÙÀ½ÀÌ ¼öÁ¤µÈ ¹öÁ¯ÀÇ hex.asm ÄÚµåÀÌ´Ù.

 

%include 'system.inc'
 
%define BUFSIZE 2048
 
section .data
fd.in dd stdin
fd.out dd stdout
hex db '0123456789ABCDEF'
 
section .bss
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
 
section .code
align 4
err:
 push dword 1  ; return failure
 sys.exit
 
align 4
global _start
_start:
 add esp, byte 8 ; discard argc and argv[0]
 
 pop ecx
 jecxz .init  ; no more arguments
 
 ; ECX contains the path to input file
 push dword 0  ; O_RDONLY
 push ecx
 sys.open
 jc err  ; open failed
 
 add esp, byte 8
 mov [fd.in], eax
 
 pop ecx
 jecxz .init  ; no more arguments
 
 ; ECX contains the path to output file
 push dword 420 ; file mode (644 octal)
 push dword 0200h | 0400h | 01h
 ; O_CREAT | O_TRUNC | O_WRONLY
 push ecx
 sys.open
 jc err
 
 add esp, byte 12
 mov [fd.out], eax
 
.init:
 sub eax, eax
 sub ebx, ebx
 sub ecx, ecx
 mov edi, obuffer
 
.loop:
 ; read a byte from input file or stdin
 call getchar
 
 ; convert it to hex
 mov dl, al
 shr al, 4
 mov al, [hex+eax]
 call putchar
 
 mov al, dl
 and al, 0Fh
 mov al, [hex+eax]
 call putchar
 
 mov al, ' '
 cmp dl, 0Ah
 jne .put
 mov al, dl
 
.put:
 call putchar
 cmp al, dl
 jne .loop
 call write
 jmp short .loop
 
align 4
getchar:
 or ebx, ebx
 jne .fetch
 
 call read
 
.fetch:
 lodsb
 dec ebx
 ret
 
read:
 push dword BUFSIZE
 mov esi, ibuffer
 push esi
 push dword [fd.in]
 sys.read
 add esp, byte 12
 mov ebx, eax
 or eax, eax
 je .done
 sub eax, eax
 ret
 
align 4
.done:
 call write  ; flush output buffer
 
 ; close files
 push dword [fd.in]
 sys.close
 
 push dword [fd.out]
 sys.close
 
 ; return success
 push dword 0
 sys.exit
 
align 4
putchar:
 stosb
 inc ecx
 cmp ecx, BUFSIZE
 je write
 ret
 
align 4
write:
 sub edi, ecx ; start of buffer
 push ecx
 push edi
 push dword [fd.out]
 sys.write
 add esp, byte 12
 sub eax, eax
 sub ecx, ecx ; buffer is empty now
 ret

 

 À̹ø ¹öÁ¯¿¡¼­´Â fd.in°ú fd.outÀ̶ó´Â µÎ °³ÀÇ º¯¼ö¸¦ .data ¼½¼Ç¿¡ Ãß°¡Çߴµ¥, ÀÌ º¯¼öµéÀº ÀԷ°ú Ãâ·Â ÆÄÀÏ ±â¼úÀÚ¸¦ ÀúÀåÇϴµ¥ »ç¿ëµÈ´Ù.

 

 .code ¼½¼Ç¿¡¼­´Â stdin°ú stdoutÀ» [fd.in]°ú [fd.out]°ú °°Àº ÂüÁ¶·Î ´ëü ½ÃÄ×´Ù.

 

 À̹ø ¹öÁ¯ÀÇ .code ¼½¼ÇÀº °£´ÜÇÑ ¿¡·¯ Çڵ鷯·Î ½ÃÀ۵Ǵµ¥, ÀÌ Çڵ鷯´Â 1À» ¸®ÅÏÇϸç ÇÁ·Î±×·¥À» Á¾·á ½ÃÅ°´Â ´Ü¼øÇÑ ÀÏÀ» ÇÑ´Ù. ¿¡·¯ Çڵ鷯´Â _start ¾Õ¿¡ Àֱ⠶§¹®¿¡ ¿¡·¯°¡ ¹ß»ýÇÑ °÷¿¡¼­ °¡±õ°Ô À§Ä¡ÇÑ´Ù.

 

´ç¿¬ÇÑ ¸»ÀÌÁö¸¸ ÇÁ·Î±×·¥Àº ¿©ÀüÈ÷ _start¿¡¼­ ½ÃÀÛÇÑ´Ù. ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÇ¸é ¸ÕÀú ½ºÅÿ¡¼­ argc¿Í argv[0]À» Á¦°ÅÇÑ´Ù. ÀÌ °ªµéÀº ¿ì¸® ÇÁ·Î±×·¥¿¡¼­´Â »ç¿ëµÇÁö ¾Ê´Â´Ù.

 

±× ÈÄ argv[1]À» ÆËÇÏ¿© ECX ·¹Áö½ºÅÍ¿¡ ÀúÀåÇϴµ¥, ÀÌ°ÍÀº jecxz·Î NULL Æ÷ÀÎÅ͸¦ ´Ù·ê ¼ö ÀÖ´Â °Íó·³ ECX ·¹Áö½ºÅÍ°¡ Æ÷ÀÎÅÍ ¿¬»ê¿¡ ƯÈ÷ ÀûÇÕÇϱ⠶§¹®ÀÌ´Ù. ¸¸¾à argv[1]ÀÌ NULLÀÌ ¾Æ´Ï¶ó¸é ÇÁ·Î±×·¥Àº ù¹ø° ÀÎÀÚ¸¦ À̸§À¸·Î °®´Â ÆÄÀÏÀ» ¿¬´Ù. ±×¸®°í argv[1]ÀÌ NULLÀ̶ó¸é ÀÌÀü ¹öÁ¯ÀÇ ÇÁ·Î±×·¥µµ µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÑ´Ù.(stdin¿¡¼­ Àо stdoutÀ¸·Î Ãâ·ÂÇÏ´Â ¹öÁ¯) ÀÔ·Â ÆÄÀÏÀ» ¿­Áö ¸øÇÏ°Ô µÇ¸é (°¡·É ±×·± À̸§ÀÇ ÆÄÀÏÀÌ ¾ø´Â ÀÌÀ¯·Î) ¿¡·¯ Çڵ鷯·Î ºÐ±âÇÏ°í ÇÁ·Î±×·¥À» Á¾·áÇÏ°Ô µÈ´Ù.

 

ÀÌ¿Í´Â ´Þ¸® ù¹ø° ÀÎÀÚ °Ë»ç¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÏÁö ¾ÊÀ¸¸é µÎ ¹ø° ÀÎÀÚ¸¦ °Ë»çÇÑ´Ù. ¿ª½Ã µÎ ¹ø° ÀÎÀÚ°¡ ÀÖ´Ù¸é ÆÄÀÏÀ» ¿¬´Ù. ±×¸®°í µÎ ¹ø° ÀÎÀÚ°¡ ¾ø´Ù¸é stdoutÀ¸·Î °á°ú¸¦ Ãâ·ÂÇÑ´Ù. ¸¶Âù°¡Áö·Î Ãâ·Â ÆÄÀÏÀ» ¿­Áö ¸øÇÏ´Â »óȲÀÌ ¹ß»ýÇÏ¸é ¿¡·¯ Çڵ鷯·Î ºÐ±âÇÑ´Ù.(ÆÄÀÏÀÌ ÀÖ´Ù Çصµ ÆÄÀÏÀÇ ¾²±â Çã°¡±Ç-permisiion-°¡ ¾ø´Ù¸é ÆÄÀÏÀ» ¿­ ¼ö ¾øÀ» °ÍÀÌ´Ù.)

 

ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ ¶§, ¿­¾ú´ø ÆÄÀϵéÀ» ´Ý´Â´Ù´Â »ç½ÇÀ» Á¦¿ÜÇϸé ÄÚµåÀÇ ³ª¸ÓÁö´Â ÀÌÀü ¹öÁ¯°ú µ¿ÀÏÇÏ´Ù. ÀÌ¹Ì ¾ð±ÞÇÑ ¹Ù¿Í °°ÀÌ [fd.in]°ú [fd.out]À» »ç¿ëÇß´Ù´Â »ç½Ç¿¡ ÁÖ¸ñÇ϶ó.

 

ÀÌ ÇÁ·Î±×·¥ÀÇ ½ÇÇà ÆÄÀÏÀº ÀÌÁ¦ 768 ¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °®´Â´Ù.

 

¿©ÀüÈ÷ °³¼±ÇÒ Á¡ÀÌ Àִ°¡? ¹°·ÐÀÌ´Ù. ¸ðµç ÇÁ·Î±×·¥Àº ¾î¶² ¹æÇâÀ¸·Îµç °³¼±µÉ ¼ö ÀÖ´Ù. ÀÌ·± Àǹ̿¡¼­ ´ÙÀ½°ú °°ÀÌ °³¼±ÇÒ ¼ö ÀÖ´Â Á¡µéÀ» ¸ð¾Æ º¸¾Ò´Ù.

l        ¿¡·¯ Çڵ鷯°¡ stderr·Î ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤ÇÑ´Ù.

l        read¿Í write ±â´É¿¡ ´ëÇÑ ¿¡·¯ Çڵ鷯¸¦ Ãß°¡ÇÑ´Ù.

l        ÀÔ·Â ÆÄÀÏÀ» ¿­ ¶§ stdinÀ» ´Ý°í, Ãâ·Â ÆÄÀÏÀ» ¿­ ¶§ stdoutÀ» ´Ýµµ·Ï ¼öÁ¤ÇÑ´Ù.

l        -i ¿Í –o°°Àº Ä¿¸Çµå ¶óÀÎ ½ºÀ§Ä¡(command line switch)¸¦ Ãß°¡ÇÏ¿© ÀԷ°ú Ãâ·Â ÆÄÀÏÀ» ¾î¶² ¼ø¼­·Î ³ª¿­Çϰųª stdinÀ¸·Î Àаí ÆÄÀÏ¿¡ ¾²´Â µîÀÇ ºÎ°¡ÀûÀÎ ±â´ÉÀ» Á¦°øÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤ÇÑ´Ù.

l        Ä¿¸Çµå ¶óÀÎ ÀÎÀÚ°¡ ºÎÀûÀýÇÏ¸é »ç¿ë ¹æ¹ýÀ» Ãâ·ÂÇØ ÁÖµµ·Ï ¼öÁ¤ÇÑ´Ù.

 

ÇÊÀÚ´Â ÀÌ·¯ÇÑ Ãß°¡ »çÇ×À» µ¶ÀÚ¿¡°Ô °úÁ¦·Î ³²°ÜµÑ »ý°¢ÀÌ´Ù. µ¶ÀÚµéÀº ÀÌ¹Ì À§¿Í °°Àº ±â´ÉÀ» ±¸ÇöÇϴµ¥ ÇÊ¿äÇÑ ¸ðµç Áö½ÄÀ» °®Ãß°í ÀÖ´Ù.

 

Chapter 10 – Unix Enviroment

À¯´Ð½ºÀÇ °³³ä Áß Áß¿äÇÑ °ÍÀ¸·Î ȯ°æ(enviroment)¸¦ µé ¼ö Àִµ¥, ÀÌ´Â ¿©·¯ ȯ°æ º¯¼ö(enviroment variable)·Î Á¤ÀǵȴÙ. ȯ°æ º¯¼ö Áß ÀϺδ ½Ã½ºÅÛÀÌ ¼³Á¤Çϸç, ¶Ç ÀϺδ »ç¿ëÀÚ, ½©(shell), ´Ù¸¥ ÇÁ·Î±×·¥À» ·Îµå½ÃÅ°´Â ÇÁ·Î±×·¥ÀÌ ¼³Á¤ÇÑ´Ù.

 

10.1. How to Find Enviroment Variables

 ÇÊÀÚ´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§, ½ºÅÿ¡´Â argc, argv, ±×¸®°í ±× ¹ÛÀÇ ´Ù¸¥ °ªµéÀÌ ÀúÀåµÈ´Ù´Â »ç½ÇÀ» ¼³¸íÇÑ ¹Ù ÀÖ´Ù. ±× ¹ÛÀÇ ´Ù¸¥ °ªÀ̶ó´Â °ÍÀÌ ¹Ù·Î ȯ°æ(enviroment), º¸´Ù Á¤È®È÷ ¸»ÇÏÀÚ¸é NULL·Î ³¡³ª´Â ȯ°æ º¯¼öÀÇ ¹è¿­À» °¡¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. ÀÌ °ªÀº º¸Åë env¶ó´Â º¯¼ö·Î ÂüÁ¶µÈ´Ù.

 

 envÀÇ ±¸Á¶´Â NULL·Î ³¡³ª´Â ¸Þ¸ð¸® ÁÖ¼ÒÀÇ ¸®½ºÆ®ÀÎ argv¿Í µ¿ÀÏÇÏÁö¸¸ envc°¡ ¾ø´Ù´Â »ç½ÇÀÌ ´Ù¸£´Ù. ÇÏÁö¸¸ NULL °ªÀ» °Ë»öÇÏ¸é ¿ø¼ÒÀÇ ¼ö¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.

 

ÀÌ º¯¼ö´Â º¸Åë name=value ÇüÅ·ΠÀúÀåµÇÁö¸¸ ¾î¶² ȯ°æ º¯¼öµéÀº =ÀÌ ¾øÀÌ ÀúÀåµÇ±âµµ ÇÑ´Ù. µû¶ó¼­ ÀÌ °¡´É¼ºÀ» °í·ÁÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.

 

10.2. webvar

 ÀÌ Àý¿¡¼­ ÇÊÀÚ´Â À¯´Ð½ºÀÇ env ¸í·É¾î°¡ µ¿ÀÛÇÏ´Â °Íó·³ ȯ°æ º¯¼öµéÀ» Ãâ·ÂÇØ ÁÙ ¼ö ÀÖ´Â Äڵ带 ÀÛ¼ºÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ÇÁ·Î±×·¥À» °£´ÜÇÑ ¾î¼Àºí¸® CGI À¯Æ¿¸®Æ¼·Î ÀÛ¼ºÇØ º¸´Â °Íµµ Àç¹ÌÀÖ´Â ÀÛ¾÷À̸®¶ó »ý°¢ÇÑ´Ù.

 

10.2.1. CGI: A Quick Overview

 ÇÊÀڴ ȨÆäÀÌÁö¿¡ ÀÚ¼¼ÇÑ CGI Æ©Å丮¾óÀ» ¿Ã·Á ³õ¾ÒÁö¸¸ ¿©±â¿¡¼­ CGI¸¦ °£´ÜÈ÷ ¼Ò°³ÇÏ°Ú´Ù.

l        À¥ ¼­¹ö(web server)´Â ȯ°æ º¯¼ö¸¦ ¼³Á¤ÇÔÀ¸·Î½á CGI ÇÁ·Î±×·¥°ú Åë½ÅÇÑ´Ù.

l        CGI ÇÁ·Î±×·¥Àº Ãâ·Â °á°ú¸¦ stdoutÀ¸·Î º¸³½´Ù. ±×¸®°í À¥ ¼­¹ö´Â stdout¿¡¼­ Ãâ·Â °á°ú¸¦ ÀÐ¾î µéÀδÙ.

l        HTTP Çì´õ µÎ °³ÀÇ°ø¹é ¶óÀÎ ´ÙÀ½¿¡ ½ÃÀ۵Ǿî¾ß ÇÑ´Ù.

l        ±×¸®°í HTML Äڵ带 Ãâ·ÂÇÑ´Ù.

 

N.B.: ƯÁ¤ ȯ°æ º¯¼öµéÀº Ç¥ÁØ À̸§À» »ç¿ëÇÏÁö¸¸ ÀϺΠº¯¼öµéÀº À¥ ¼­¹ö¿¡ µû¶ó ´Ù¸¥ À̸§ÀÌ »ç¿ëµÈ´Ù. µû¶ó¼­ webvars ÇÁ·Î±×·¥Àº ÀÌ·¯ÇÑ Á¡À» Áø´ÜÇÏ´Â À¯¿ëÇÑ µµ±¸°¡ µÉ °ÍÀÌ´Ù.

 

 ÄÚµå´Â ´ÙÀ½°ú °°´Ù. ÇÊÀÚ´Â Äڵ忡 ¹Ù·Î ÁÖ¼®°ú ¼³¸íÀ» ºÙ¿© ³õ¾Ò´Ù.

 

;;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Copyright (c) 2000 G. Adam Stanislav
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions
; are met:
; 1. Redistributions of source code must retain the above copyright
;    notice, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
;    notice, this list of conditions and the following disclaimer in the
;    documentation and/or other materials provided with the distribution.
;
; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
; ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
; SUCH DAMAGE.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Version 1.0
;
; Started:  8-Dec-2000
; Updated:  8-Dec-2000
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%include 'system.inc'
 
section .data
http db 'Content-type: text/html', 0Ah, 0Ah
 db '<?xml version="1.0" encoding="UTF-8"?>', 0Ah
 db '<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML Strict//EN" '
 db '"DTD/xhtml1-strict.dtd">', 0Ah
 db '<html xmlns="http://www.w3.org/1999/xhtml" '
 db 'xml.lang="en" lang="en">', 0Ah
 db '<head>', 0Ah
 db '<title>Web Environment</title>', 0Ah
 db '<meta name="author" content="G. Adam Stanislav" />', 0Ah
 db '</head>', 0Ah, 0Ah
 db '<body bgcolor="#ffffff" text="#000000" link="#0000ff" '
 db 'vlink="#840084" alink="#0000ff">', 0Ah
 db '<div class="webvars">', 0Ah
 db '<h1>Web Environment</h1>', 0Ah
 db '<p>The following <b>environment variables</b> are defined '
 db 'on this web server:</p>', 0Ah, 0Ah
 db '<table align="center" width="80" border="0" cellpadding="10" '
 db 'cellspacing="0" class="webvars">', 0Ah
httplen equ $-http
left db '<tr>', 0Ah
 db '<td class="name"><tt>'
leftlen equ $-left
middle db '</tt></td>', 0Ah
 db '<td class="value"><tt><b>'
midlen equ $-middle
undef db '<i>(undefined)</i>'
undeflen equ $-undef
right db '</b></tt></td>', 0Ah
 db '</tr>', 0Ah
rightlen equ $-right
wrap db '</table>', 0Ah
 db '</div>', 0Ah
 db '</body>', 0Ah
 db '</html>', 0Ah, 0Ah
wraplen equ $-wrap
 
section .code
global _start
_start:
 ; First, send out all the http and xhtml stuff that is
 ; needed before we start showing the environment
 push dword httplen
 push dword http
 push dword stdout
 sys.write
 
 ; Now find how far on the stack the environment pointers
 ; are. We have 12 bytes we have pushed before "argc"
 mov eax, [esp+12]
 
 ; We need to remove the following from the stack:
 ;
 ; The 12 bytes we pushed for sys.write
 ; The  4 bytes of argc
 ; The EAX*4 bytes of argv
 ; The  4 bytes of the NULL after argv
 ;
 ; Total:
 ; 20 + eax * 4
 ;
 ; Because stack grows down, we need to ADD that many bytes
 ; to ESP.
 lea esp, [esp+20+eax*4]
 cld  ; This should already be the case, but let's be sure.
 
 ; Loop through the environment, printing it out
.loop:
 pop edi
 or edi, edi ; Done yet?
 je near .wrap
 
 ; Print the left part of HTML
 push dword leftlen
 push dword left
 push dword stdout
 sys.write
 
 ; It may be tempting to search for the '=' in the env string next.
 ; But it is possible there is no '=', so we search for the
 ; terminating NUL first.
 mov esi, edi ; Save start of string
 sub ecx, ecx
 not ecx  ; ECX = FFFFFFFF
 sub eax, eax
repne scasb
 not ecx  ; ECX = string length + 1
 mov ebx, ecx ; Save it in EBX
 
 ; Now is the time to find '='
 mov edi, esi ; Start of string
 mov al, '='
repne scasb
 not ecx
 add ecx, ebx ; Length of name
 
 push ecx
 push esi
 push dword stdout
 sys.write
 
 ; Print the middle part of HTML table code
 push dword midlen
 push dword middle
 push dword stdout
 sys.write
 
 ; Find the length of the value
 not ecx
 lea ebx, [ebx+ecx-1]
 
 ; Print "undefined" if 0
 or ebx, ebx
 jne .value
 
 mov ebx, undeflen
 mov edi, undef
 
.value:
 push ebx
 push edi
 push dword stdout
 sys.write
 
 ; Print the right part of the table row
 push dword rightlen
 push dword right
 push dword stdout
 sys.write
 
 ; Get rid of the 60 bytes we have pushed
 add esp, byte 60
 
 ; Get the next variable
 jmp .loop
 
.wrap:
 ; Print the rest of HTML
 push dword wraplen
 push dword wrap
 push dword stdout
 sys.write
 
 ; Return success
 push dword 0
 sys.exit

 

 ÀÌ ÄÚµå´Â 1396 ¹ÙÀÌÆ®ÀÇ ½ÇÇà Äڵ带 ¸¸µé¾î ³½´Ù. ÇÁ·Î±×·¥ÀÌ ¸¸µé¾î ³»´Â ´ëºÎºÐÀÇ µ¥ÀÌÅÍ´Â Ãâ·Â ÇØ¾ß ÇÏ´Â HTMLÀÌ´Ù.

 

¾î¼Àºí°ú ¸µÅ©´Â ´Ù¸¥ ÇÁ·Î±×·¥°ú ´Ù¸£Áö ¾Ê´Ù.

 

% nasm -f elf webvars.asm
% ld -s -o webvars webvars.o

 

ÀÌ ÇÁ·Î±×·¥À» »ç¿ëÇÏ·Á¸é webvars¸¦ À¥ ¼­¹ö¿¡ ¿Ã·Á¾ß ÇÑ´Ù. µû¶ó¼­ À¥ ¼­¹ö°¡ ¾î¶»°Ô ¼³Á¤ µÇ¾ú´À¾ß¿¡ µû¶ó webvars ½ÇÇà ÆÄÀÏÀ» cgi-binÀ̳ª .cgi µð·ºÅ丮¿¡ ÀúÀåÇØ µÎ¾î¾ß ÇÒ °ÍÀÌ´Ù.

 

±×¸®°í ºê¶ó¿ìÁ®(browser)·Î Ãâ·Â °á°ú¸¦ È®ÀÎÇ϶ó. ÇÊÀÚÀÇ À¥ ¼­¹ö¿¡¼­ÀÇ Ãâ·Â °á°ú¸¦ º¸°í ½Í´Ù¸é À¥ ºê¶ó¿ìÁ®·Î http://www.int80h.org/webvars/¿¡ Á¢¼ÓÇØ º¸±â ¹Ù¶õ´Ù. ¸ðµç °Ë»ö ¿£Áø¿¡ Ãâ·Â °á°ú¸¦ ³ª¿Àµµ·Ï ÇÏ°í ½ÍÁø ¾Ê±â ¶§¹®¿¡ ÀǵµÀûÀ¸·Î Á¤±Ô ¸µÅ©(regular link)¸¦ ¿©±â¿¡ ½ÆÁø ¾Ê¾Ò´Ù.

 

Chapter 11 – Working with Files

 ¿ì¸®´Â ÀÌ¹Ì ÆÄÀÏÀ» ´Ù·ç´Â ´ëÇÑ ±âº»ÀûÀÎ Áö½ÄÀº ¾ò¾ú´Ù. Áï, ÆÄÀÏÀ» ¿­°í, ´Ý°í, ¹öÆÛ¸¦ ÀÌ¿ëÇØ Àаí, ¾²´Â ¹æ¹ýÀ» ¾Ë°í ÀÖ´Ù. ÇÏÁö¸¸ À¯´Ð½º´Â ÆÄÀÏ¿¡ ´ëÇØ ´õ ¸¹Àº ±â´ÉÀ» Á¦°øÇÑ´Ù. ¿ì¸®´Â ÀÌ ¼½¼Ç¿¡¼­ ±× ±â´É Áß ÀϺθ¦ »ìÆì º¸°í À̸¦ ÀÌ¿ëÇÏ¿© ÆÄÀÏ º¯È¯ À¯Æ¿¸®Æ¼(file convention utility)¸¦ ÀÛ¼ºÇØ º¼ °ÍÀÌ´Ù.

 

ÀÛ¼ºÇØ¾ß ÇÒ ¸¶Áö¸· ¼ÒÇÁÆ®¿þ¾î°¡ ¾î¶² ±â´ÉÀ» ÃæÁ·½ÃÄÑ¾ß ÇÏ´Â Áö¸¦ ½ÃÀÛÇÒ ¶§ºÎÅÍ ¾Ë°í ÀÖ´Ù¸é ÇÁ·Î±×·¡¹ÖÀº ÈξÀ ½¬¿ö Áø´Ù.

 

ÇÊÀÚ°¡ À¯´Ð½º ȯ°æ¿¡¼­ ÀÛ¼ºÇß´ø ù¹ø° ÇÁ·Î±×·¥ Áß Çϳª°¡ tuc (text-to-Unix file converter)À̾ú´Ù. ÀÌ ÇÁ·Î±×·¥Àº ´Ù¸¥ ¿î¿µ üÁ¦¿¡¼­ ÀÛ¼ºµÈ ÅؽºÆ® ÆÄÀÏÀ» À¯´Ð½º ÅؽºÆ® ÆÄÀÏ·Î º¯È¯ÇØ ÁØ´Ù. Áï, ¶óÀÎÀÇ ³¡À» ±¸ºÐÇϴ Ư¼ö ¹®ÀÚ¸¦ ¼­·Î ´Ù¸£°Ô »ç¿ëÇÏ´Â ¿î¿µ üÁ¦µé »çÀÌ¿¡ ÅؽºÆ® ÆÄÀÏÀ» °øÀ¯ÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù.(À¯´Ð½º¿¡¼­ ÀÛ¼ºµÈ ÅؽºÆ® ÆÄÀÏÀ» MS DOS ¿ëÀ¸·Î º¯È¯ÇÒ ¼öµµ ÀÖ´Ù.) ÀÌ ÇÁ·Î±×·¥Àº ¿øº»°ú ´Ù¸¥ ÆÄÀÏ¿¡ °á°ú¸¦ ÀúÀåÇÑ´Ù.

 

ÇÊÀÚ´Â tucÀ» ¿©·¯ ¸ð·Î »ç¿ëÇØ ¿ÔÁö¸¸ Ç×»ó ´Ù¸¥ ¿î¿µÃ¼Á¦¿¡¼­ À¯´Ð½º·ÎÀÇ º¯È¯¸¸À» ¼öÇàÇØ ¿Ô´Ù. ÀÌ ¶§ °á°ú¸¦ ´Ù¸¥ ÆÄÀÏ·Î ¾²±â º¸´Ù´Â º¯È¯ÇÑ ÆÄÀÏ¿¡ µ¤¾î ¾²´Â °ÍÀÌ ³´°Ú´Ù´Â »ý°¢À» Ç×»ó ÇØ¿Ô´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡ ÇÊÀÚ´Â ´ÙÀ½°ú °°ÀÌ ÀÌ ÇÁ·Î±×·¥À» ÀÌ¿ëÇØ ¿Ô´Ù.

 

% tuc myfile tempfile

% mv tempfile myfile

 

ÀÌ ÇÁ·Î±×·¥À» ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï °³·®ÇÏ°í À̸§À» ftuc·Î Á¤ÇÏ¸é ´õ¿í ¾²±â ÆíÇÒ °ÍÀÌ´Ù.

 

% ftuc myfile

 

ÀÌ·± ÀÌÀ¯·Î ÀÌ Àå¿¡¼­´Â ¾î¼Àºí¸®·Î ftuc¸¦ ÀÛ¼ºÇÏ°í(¿ø·¡ tuc´Â C·Î ÀÛ¼ºµÇ¾ú´Ù.) Ä¿³ÎÀÌ ÇÁ·Î¼¼½º¿¡°Ô Á¦°øÇÏ´Â ´Ù¾çÇÑ ÆÄÀÏ ¼­ºñ½º¸¦ »ìÆ캼 °ÍÀÌ´Ù.

 

¾ð¶æ »ý°¢ÇØ º¸¸é ÆÄÀÏ º¯È¯Àº ¸Å¿ì °£´ÜÇÑ ÀÛ¾÷ÀÌ´Ù. ÇØ¾ß ÇÒ ÀÏÀº cr/lf(carrage return/line feed)¸¦ ´Ù¸¥ °³Çà ¹®ÀÚ·Î ¹Ù²ã ÁÖ´Â ÀÏ »ÓÀÌ´Ù. ¾È ±×·±°¡??

 

¸¸¾à °³Çà ¹®ÀÚ º¯È¯ »ÓÀ̶ó°í »ý°¢Çß´Ù¸é ´Ù½Ã Çѹø Àç°íÇØ º¸¾Æ¶ó. ÀÌ Á¢±Ù ¹æ¹ýÀº ´ëºÎºÐÀÇ °æ¿ì¿¡ µ¿ÀÛÇÏ°ÚÁö¸¸(Àû¾îµµ MS DOS ÅؽºÆ® ÆÄÀÏ¿¡¼­´Â) ¾î¶² °æ¿ì¿¡´Â À߸øµÈ µ¿ÀÛÀ» ¼öÇàÇÒ °ÍÀÌ´Ù.

 

¹®Á¦´Â ¸ðµç À¯´Ð½º ÀÌ¿ÜÀÇ ¿î¿µÃ¼Á¦¿¡¼­ ¸¸µé¾îÁö´Â ÅؽºÆ® ÆÄÀÏÀÌ cr/lf·Î ³¡³ªÁø ¾Ê´Â´Ù´Â °ÍÀÌ´Ù. ÀϺΠ¿î¿µÃ¼Á¦¿¡¼­´Â lf ¾øÀÌ cr¸¸À» »ç¿ëÇϸç, ÀϺδ ¿©·¯ °ø¹é ¶óÀÎÀ» ¿©·¯ °³ÀÇ lf¿Í cr ÇÑ °³·Î ´ëüÇϱ⵵ ÇÑ´Ù.

 

ÀÌ·¸°Ô º»´Ù¸é ÅؽºÆ® ÆÄÀÏ º¯È¯±â´Â ¶óÀÎÀÇ ³¡À» Ç¥½ÃÇÏ´Â ¸ðµç °¡´ÉÇÑ Á¶ÇÕÀ» ó¸®ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

l        cr/lf

l        cr

l        lf/cr

l        lf

 

¶ÇÇÑ À§ÀÇ Á¶°ÇµéÀÇ Á¶ÇÕ(¸î °³ÀÇ lf ´ÙÀ½¿¡ crÀÌ ³ª¿Â´ÙµçÁö.)À» »ç¿ëÇÏ´Â ÆÄÀÏÀ» ó¸®ÇØ¾ß ÇÒ °ÍÀÌ´Ù.

 

11.1. Finite State Machine

 ¹®Á¦´Â FSM(Finite State Machine)À̶ó´Â ±â¼úÀ» »ç¿ëÇÏ¸é ½±°Ô ÇØ°áµÈ´Ù. FSMÀº Ãâ·Â °ªÀÌ ÇöÀç »óÅ¿¡¼­ÀÇ ÀÔ·Â °ª »Ó ¾Æ´Ï¶ó ±× Àü ÀÔ·Â °ª¿¡µµ °ü·ÃµÇ¾î ÀÖ´Â µðÁöÅРȸ·ÎÀÌ´Ù. ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­´Â FSMÀÇ ÇÑ ¿¹°¡ µÈ´Ù. ¿ì¸®ÀÇ ¾î¼Àºí¸® ÄÚµå´Â ±â°è¾î·Î ¾î¼Àºí µÇ´Âµ¥, ÀÌ ±â°è¾î Áß ÀϺδ ¿©·¯ °³ÀÇ ¾î¼Àºí¸® Äڵ尡 ÇÑ ¹ÙÀÌÆ®ÀÇ ±â°è¾î¸¦ ¸¸µé¾î ³½ °ÍÀÏ ¼öµµ ÀÖ°í ÀϺδ ¿©·¯ °³ÀÇ ¾î¼Àºí¸® Äڵ尡 ¿©·¯ ¹ÙÀÌÆ®ÀÇ ±â°è¾î¸¦ ¸¸µé¾î ³½ °ÍÀÌ´Ù. ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­´Â ¸Þ¸ð¸®¿¡¼­ ´Ü°èÀûÀ¸·Î ¹ÙÀÌÆ®¸¦ ÆÐÄ¡(fetch)Çϴµ¥, ÆÐÄ¡µÈ ¹ÙÀÌÆ®ÀÇ ÀϺδ ¾î¶² °á°ú¸¦ ³»Áö ¾Ê°í ´ÜÁö »óŸ¸ º¯È­½ÃÅ°´Â °ÍµéÀÌ´Ù. ¸ðµç op code°¡ ÆÐÄ¡µÇ¸é ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­´Â ¾î¶² °á°ú¸¦ ¸¸µé¾î ³»°Å³ª ·¹Áö½ºÅÍÀÇ °ªÀ» º¯È­½Ãų °ÍÀÌ´Ù.

 

ÀÌ·± ÀÌÀ¯·Î ¸ðµç ¼ÒÇÁÆ®¿þ¾î´Â º»ÁúÀûÀ¸·Î ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­¸¦ À§ÇÑ »óÅ ¸í·É¾î(state instruction)ÀÇ ¿¬¼ÓÀÌ´Ù. ±×·³¿¡µµ ºÒ±¸ÇÏ°í FSMÀÇ °³³äÀº ¼ÒÇÁÆ®¿þ¾îÀÇ ¼³°è¿¡ Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù.

 

¿ì¸®ÀÇ ÅؽºÆ® ÆÄÀÏ º¯È¯±â´Â ¼¼ °¡ÁöÀÇ °¡´É »óÅ°¡ ÀÖ´Â FSMÀ¸·Î ¼³°èµÉ ¼ö ÀÖ´Ù. ¿ì¸®´Â ÀÌ·¯ÇÑ °¡´É »óŸ¦ »óÅ 0-2¶ó ºÎ¸¦ ¼ö ÀÖÁö¸¸ °¢°¢ÀÇ »óÅ¿¡ »ó¡ÀûÀÎ À̸§À» ºÎ¿©Çϸé Á» ´õ ÆíÇØÁú ¼ö ÀÖ´Ù.

l        ordinary

l        cr

l        lf

 

¿ì¸® ÇÁ·Î±×·¥Àº ordinary »óÅ¿¡¼­ ½ÃÀÛÇÑ´Ù. ÀÌ »óÅ¿¡ ÀÖ´Â µ¿¾È ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ ÀԷ¿¡ µû¶ó ´Ù¸¥ µ¿ÀÛÀ» ÇÑ´Ù.

 

l        ÀÔ·ÂÀÌ crÀ̳ª lfÀÌ¿ÜÀÇ ´Ù¸¥ °ªÀ̶ó¸é ±×´ë·Î Ãâ·ÂÇÒ »ÓÀ̸ç, »óŵµ º¯ÇÏÁö ¾Ê´Â´Ù.

l        ÀÔ·ÂÀÌ crÀÌ¸é »óÅ´ cr »óÅ·Πº¯ÇÏ°í, ÀÔ·Â °ªÀº ¹ö·ÁÁø´Ù. µû¶ó¼­ ¾Æ¹«·± Ãâ·Âµµ ¸¸µé¾î ÁöÁö ¾Ê´Â´Ù.

l        ÀÔ·ÂÀÌ lf¶ó¸é »óÅ´ lf·Î º¯ÇÏ°í, ÀÔ·Â °ªÀº ¹ö·ÁÁø´Ù.

 

cr »óÅ¿¡ ÀÖ´Â µ¿¾È¿¡´Â ¾Æ¹«·± ÀÛ¾÷µµ ¼öÇàµÇÁö ¾Ê´Âµ¥, ÀÌ°ÍÀº crÀÌ ¸¶Áö¸· ÀÔ·ÂÀ̱⠶§¹®ÀÌ´Ù. ÀÌ »óÅ¿¡ ÀÖ´Â ¿ì¸® ÇÁ·Î±×·¥Àº ÇöÀçÀÇ ÀԷ¿¡ µû¶ó ´Ù¸¥ µ¿ÀÛÀ» ÇÑ´Ù.

 

l        ÀÔ·ÂÀÌ crÀ̳ª lfÀÌ¿ÜÀÇ °ÍÀ̶ó¸é lf°ú ÀÔ·Â °ªÀ» Ãâ·ÂÇÏ°í »óŸ¦ ordinary·Î º¯°æÇÑ´Ù.

l        ÀÔ·ÂÀÌ crÀ̶ó¸é ÇÑ ÁÙ¿¡¼­ µÎ °³ ÀÌ»óÀÇ crÀ» ¹ÞÀº °ÍÀÌ´Ù. µû¶ó¼­ ÀÔ·ÂÀ» ¹ö¸®°í lf¸¦ Ãâ·ÂÇÑ´Ù. ÀÌ ¶§ »óÅ´ º¯°æ½ÃÅ°Áö ¾Ê´Â´Ù.

l        ÀÔ·ÂÀÌ lf¶ó¸é lf¸¦ Ãâ·ÂÇÏ°í »óŸ¦ ordinary·Î º¯°æ½ÃŲ´Ù. ÀÌ »óÅ°¡ À§ÀÇ Ã¹¹ø° »óȲ°ú °°Áö ¾ÊÀ½¿¡ À¯ÀÇÇ϶ó. ¸¸¾à µÎ »óȲÀ» °áÇÕ½ÃŲ´Ù¸é ÇÑ °³°¡ ¾Æ´Ñ µÎ °³ÀÇ lf¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù.

 

ÀÌÁ¦ ÇÁ·Î±×·¥Àº crÀ» ¹Þ°í¼­µµ 󸮵ÇÁö ¾ÊÀº lf¸¦ ¹ÞÀº ÈÄÀÇ lf »óÅ¿¡ ÀÖ´Ù. ÀÌ »óȲÀº (1)´ë»ó ÆÄÀÏÀÌ ÀÌ¹Ì À¯´Ð½º Çü½ÄÀ̰ųª (2)ÇÑ ÁÙ(row)¿¡ ÀÖ´Â ¿©·¯ ¶óÀÎÀ» ¿©·¯ °³ÀÇ lf¿Í ÇÑ °³ÀÇ cr·Î ó¸®ÇÑ °æ¿ì, ȤÀº (3) ¶óÀÎÀÌ lf/cr·Î ³¡³­ °æ¿ì¿¡ ÀϾ´Ù. ÀÌÁ¦ ÀÌ »óȲ¿¡¼­ µé¾î¿Â ÀÔ·ÂÀ» ´ÙÀ½°ú °°ÀÌ Ã³¸®ÇÒ ¼ö ÀÖ´Ù.

 

l        ÀÔ·ÂÀÌ cr¾Æ´Ï lf ÀÌ¿ÜÀÇ °ÍÀ̶ó¸é lf¿Í ÀÔ·Â °ªÀ» Ãâ·ÂÇÏ°í »óŸ¦ ordinary·Î º¯°æÇÑ´Ù. ÀÌ°ÍÀº Á¤È®È÷ cr »óÅ¿¡¼­ ¶È°°Àº ÀÔ·Â °ªÀ» ¹Þ¾ÒÀ» ¶§¿Í °°Àº µ¿ÀÛÀÌ´Ù.

l        ÀÔ·ÂÀÌ crÀ̸é ÀÔ·Â °ªÀ» ¹ö¸®°í lf¸¦ Ãâ·ÂÇÑ´Ù. ±×¸®°í »óŸ¦ orfinary·Î º¯°æ½ÃŲ´Ù.

l        ÀÔ·ÂÀÌ lf¶ó¸é lf¸¦ Ãâ·ÂÇÏ°í »óŸ¦ ±×´ë·Î ³öµÐ´Ù.

 

11.1.1. The Final State

À§ÀÇ FSMÀº Àüü ÆÄÀÏ¿¡ ´ëÇØ µ¿ÀÛÇÏÁö¸¸ ¸¶Áö¸· ¶óÀÎÀÌ ¹«½ÃµÉ °¡´É¼ºÀÌ ÀÖ´Ù. ÀÌ·¯ÇÑ »óȲÀº ÆÄÀÏÀÌ ÇϳªÀÇ crÀ̳ª lf·Î ³¡³¯ ¶§ ¹ß»ýÇÑ´Ù. ÇÊÀÚ´Â tuc¸¦ ¼³°èÇÒ ¶§ ÀÌ·¯ÇÑ »óȲÀ» °í·ÁÇÏÁö ¾Ê°í ¸¶Áö¸· ¶óÀÎÀ» Á¦°ÅÇß¾ú´Ù.

 

ÀÌ ¹®Á¦´Â Àüü ÆÄÀÏÀÌ Ã³¸®µÈ ÈÄÀÇ »óŸ¦ °Ë»çÇÏ¸é ½±°Ô ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à »óÅ°¡ ordinary°¡ ¾Æ´Ï¶ó¸é ´Ü¼øÈ÷ ¸¶Áö¸· lf¸¦ Ãâ·ÂÇÏ¸é µÈ´Ù.

 

N.B.: ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÉ ¾Ë°í¸®ÁòÀ» FSMÀ¸·Î Ç¥ÇöÇ߱⠶§¹®¿¡ ÆÄÀÏ º¯È¯ ¹®Á¦¸¦ ó¸®ÇÏ´Â µðÁöÅÐ ÀüÀÚ È¸·Î(digital electronic circuit)À» ½±°Ô ¼³°èÇÒ ¼ö ÀÖ´Ù. ¹°·Ð, ĨÀ» ¼³°èÇÏ°í ±¸ÇöÇÏ´Â °ÍÀº ¾î¼Àºí¸® ¾ð¾î·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °Íº¸´Ù ÈξÀ ¸¹Àº ³ë·ÂÀÌ µå´Â ÀÏÀÌ´Ù.

 

11.1.2. The Output Counter

ÆÄÀÏ º¯È¯ ÇÁ·Î±×·¥ÀÌ µÎ ¹®ÀÚ¸¦ °áÇÕÇÏ¿© ÇÑ ¹®ÀÚ·Î ¸¸µé±â ¶§¹®¿¡ Ãâ·Â Ä«¿îÅÍ(output counter)°¡ ÇÊ¿äÇÏ´Ù. ÇÁ·Î±×·¥¿¡¼­´Â 0À¸·Î ÃʱâÈ­ ½ÃÅ°°í ÇÑ ¹®ÀÚ¸¦ Ãâ·ÂÇÒ ¶§¸¶´Ù Ä«¿îÅ͸¦ Áõ°¡½ÃŲ´Ù. µû¶ó¼­ ÇÁ·Î±×·¥ÀÌ ³¡³¯ ¶§ÀÇ Ä«¿îÅÍ¿¡´Â ÆÄÀÏ Å©±â°¡ ±â·ÏµÇ¾î ÀÖÀ» °ÍÀÌ´Ù.

 

11.2. Implementing FSM in Software

FSMÀ» ÀÌ¿ëÇÏ¿© ¾î¶² ¹®Á¦¸¦ ÇØ°áÇÒ ¶§ °¡Àå ¾î·Á¿î Á¡Àº ¹®Á¦¸¦ ºÐ¼®ÇÏ°í ºÐ¼®ÇÑ ¹®Á¦¸¦ FSMÀ¸·Î Ç¥ÇöÇÏ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀÌ ÇØ°áµÇ¸é ¼ÒÇÁÆ®¿þ¾î´Â °ÅÀÇ ´Ù ¾´ °ÍÀ̳ª ¸¶Âù°¡ÁöÀÌ´Ù.

 

C°°Àº °í ¼öÁØ ¾ð¾î¸¦ »ç¿ëÇÒ ¶§´Â FSMÀ» ±¸ÇöÇÏ´Â ¸î °¡Áö  Á¢±Ù ¹æ¹ýÀÌ ÀÖ´Ù. Çϳª´Â switch ¹®ÀåÀ» »ç¿ëÇÏ¿© °¢°¢ÀÇ °æ¿ì¿¡ ½ÇÇàµÇ¾î¾ß ÇÒ ÇÔ¼ö·Î ºÐ±âÇÏ´Â °ÍÀÌ´Ù. °¡·É ´ÙÀ½°ú °°Àº Çü½ÄÀÌ´Ù.

 

  switch (state) {
 default:
 case REGULAR:
  regular(inputchar);
  break;
 case CR:
  cr(inputchar);
  break;
 case LF:
  lf(inputchar);
  break;
 }

 

¶Ç ´Ù¸¥ ¹æ¹ýÀº ´ÙÀ½°ú °°ÀÌ ÇÔ¼ö Æ÷ÀÎÅÍ(function pointer)ÀÇ ¹è¿­À» »ç¿ëÇÏ´Â °ÍÀÌ´Ù.

 

(output[state])(inputchar);

 

ÀÌ °æ¿ì state¸¦ ÇÔ¼ö Æ÷ÀÎÅÍ·Î ±¸ÇöÇÏ°í ÀûÀýÇÑ ÇÔ¼ö¸¦ °¡¸®Å°µµ·Ï ¼³Á¤ÇØ¾ß ÇÑ´Ù.

 

(*state)(inputchar);

 

ÀÌ ¹æ¹ýÀÌ ¹Ù·Î ¿ì¸® ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÉ ¹æ¹ýÀε¥, ÀÌÀ¯´Â ÀÌ ¹æ¹ýÀ» ¾î¼Àºí¸® ¾ð¾î·Î ±¸ÇöÇϱ⠽±°í ¸Å¿ì ºü¸¥ ¼öÇà ¼Óµµ¸¦ º¸À̱⠶§¹®ÀÌ´Ù. ÇÁ·Î±×·¥¿¡¼­´Â ¼öÇàµÇ¾î¾ß ÇÒ ÇÁ·Î½ÃÁ®ÀÇ ÁÖ¼Ò¸¦ EBX¿¡ ³Ö°í ´ÙÀ½°ú °°ÀÌ È£ÃâÇϱ⸸ ÇÏ¸é µÈ´Ù.

 

 call ebx

 

¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­°¡ ¸Þ¸ð¸®¿¡¼­ ÁÖ¼Ò¸¦ ÆÐÄ¡ÇÒ ÇÊ¿ä°¡ ¾ø±â ¶§¹®¿¡-ÁÖ¼Ò°¡ ÀÌ¹Ì ·¹Áö½ºÅÍ Áß Çϳª¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.- Äڵ忡 ÁÖ¼Ò¸¦ Á÷Á¢ ±â·ÏÇÏ´Â °Íº¸´Ù ºü¸¦ ¼ö ÀÖ´Ù. ÇÊÀÚ´Â ºü¸¦ ¼ö ÀÖ´Ù°í Ç¥ÇöÇߴµ¥, ÀÌ°ÍÀº ÃÖ±Ù¿¡ °³¹ßµÈ ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­µéÀÌ Ä³½Ì(caching)À» Çϱ⠶§¹®¿¡ ·¹Áö½ºÅÍ¿¡ ¹Ì¸® ÀúÀåµÇ¾î ÀÖ´Â °Í°ú ´Ù¸¦ ¹Ù ¾ø´Â °æ¿ì°¡ ¸¹±â ¶§¹®ÀÌ´Ù.

 

11.3.  Memory Mapped Files

 ÇÁ·Î±×·¥ÀÌ ÇϳªÀÇ ÆÄÀÏ¿¡ ´ëÇؼ­¸¸ µ¿ÀÛÇϱ⠶§¹®¿¡ ÀÔ·Â ÆÄÀÏ¿¡¼­ Àаí Ãâ·Â ÆÄÀÏ¿¡ ½è´ø ±âÁ¸ÀÇ ¹æ¹ýÀ» ±×´ë·Î »ç¿ëÇÒ ¼ö ¾ø´Ù.

 

À¯´Ð½º´Â ÆÄÀÏÀÇ ÀüºÎ ȤÀº ÀϺθ¦ ¸Þ¸ð¸®¿¡ ¸ÊÇÎ(mapping)½Ãų ¼ö ÀÖ´Â ¸ÅÄ¿´ÏÁòÀ» Áö¿øÇÑ´Ù. ÀÌ ±â´ÉÀ» »ç¿ëÇϱâ À§Çؼ­´Â ¿ì¼± ÆÄÀÏÀ» ÀûÀýÇÑ Àбâ/¾²±â Ç÷¡±×¿Í ÇÔ²² ¿¬´Ù. ±×¸®°í mmap ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÏ¿© ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ¸ÊÇνÃŲ´Ù. mmapÀÌ ÁÁÀº Á¡Àº ÀÚµ¿À¸·Î °¡»ó ¸Þ¸ð¸®¿¡ ¸ÊÇεȴٴ °ÍÀÌ´Ù. µû¶ó¼­ ½ÇÁ¦ ¸Þ¸ð¸® Å©±â º¸´Ù Å« ¿ë·®ÀÇ ÆÄÀϵéÀ» ¸Þ¸ð¸®¿¡ ¸ÊÇνÃų ¼ö ÀÖ´Ù. ¶Ç, ¿©ÀüÈ÷ mob.lods, stos °°Àº ÀÏ¹Ý ¸Þ¸ð¸® op code¸¦ ÀÌ¿ëÇÏ¿© Á¢±ÙÇÒ ¼öµµ ÀÖÀ¸¸ç ÆÄÀÏÀÇ ¸Þ¸ð¸® À̹ÌÁö¿¡ ¾î¶² º¯È­°¡ »ý±æ ¶§¸¶´Ù ÆÄÀÏ ½Ã½ºÅÛÀÇ ÆÄÀÏ¿¡ ¹Ý¿µµÈ´Ù. °Ô´Ù°¡ ¸ÊÇεǾî ÀÖ´Â µ¿¾ÈÀº ÆÄÀÏÀ» ¿¬ »óÅ·ΠÀ¯ÁöÇÏÁö ¾Ê°íµµ ÆÄÀÏ¿¡¼­ µ¥ÀÌÅ͸¦ Àаí ÆÄÀÏ·Î µ¥ÀÌÅ͸¦ ¾µ ¼ö ÀÖ´Ù.

 

32ºñÆ® ÀÎÅÚ ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­µéÀº 4GBÀÇ ¸Þ¸ð¸®-¹°¸® ¸Þ¸ð¸®µç °¡»ó ¸Þ¸ð¸®µç-±îÁö Á¢±ÙÇÒ ¼ö ÀÖ´Ù. FreeBSD ½Ã½ºÅÛÀº ÀÌ ¸Þ¸ð¸® ¿µ¿ª Áß 2GB¸¦ ÆÄÀÏ ¸ÊÇο¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

 

¹®Á¦¸¦ ´Ü¼øÈ­½ÃÅ°±â À§ÇØ ÀÌ Æ©Å丮¾ó¿¡¼­´Â Àüü ¿µ¿ªÀ» ¸ÊÇÎÇÒ ¼ö ÀÖ´Â ÆÄÀÏ¿¡ ÇÑÇؼ­¸¸ º¯È¯ ±â´ÉÀ» Áö¿øÇϱâ·Î ÇÑ´Ù. 2GB°¡ ³Ñ´Â ÅؽºÆ® ÆÄÀÏÀº ¾Æ¸¶ °ÅÀÇ ¾øÀ» °ÍÀÌ´Ù. ¸¸¾à ¿ì¸® ÇÁ·Î±×·¥ÀÌ ÀÌ·¯ÇÑ »óȲ¿¡ Á÷¸éÇÑ´Ù¸é ´Ü¼øÈ÷ tuc¸¦ »ç¿ëÇ϶ó´Â ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í Á¾·áÇÒ °ÍÀÌ´Ù.(tuc´Â ¸ÊÇÎ ÆÄÀÏÀ» »ç¿ëÇÏÁö ¾Ê¾Ò´Ù.)

 

syscalls.master¸¦ º¸¸é mmapÀ̶ó´Â À̸§ÀÇ µÎ ½Ã½ºÅÛ ÄÝÀ» ¹ß°ßÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ°ÍÀº À¯´Ð½º¿¡ ¼ö¸¹Àº º¯Á¾ÀÌ Àֱ⠶§¹®Àε¥, ½ÇÁ¦ ÀüÅëÀûÀÎ BSD mmapÀº 71¹øÀ¸·Î ¼³Á¤µÇ¾î ÀÖÀ¸¸ç POSIX mmapÀº 197¹øÀ¸·Î ¼³Á¤µÇ¾î ÀÖ´Ù. FreeBSD ½Ã½ºÅÛÀº ÃʱâÀÇ BSD ȯ°æ¿¡¼­ ÀÛ¼ºµÈ ÇÁ·Î±×·¥À» Áö¿øÇϱâ À§Çؼ­ µÎ ½Ã½ºÅÛ ÄÝÀ» ¸ðµÎ Áö¿øÇÑ´Ù. ÇÏÁö¸¸ »õ·Î ÀÛ¼ºµÉ ¼ÒÇÁÆ®¿þ¾î´Â POSIX ¹öÁ¯À» »ç¿ëÇØ¾ß ÇÑ´Ù.

 

syscall.master ÆÄÀÏ¿¡´Â ´ÙÀ½°ú °°ÀÌ POSIX ¹öÁ¯¿¡ ´ëÇÑ ³»¿ëÀÌ ±â·ÏµÇ¾î ÀÖ´Ù.

 

197 STD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \
       int flags, int fd, long pad, off_t pos); }

 

 ÀÌ ½Ã½ºÅÛ ÄÝÀº mmap(2)¿Í´Â Á¶±Ý ´Ù¸¥µ¥, ÀÌ´Â mmap(2)°¡ C¸¦ À§ÇØ ÀÛ¼ºµÈ ÇÔ¼öÀ̱⠶§¹®ÀÌ´Ù.

 

C ¹öÁ¯°ú ½Ã½ºÅÛ ÄÝÀÇ Â÷ÀÌÁ¡Àº long pad ÀÎÀÚÀε¥, ÀÌ ÀÎÀÚ°¡ C ¹öÁ¯¿¡´Â ¾ø±â ¶§¹®ÀÌ´Ù. ÇÏÁö¸¸ FreeBSD ½Ã½ºÅÛ ÄÝÀº 64ºñÆ® ÀÎÀÚ¸¦ Ǫ½ÃÇÑ ÈÄ 32ºñÆ® Æеå(pad)¸¦ Ãß°¡Çß´Ù. ÀÌ °æ¿ì off_t´Â 64 ºñÆ® °ªÀÌ µÈ´Ù.

 

ÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸® ¸ÊÀ» ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é munmap ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÏ¿© ¸ÊÇÎÀ» ÇØÁ¦ ½ÃÄÑ¾ß ÇÑ´Ù.

 

TIP: W. Richard StevensÀÇ Unix Network Programming, Volume 2 Chapter 12 ¸¦ º¸¸é mmap¿¡ ´ëÇØ ÀÚ¼¼È÷ ³ª¿Í ÀÖ´Ù.

 

11.4. Determining File Size

ÆÄÀÏÀÇ ¾î´À Á¤µµ Å©±â¸¦ ¸Þ¸ð¸®¿¡ ¸ÊÇνÃÅ°°í ½ÍÀºÁö¸¦ mmap¿¡°Ô ¾Ë·ÁÁà¾ß Çϴµ¥, ¿ì¸® ÇÁ·Î±×·¥ÀÇ °æ¿ì Àüü ÆÄÀÏÀ» ¸ÊÇνÃÅ°±â ¶§¹®¿¡ ÆÄÀÏÀÇ Å©±â¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù.

 

ÀÌ °æ¿ì fstat ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÏ¿© ÆÄÀÏÀÇ Å©±â¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.  syscalls.master¿¡´Â mmap°ú ¸¶Âù°¡Áö·Î µÎ °¡Áö ¹öÁ¯ÀÇ fstatÀÌ ¹ß°ßµÈ´Ù. (ÀüÅëÀûÀÎ ½Ã½ºÅÛ ÄÝ 62, POSIX ½Ã½ºÅÛ ÄÝ 189) ´ç¿¬ÇÑ ¸»ÀÌÁö¸¸ ¿ì¸® ÇÁ·Î±×·¥¿¡¼­´Â POSIX ¹öÁ¯À» »ç¿ëÇÒ °ÍÀÌ´Ù.

 

189 STD POSIX { int fstat(int fd, struct stat *sb); }

 

ÀÌ°ÍÀº ¸Å¿ì Á÷Á¢ÀûÀΠȣÃâÀÌ´Ù. ÇÁ·Î±×·¥¿¡¼­ ÀÌ ½Ã½ºÅÛ ÄÝ¿¡ stat ±¸Á¶Ã¼ÀÇ ÁÖ¼Ò¿Í ¿­¸° ÆÄÀÏÀÇ ±â¼úÀÚ¸¦ ³Ñ±â¸é ½Ã½ºÅÛ ÄÝÀº ±¸Á¶Ã¼¿¡ Á¤º¸¸¦ ä¿ö ¸®ÅÏÇÑ´Ù.

 

ÇÏÁö¸¸ ÇÊÀÚ°¡ .bss ¼½¼Ç¿¡ stat ±¸Á¶Ã¼¸¦ ¼±¾ðÇÏ°í fstat ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÏÀÚ ¿¡·¯°¡ ¹ß»ýÇßÀ½À» ¾Ë¸®´Â ij¸® Ç÷¡±×(carray flag)°¡ ¼³Á¤µÆ´Ù. ÇÊÀÚ´Â ½ºÅÿ¡ ±¸Á¶Ã¼¸¦ ÇÒ´çÇϵµ·Ï Äڵ带 ¼öÁ¤ÇÑ ÈÄ¿¡¾ß, ¸ðµç µ¿ÀÛÀÌ Á¤»óÀûÀ¸·Î ¼öÇàµÊÀ» È®ÀÎÇÒ ¼ö ÀÖ¾ú´Ù.

 

11.5. Changing the File Size

 ¿ì¸® ÇÁ·Î±×·¥ÀÌ cr/lf¸¦ lf·Î º¯°æÇϱ⠶§¹®¿¡ Ãâ·Â ÆÄÀÏÀº ÀÔ·Â ÆÄÀÏ º¸´Ù ÀÛÀ» ¼ö ÀÖ´Ù. ±×·±µ¥ ÀÔ·Â ÆÄÀÏÀ» Ãâ·Â ÆÄÀÏ·Î ´ëüÇϱ⠶§¹®¿¡ ÆÄÀÏÀÇ Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

 

ftruncate ½Ã½ºÅÛ ÄÝÀº ÀÌ·¸°Ô ÆÄÀÏ Å©±â¸¦ º¯°æÇÏ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. À̸§Àº À߸ø ÁöÀº °¨ÀÌ ÀÖÁö¸¸ ftruncate ½Ã½ºÅÛ ÄÝÀº ÆÄÀÏÀ» ÀÚ¸¦ ¼öµµ ÀÖ°í(ÆÄÀÏÀ» ÀÛ°Ô ¸¸µé ¼öµµ ÀÖ°í) Å°¿ï ¼öµµ ÀÖ´Ù.

 

±×¸®°í ÀÌÀüÀÇ ½Ã½ºÅÛ Äݵé°ú ¸¶Âù°¡Áö·Î syscalls.master ÆÄÀÏ¿¡¼­ µÎ ¹öÁ¯ÀÇ ftruncate ½Ã½ºÅÛ ÄÝÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù.(¿¹Àü ½Ã½ºÅÛ ÄÝ 130, POSIX ½Ã½ºÅÛ ÄÝ 201) ¿ì¸®´Â ÀÌÀü°ú ¸¶Âù°¡Áö·Î POSIX ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÑ´Ù.

 

201 STD BSD { int ftruncate(int fd, int pad, off_t length); }

 

ÀÌ ½Ã½ºÅÛ ÄÝÀÌ int pad¸¦ ´Ù½Ã Æ÷ÇÔÇÏ°í ÀÖ´Ù´Â »ç½Ç¿¡ À¯ÀÇÇ϶ó.

 

11.6. ftuc

¿ì¸®´Â ÀÌÁ¦ ftuc ÇÁ·Î±×·¥À» ÀÛ¼ºÇϴµ¥ ÇÊ¿äÇÑ ¸ðµç Áö½ÄÀ» ¾Ë°Ô µÇ¾ú´Ù. ÀÌÁ¦ system.inc ÆÄÀÏ¿¡ »õ·Î¿î ¶óÀÎÀ» Ãß°¡Çϸ鼭 ÇÁ·Î±×·¥ÀÇ ÀÛ¼ºÀ» ½ÃÀÛÇØ º¸ÀÚ. ¸ÕÀú ÆÄÀÏÀÇ ½ÃÀÛ ºÎºÐ ±Ùó¿¡ ¸î °³ÀÇ »ó¼ö¿Í ±¸Á¶Ã¼¸¦ ¼±¾ðÇÏÀÚ.

 

;;;;;;; open flags
%define O_RDONLY 0
%define O_WRONLY 1
%define O_RDWR 2
 
;;;;;;; mmap flags
%define PROT_NONE 0
%define PROT_READ 1
%define PROT_WRITE 2
%define PROT_EXEC 4
;;
%define MAP_SHARED 0001h
%define MAP_PRIVATE 0002h
 
;;;;;;; stat structure
struc stat
st_dev  resd 1 ; = 0
st_ino  resd 1 ; = 4
st_mode  resw 1 ; = 8, size is 16 bits
st_nlink resw 1 ; = 10, ditto
st_uid  resd 1 ; = 12
st_gid  resd 1 ; = 16
st_rdev  resd 1 ; = 20
st_atime resd 1 ; = 24
st_atimensec resd 1 ; = 28
st_mtime resd 1 ; = 32
st_mtimensec resd 1 ; = 36
st_ctime resd 1 ; = 40
st_ctimensec resd 1 ; = 44
st_size  resd 2 ; = 48, size is 64 bits
st_blocks resd 2 ; = 56, ditto
st_blksize resd 1 ; = 64
st_flags resd 1 ; = 68
st_gen  resd 1 ; = 72
st_lspare resd 1 ; = 76
st_qspare resd 4 ; = 80
endstruc

 

±×¸®°í »õ·Î¿î ½Ã½ºÅÛ ÄÝÀ» Á¤ÀÇÇÑ´Ù.

 

%define SYS_mmap 197
%define SYS_munmap 73
%define SYS_fstat 189
%define SYS_ftruncate 201

 

ÀÌÁ¦ »õ·Î Á¤ÀÇµÈ ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇϱâ À§ÇÑ ¸ÅÅ©·Î¸¦ Ãß°¡ÇÑ´Ù.

 

%macro sys.mmap 0
 system SYS_mmap
%endmacro
 
%macro sys.munmap 0
 system SYS_munmap
%endmacro
 
%macro sys.ftruncate 0
 system SYS_ftruncate
%endmacro
 
%macro sys.fstat 0
 system SYS_fstat
%endmacro

 

´ÙÀ½ÀÌ Àüü ÄÚµåÀÇ ³»¿ëÀÌ´Ù.

 

;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Started: 21-Dec-2000
;; Updated: 22-Dec-2000
;;
;; Copyright 2000 G. Adam Stanislav.
;; All rights reserved.
;;
;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%include 'system.inc'
 
section .data
 db 'Copyright 2000 G. Adam Stanislav.', 0Ah
 db 'All rights reserved.', 0Ah
usg db 'Usage: ftuc filename', 0Ah
usglen equ $-usg
co db "ftuc: Can't open file.", 0Ah
colen equ $-co
fae db 'ftuc: File access error.', 0Ah
faelen equ $-fae
ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah
ftllen equ $-ftl
mae db 'ftuc: Memory allocation error.', 0Ah
maelen equ $-mae
 
section .code
 
align 4
memerr:
 push dword maelen
 push dword mae
 jmp short error
 
align 4
toolong:
 push dword ftllen
 push dword ftl
 jmp short error
 
align 4
facerr:
 push dword faelen
 push dword fae
 jmp short error
 
align 4
cantopen:
 push dword colen
 push dword co
 jmp short error
 
align 4
usage:
 push dword usglen
 push dword usg
 
error:
 push dword stderr
 sys.write
 
 push dword 1
 sys.exit
 
align 4
global _start
_start:
 pop eax  ; argc
 pop eax  ; program name
 pop ecx  ; file to convert
 jecxz usage
 
 pop eax
 or eax, eax ; Too many arguments?
 jne usage
 
 ; Open the file
 push dword O_RDWR
 push ecx
 sys.open
 jc cantopen
 
 mov ebp, eax ; Save fd
 
 sub esp, byte stat_size
 mov ebx, esp
 
 ; Find file size
 push ebx
 push ebp  ; fd
 sys.fstat
 jc facerr
 
 mov edx, [ebx + st_size + 4]
 
 ; File is too long if EDX != 0 ...
 or edx, edx
 jne near toolong
 mov ecx, [ebx + st_size]
 ; ... or if it is above 2 GB
 or ecx, ecx
 js near toolong
 
 ; Do nothing if the file is 0 bytes in size
 jecxz .quit
 
 ; Map the entire file in memory
 push edx
 push edx  ; starting at offset 0
 push edx  ; pad
 push ebp  ; fd
 push dword MAP_SHARED
 push dword PROT_READ | PROT_WRITE
 push ecx  ; entire file size
 push edx  ; let system decide on the address
 sys.mmap
 jc near memerr
 
 mov edi, eax
 mov esi, eax
 push ecx  ; for SYS_munmap
 push edi
 
 ; Use EBX for state machine
 mov ebx, ordinary
 mov ah, 0Ah
 cld
 
.loop:
 lodsb
 call ebx
 loop .loop
 
 cmp ebx, ordinary
 je .filesize
 
 ; Output final lf
 mov al, ah
 stosb
 inc edx
 
.filesize:
 ; truncate file to new size
 push dword 0  ; high dword
 push edx  ; low dword
 push eax  ; pad
 push ebp
 sys.ftruncate
 
 ; close it (ebp still pushed)
 sys.close
 
 add esp, byte 16
 sys.munmap
 
.quit:
 push dword 0
 sys.exit
 
align 4
ordinary:
 cmp al, 0Dh
 je .cr
 
 cmp al, ah
 je .lf
 
 stosb
 inc edx
 ret
 
align 4
.cr:
 mov ebx, cr
 ret
 
align 4
.lf:
 mov ebx, lf
 ret
 
align 4
cr:
 cmp al, 0Dh
 je .cr
 
 cmp al, ah
 je .lf
 
 xchg al, ah
 stosb
 inc edx
 
 xchg al, ah
 ; fall through
 
.lf:
 stosb
 inc edx
 mov ebx, ordinary
 ret
 
align 4
.cr:
 mov al, ah
 stosb
 inc edx
 ret
 
align 4
lf:
 cmp al, ah
 je .lf
 
 cmp al, 0Dh
 je .cr
 
 xchg al, ah
 stosb
 inc edx
 
 xchg al, ah
 stosb
 inc edx
 mov ebx, ordinary
 ret
 
align 4
.cr:
 mov ebx, ordinary
 mov al, ah
 ; fall through
 
.lf:
 stosb
 inc edx
 ret

 

WARNING: MS DOS³ª À©µµ¿ì·Î Æ÷¸ËµÈ µð½ºÅ©¿¡ ÀúÀåµÈ ÆÄÀÏ¿¡´Â ÀÌ ÇÁ·Î±×·¥À» »ç¿ëÇÏÁö ¸»¾Æ¶ó. FreeBSD¿¡¼­ ¸¶¿îÆ®µÈ µå¶óÀ̺꿡¼­ mmapÀ» »ç¿ëÇÒ ¶§, FreeBSD Äڵ忡 ¹Ì¹¦ÇÑ ¹ö±×°¡ ¹ß»ýÇÑ´Ù. ÀÌ ¹ö±×´Â ÆÄÀÏÀÌ Æ¯Á¤ Å©±â ÀÌ»ó À϶§ mmapÀ» ½ÇÇà½ÃÅ°¸é ¸Þ¸ð¸®¸¦ 0À¸·Î ä¿ì°í ±× ¿µ¿ªÀ» ÆÄÀÏ·Î ±×´ë·Î º¹»çÇÏ¿© °á°úÀûÀ¸·Î ÆÄÀÏÀÇ ³»¿ëÀ» ¸ðµÎ 0À¸·Î ¸¸µç´Ù.

 

Chapter 12 – Caveats

MS DOS¿Í À©µµ¿ì ȯ°æ¿¡¼­ ¾î¼Àºí¸® ¾ð¾î¸¦ °øºÎÇÑ »ç¶÷Àº ÃÖ´Ü ÄÚ½º¸¦ ÃëÇÏ·Á´Â °æÇâÀÌ ÀÖ´Ù. Å°º¸µåÀÇ ½ºÄµ ÄÚµå(scan code)¸¦ ÀÐ°í ºñµð¿À ¸Þ¸ð¸®·Î Á÷Á¢ ½ºÄµ Äڵ带 ¾²´Â ÇÁ·Î±×·¥ÀÌ MS DOS ȯ°æ¿¡¼­ »ç¿ëµÇ´Â µÎ °³ÀÇ °íÀüÀûÀÎ ¿¹Á¦ Áß ÇϳªÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº µ¿ÀÛÀ» ÇÏÁö ¾Ê´Â °ÍÀº ¾Æ´ÏÁö¸¸ ÀûÀýÇÑ ±¸Çö ¹æ¹ýÀ̶ó »ý°¢µÇÁø ¾Ê´Â´Ù.

 

ÀÌÀ¯°¡ ¹»±î? ÀÌ·¯ÇÑ ¿¬»êÀ» ¼öÇàÇÒ ¶§, PC BIOS¿Í MS DOS°¡ ¸ðµÎ ´À·ÁÁø´Ù´Â °ÍÀº À¯¸íÇÑ »ç½ÇÀÌ´Ù.

 

À¯´Ð½º ȯ°æ¿¡¼­µµ ÀÌ ºñ½ÁÇÑ ½À°üÀ» °è¼Ó º¸ÀÌ´Â »ç¶÷µµ ÀÖÀ» °ÍÀÌ´Ù. °¡·É, ÇÊÀÚ´Â ÀϹÝÀûÀÎ À¯´Ð½º ȯ°æ¿¡¼­ Å°º¸µå ½ºÄµ Äڵ忡 Á¢±ÙÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ À¥ »çÀÌÆ®¸¦ º» ÀûÀÌ ÀÖ´Ù.

 

ÀÌ°ÍÀº Àû¾îµµ À¯´Ð½º ȯ°æ¿¡¼­´Â ¸Å¿ì ³ª»Û ½À°üÀε¥, ÀÌÁ¦ºÎÅÍ ±× ÀÌÀ¯¸¦ ¼³¸íÇϵµ·Ï ÇÏ°Ú´Ù.

 

12.1. Unix Is Protected

 ¸ÕÀú Çϵå¿þ¾î¿¡ Á÷Á¢ Á¢±ÙÇÏ´Â °Í ÀÚü°¡ ºÒ°¡´ÉÇÒ ¼öµµ ÀÖ´Ù. À¯´Ð½º´Â º¸È£ ¸ðµå¿¡¼­ µ¿ÀÛÇÑ´Ù. µû¶ó¼­ ´ÜÁö Ä¿³Î°ú µð¹ÙÀ̽º µå¶óÀ̹ö¸¸ÀÌ Çϵå¿þ¾î¿¡ Á÷Á¢ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ¾Æ¸¶µµ ¸î¸î À¯´Ð½º ȣȯ ¿î¿µÃ¼Á¦´Â Å°º¸µå ½ºÄµ Äڵ带 ÀÐÀ» ¼ö ÀÖµµ·Ï ÇØ ÁÙ ¼öµµ ÀÖÁö¸¸ ¹®Á¦´Â À¯´Ð½º ¿î¿µÃ¼Á¦´Â ÀÌ·¯ÇÑ Á÷Á¢ Á¢±ÙÀ» Çã¿ëÇÏÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù. ¶ÇÇÑ ÇöÀç ¹öÁ¯ÀÇ ¿î¿µÃ¼Á¦°¡ Á÷Á¢ Á¢±ÙÀ» Çã¿ë ÇÑ´Ù Çصµ ´ÙÀ½ ¹öÁ¯µµ Çã¿ëÇÑ´Ù´Â º¸ÀåÀÌ ¾ø´Ù. µû¶ó¼­ Èûµé¿© ÀÛ¼ºÇÑ ¼ÒÇÁÆ®¿þ¾î°¡ 3ÀÏ ÃµÇÏ°¡ µÉ ¼öµµ ÀÖ´Ù.

 

12.2. Unix Is an Abstraction

ÇÏÁö¸¸ Çϵå¿þ¾î Á÷Á¢ Á¢±ÙÀ» Çã¿ëÇÏ´Â À¯´Ð½º ȣȯ ¿î¿µÃ¼Á¦¿¡¼­ Á¶Â÷ Á÷Á¢ Á¢±ÙÇÏ´Â ½Ãµµ¸¦ ÇÏÁö ¾Ê¾Æ¾ß ÇÒ ÁøÁ¤ Áß¿äÇÑ ÀÌÀ¯´Â µû·Î ÀÖ´Ù.(¹°·Ð µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇÑ´Ù¸é ¿¹¿Ü´Ù.)

 

Unix is an abstraction!

 MS DOS¿Í À¯´Ð½ºÀÇ ¼³°è öÇп¡´Â Å« Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù. MS DOS´Â ÇÑ ¸íÀÇ »ç¿ëÀÚ¸¦ À§ÇØ ¼³°èµÈ ¿î¿µÃ¼Á¦ÀÌ´Ù. µû¶ó¼­ ÀÌ ¿î¿µÃ¼Á¦´Â ÇϳªÀÇ Å°º¸µå¿Í ÇϳªÀÇ ºñµð¿À ½ºÅ©¸°ÀÌ Á÷Á¢ ºÎÂøµÇ¾î ÀÖ´Â ÄÄÇ»ÅÍ¿¡¼­ ¼öÇàµÈ´Ù. »ç¿ëÀÚ ÀÔ·ÂÀº °ÅÀÇ Å°º¸µå·Î µé¾î¿À¸ç ÇÁ·Î±×·¥ÀÇ Ãâ·ÂÀº ´ëºÎºÐ ½ºÅ©¸°À¸·Î ³ª°£´Ù.

 

ÀÌ·¯ÇÑ »çÇ×µéÀÌ À¯´Ð½º¿¡¼­´Â ÁöÄÑÁöÁö ¾Ê´Â´Ù. À¯´Ð½º »ç¿ëÀÚ´Â ÇÑ ÇÁ·Î±×·¥ÀÇ Ãâ·ÂÀ» ÀçÁöÁ¤(redirect)ÇÏ¿© ´Ù¸¥ ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀ¸·Î ÇâÇÏ°Ô ÇÏ´Â ´ÙÀ½°ú °°Àº Çü½ÄÀ¸·Î ¸¹Àº ÀÛ¾÷À» ó¸®ÇÑ´Ù.

 

% program1 | program2 | program3 > file1

 

¸¸¾à program2¸¦ ÀÛ¼ºÇß´Ù¸é ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀº Å°º¸µå¿¡¼­ ¿À´Â °ÍÀÌ ¾Æ´Ï¸ç, Ãâ·Âµµ ½ºÅ©¸°ÀÌ ¾Æ´Ñ program3·Î ³ª°£´Ù. ±×¸®°í Ãâ·ÂÀº program3À» °ÅÃÄ file1À¸·Î ÇâÇÑ´Ù.

 

ÇÏÁö¸¸ ´õ ¸¹Àº ÀÌÀ¯°¡ ÀÖ´Ù! ½ÉÁö¾î ÇÁ·Î±×·¥ÀÇ ÀԷ°ú Ãâ·Â ¹æÇâÀÌ Å͹̳ηΠÀÏÁ¤ÇÏ´Ù ÇÏ´õ¶óµµ Å͹̳ÎÀÌ PC¶ó´Â º¸ÀåÀÌ ¾ø´Ù. ±× Å͹̳ÎÀº ÇÁ·Î±×·¡¸Ó°¡ ¿¹»óÇÏ´Â °÷¿¡ ºñµð¿À ¸Þ¸ð¸®°¡ ¾øÀ» ¼öµµ ÀÖÀ¸¸ç Å°º¸µåµµ PC ½ºÅ¸ÀÏÀÇ ½ºÄµ Äڵ带 »ç¿ëÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. Å͹̳ÎÀÌ ¸ÅŲÅä½Ã(Macintosh)¶ó¸é ¾î¶»°Ú´Â°¡?

 

Áö±ÝÂë °í°³¸¦ Èçµé°í ÀÖ´Â »ç¶÷ÀÌ ÀÖÀ» Áö ¸ð¸£°Ú´Ù. Áö±Ý±îÁö »ìÆ캻 ÇÁ·Î±×·¥µéÀº ¸ðµÎ ¾î¼Àºí¸® ¾ð¾î·Î ÀÛ¼ºµÇ¾ú´Ù. ÀÌ ÇÁ·Î±×·¥µéÀ» ¾î¶»°Ô ¸ÅŲÅä½Ã¿¡¼­ ¼öÇàµÉ ¼ö ÀÖµµ·Ï ÇÒ ¼ö Àְڴ°¡? ÇÏÁö¸¸ ÇÊÀÚ´Â ÀÛ¼ºÇÑ ¼ÒÇÁÆ®¿þ¾î¸¦ ¸ÅŲÅä½Ã¿¡¼­ ¼öÇà½ÃÅ°¶ó´Â ¿ä±¸´Â ÇÏÁö ¾Ê¾Ò´Ù. ´ÜÁö Å͹̳ÎÀÌ ¸ÅŲÅä½ÃÀÏ °æ¿ì¿¡µµ ÇÁ·Î±×·¥ÀÌ Á¤»ó ¼öÇàµÇ¾î¾ß ÇÏÁö ¾Ê°Ú´Â°¡?

 

À¯´Ð½º ȯ°æ¿¡¼­ Å͹̳ÎÀº ¼ÒÇÁÆ®¿þ¾î°¡ µ¹¾Æ°¡´Â ÄÄÇ»ÅÍ¿¡ Á÷Á¢ Á¢¼ÓÇØ ÀÖÀ» ÇÊ¿ä°¡ ¾ø´Ù. ¿À½ºÆ®·¹Àϸ®¾Æ¿¡ »ç´Â ¸ÅŲÅä½Ã »ç¿ëÀÚ°¡ ºÏ ¾Æ¸Þ¸®Ä«¿¡(ȤÀº ¾î´À °÷À̵ç) ÀÖ´Â À¯´Ð½º ½Ã½ºÅÛ¿¡ telnetÀ» ÀÌ¿ëÇÏ¿© Á¢¼ÓÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ±×¸®°í Å͹̳ÎÀÌ ¼ÒÇÁÆ®¿þ¾î°¡ ½ÇÇàµÇ´Â ÄÄÇ»ÅÍ¿¡ ÀÖÁö ¾Ê´Ù ÇÒÁö¶óµµ ¼ÒÇÁÆ®¿þ¾î´Â Á¤»óÀûÀ¸·Î ½ÇÇàµÈ´Ù. ¸¸¾à ½ºÄµ Äڵ带 ÀÐÀ¸·Á ÇÑ´Ù¸é À߸øµÈ °ªÀ» ¾òÀ» ¼öµµ ÀÖ´Ù.

 

¾î¶² Çϵå¿þ¾î¿¡ ´ëÇؼ­µµ µ¿ÀÏÇÑ °¡Á¤ÀÌ ¼º¸³ÇÑ´Ù¸é À§¿Í °°Àº ¸ðµç »óȲÀÌ °¡´ÉÇØ Áø´Ù. ¿©·¯ºÐÀÌ Àаí ÀÖ´Â ÆÄÀÏÀº Á÷Á¢ Á¢±ÙÇÒ ¼ö ¾ø´Â µð½ºÅ©¿¡ ÀÖ´Â °ÍÀÏ ¼öµµ ÀÖÀ¸¸ç, º¸°í ÀÖ´Â À̹ÌÁö°¡ ÀΰøÀ§¼ºÀ» °ÅÃÄ ¿¬°áµÈ ¿ìÁÖ¼±ÀÇ Ä«¸Þ¶óÀÇ °ÍÀÏ ¼öµµ ÀÖ´Ù.

 

ÀÌ°ÍÀÌ À¯´Ð½º ȯ°æ¿¡¼­ µ¥ÀÌÅÍ°¡ ¾îµð·Î µé¾î¿À°í ¾îµð·Î ³ª°¡´Â Áö¸¦  °¡Á¤ÇÏ¸é ¾È µÇ´Â ÀÌÀ¯´Ù. ½Ã½ºÅÛÀº ¾î´À »óȲ¿¡¼­µµ Çϵå¿þ¾î¿¡ ¹°¸®ÀûÀÎ Á¢±ÙÀ» ÇÒ ¼ö ÀÖµµ·Ï ó¸®ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

 

N.B.: ¾î´À Á¤µµÀÇ Á¦Àç(caveats)°¡ ÀÖÁö¸¸ Àý´ëÀûÀÎ ±ÔÄ¢Àº ¾Æ´Ï´Ù. ¿¹¿Üµµ °¡´ÉÇÏ´Ù. °¡·É, ·ÎÄà ¸Ó½Å(local machine)¿¡¼­¸¸ µ¹¾Æ°¡´Â ÅؽºÆ® ¿¡µðÅ͸¦ ÀÛ¼ºÇÑ´Ù¸é º¸´Ù Çâ»óµÈ Á¦¾î¸¦ À§ÇØ Á÷Á¢ ½ºÄµ Äڵ带 ÀÐ¾î µéÀÌ°í ½ÍÀ» ¼öµµ ÀÖ´Ù. ÇÊÀÚ´Â ¹«¾ùÀ» ÇÏ°í ¹«¾ùÀ» ÇÏÁö ¸»¶ó´Â Á¦Àç »çÇ×À» ¸»ÇÏ°í ½ÍÀº °ÍÀÌ ¾Æ´Ï¶ó MS DOS¿¡¼­ À¯´Ð½º ȯ°æÀ¸·Î ÀÌÁ¦ ¸· ÀÌÀüÇÑ »ç¶÷µéÀÌ »ý°¢Áö ¾Ê°í ÀÖ´Â ÇÔÁ¤À» ¾Ë·Á ÁÖ·Á´Â °Í »ÓÀÌ´Ù. ¹°·Ð âÁ¶ÀûÀÎ »ç¶÷µéÀº Á¾Á¾ ±ÔÄ¢À» ±ü´Ù. ´çºÎÇÏ°í ½ÍÀº °ÍÀº ÃÖ¼ÒÇÑ ÀڱⰡ ±âÁ¸ÀÇ ±ÔÄ¢À» ±ú°í ÀÖ´Ù´Â »ç½ÇÀ» ÀÎÁöÇÏ°í ±ÔÄ¢À» ±ú´Â ÀÌÀ¯µµ ¾Ë¸é¼­ »õ·Î¿î ±ÔÄ¢À» ¸¸µé¶ó´Â °ÍÀÌ´Ù.

 

Appendix A – Assembly Language Pearls

´ÙÀ½Àº ÇÊÀÚ°¡ ÀÌ Æ©Å丮¾óÀ» ¾²±â ½ÃÀÛÇÑ ÀÌ·¡ ±â°íÇß´ø ´Ù¸¥ ¾î¼Àºí¸® ¾ð¾î °ü·Ã ±â»ç´Ù.  ±â»çµéÀº ÀÌ Æ©Å丮¾óÀÇ ³»¿ë Áß ÀϺθ¦ ÀÐÀ» ¸¸ÇÑ ºÐ·®À¸·Î ÁÙÀÎ °ÍµéÀÌ´Ù.

 

l        String Length¾î¼Àºí¸® ¾ð¾î¿¡¼­ ÅؽºÆ® ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ °è»êÇÏ´Â ¹æ¹ýÀ¸·Î ¼Ò°³ÇÏ°í ÀÖ´Ù.

l        Smallest Unix Program°¡Àå ÀÛÀº À¯´Ð½º ÇÁ·Î±×·¥ÀÌ ¾ó¸¶³ª ¿ì¸®¸¦ À§Ãà½ÃÅ°´Â Áö È®ÀÎÇØ º¸¶ó.

 

Appendix B – BSD Style Copyright

BSD ½ºÅ¸ÀÏÀÇ ÀúÀÛ±ÇÀ¸·Î ¼ÒÇÁÆ®¿þ¾î¸¦ Ãâ½ÃÇÏ°íÀÚ ÇÑ´Ù¸é FreeBSD ½Ã½ºÅÛ µµÃ³¿¡ À§Ä¡ÇØ ÀÖ´Â bsd-style-copyright¸¦ ã¾Æ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ÀÌ ÀúÀÛ±ÇÀº C ½ºÅ¸ÀÏÀÇ ÁÖ¼®À» »ç¿ëÇÑ´Ù´Â »ç½Çµµ ±â¾ïÇØ µÎ¶ó.

 

ÇÊÀÚ´Â BSD ½ºÅ¸ÀÏÀÇ ÀúÀÛ±ÇÀ» ¾î¼Àºí¸® ¾ð¾î ÇÁ·Î±×·¥±îÁö Æ÷ÇÔÇϵµ·Ï ÆíÁýÇÏ¿´´Ù. ÀÌ ÀúÀÛ±ÇÀ» º¸°í ½Í´Ù¸é nasm-compatible BSD-style copyright¸¦ ´Ù¿î ¹Þ°í ÀÚ½ÅÀÇ À̸§°ú ¼Ò½º Äڵ带 ±â·ÏÇϱ⠹ٶõ´Ù.

 

Appendix C – Acknowledgements

ÀÌ Æ©Å丮¾óÀº FreeBSD hackers ¸ÞÀϸµ ¸®½ºÆ®ÀÇ ¸¹Àº ¶Ù¾î³­ ÇÁ·Î±×·¡¸ÓµéÀÇ µµ¿òÀÌ ¾ø¾ú´Ù¸é ÀÛ¼ºµÇ±â ¾î·Á¿üÀ» °ÍÀÌ´Ù. ±×µéÀº Àγ»¸¦ °¡Áö°í ÇÊÀÚÀÇ Áú¹®¿¡ ´äÇØ ÁÖ¾úÀ¸¸ç, FreeBSD¿Í À¯´Ð½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹ÖÀÇ ³»ºÎ¸¦ ÆÄÇìÃÄ º¸°íÀÚ Çß´ø ÇÊÀÚ¿¡°Ô ¿Ã¹Ù¸¥ ±æÀ» Á¦½ÃÇØ ÁÖ¾ú´Ù.

 

Thomas M. Sommers´Â ÇÊÀÚ¿¡°Ô FreeBSD ½Ã½ºÅÛ ÇÁ·Î±×·¡¹ÖÀÇ ¹®À» ¿­¾îÁØ »ç¶÷ÀÌ´Ù. ±×ÀÇ How do I write ¡°Hello, world¡± in FreeBSD assembler? À¥ ÆäÀÌÁö´Â ÇÊÀÚ°¡ FreeBSD ȯ°æ¿¡¼­ Á¢ÇÑ Ã¹¹ø° ¾î¼Àºí¸® ¿¹Á¦¿´´Ù.

 

Jake Burkholder´Â ÇÊÀÚÀÇ ¸ðµç Áú¹®¿¡ ¼ºÀÇ ÀÖ°Ô ´äÇØ ÁÖ¾úÀ¸¸ç ÇÊÀÚ¿¡°Ô ´Ù¾çÇÑ ¾î¼Àºí¸® ¾ð¾î ¼Ò½º Äڵ带 Á¦°øÇØ ÁØ »ç¶÷ÀÌ´Ù.

 

Copytight © 2000 G. Adam Stanislav.

All rights reserved.