ÀúÀÚ : G. Adam Stanislav
¿ªÀÚ : ÃÖÁøÈñ
À¯´Ð½º(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.