FreeBSD Assembly Language Programming

G. Adam Stanislav Àú

Whiz Kid Technomagic

http://www.int80h.org/bsdasm

ÃÖÁøÈñ <jhchoi@os.korea.ac.kr> ¿ª

 

Preface

À¯´Ð½º(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 ¹ÙÀÌÆ®ÀÇ Å©±â°¡ µÇ¾ú½À´Ï´Ù.

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

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

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

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

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

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

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

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¸¦ °£´ÜÈ÷ ¼Ò°³ÇÏ°Ú½À´Ï´Ù.

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

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

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

- ±×¸®°í 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 ÇÑ °³·Î ´ëüÇϱ⵵ ÇÕ´Ï´Ù.

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

- cr/lf

- cr

- lf/cr

- lf

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

11.1. Finite State Machine

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

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

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

- ordinary

- cr

- lf

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

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

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

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

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

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

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

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

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

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

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

- ÀÔ·ÂÀÌ 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

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

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

- 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.