6Àå. ·¹ÄÚµå Àбâ/¾²±â
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

·¹ÄÚµå ´ÜÀ§ÀÇ Àбâ¿Í ¾²±â

6. ·¹ÄÚµå ´ÜÀ§ÀÇ Àбâ¿Í ¾²±â

5절ÀåÀÇ ÆÄÀÏ´Ù·ç±â´Â ÆÄÀÏÀ» ´Ù·ç´Â ±âº»ÀûÀÎ ±ÔÄ¢À» ¾Ë·ÁÁÖ¾ú´Ù´Â Á¡¿¡¼­´Â ¾µ¸¸ÇÑ ³»¿ëÀ̱ä ÇÏÁö¸¸, ½ÇÁ¦ ¾ÖÇø®ÄÉÀ̼ǿ¡ Àû¿ë½ÃŰ±â¿¡´Â ºÎÁ·ÇÑ Á¡ÀÌ ÀÖ´Ù. 5ÀåÀÇ ¿¹´Â ±×³É ¹®ÀÚ¿­À» ´Ü¼øÇÏ°Ô ÀоîµéÀÌ´Â Á¤µµ¿´Áö¸¸, ´ëºÎºÐÀÇ ÀÀ¿ë ¾ÖÇø®ÄÉÀ̼ÇÀº ÆÄÀÏ¿¡ ±¸Á¶È­µÈ µ¥ÀÌÅ͸¦ »ç¿ëÇÏ°Ô µÈ´Ù. º¸Åë C¾ð¾î¿¡¼­ µ¥ÀÌÅ͸¦ ´Ù·ç±â À§Çؼ­ ÈçÈ÷ º¼ ¼ö ÀÖ´Â ±¸Á¶Ã¼ µ¥ÀÌÅ͸¦ ¿¬»óÇÏ¸é µÉ°ÍÀÌ´Ù.

ÀÌ·¯ÇÑ ±¸Á¶È­µÈ µ¥ÀÌÅÍ´Â ÄÄÇ»Åͻ󿡼­ È¿À²ÀûÀ¸·Î ´Ù·ê ¼ö ÀÖ´Ù. ÀÌµé ±¸Á¶È­µÈ µ¥ÀÌÅÍ´Â µ¥ÀÌÅ͸¦ ·¹ÄÚµå ´ÜÀ§·Î ÀúÀåÇÏ°Ô µÇ´Âµ¥ °¢°¢ÀÇ ·¹ÄÚµå´Â ¿©·¯°³ÀÇ Çʵå·Î ±¸¼ºÀ̵ȴÙ. ÇÁ·Î±×·¡¸Ó´Â °¢ ·¹ÄÚµåÀÇ Å©±â¸¦ ½±°Ô ¾ò¾î ¿Ã ¼ö ÀÖÀ¸¹Ç·Î, ¿øÇÏ´Â µ¥ÀÌÅÍ¿¡ ºü¸£°Ô Á¢±ÙÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

ÀÌ·¯ÇÑ ·¹ÄÚµå´Â µÎ°¡Áö Á¤µµ¸¦ »ý°¢ÇÒ ¼ö ÀÖÀ» °Í °°´Ù. Çϳª´Â ·¹ÄÚµåÀÇ °¢ÇʵåÀÇ Å©±â°¡ °íÁ¤µÇ¾î ÀÖ´Â °íÁ¤±æÀ̸¦ °¡Áø ·¹ÄÚµåÀ̰í, ¶ÇÇϳª´Â ÇʵåÀÇ Å©±â°¡ º¯µ¿µÇ´Â º¯µ¿·¹ÄÚµåÀÌ´Ù. °íÁ¤ ·¹Äڵ带 ´Ù·ç´Â ÇÁ·Î±×·¥Àº ´ëüÀûÀ¸·Î °¡º±°í ºü¸£°Ô ÀÛµ¿ÇÒ ¼ö ÀÖÀ» »Ó¾Æ´Ï¶ó ÄÚµùÇϱ⵵ ½±´Ù¶ó´Â Á¡ ¶§¹®¿¡ ¾ÆÁÖ º¹ÀâÇÏÁö ¾ÊÀº ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϱâ À§ÇÑ ¹æ¹ýÀ¸·Î ³Î¸® »ç¿ëµÇ°í ÀÖ´Ù.

¹Ý¸é º¯µ¿±æÀÌ ·¹ÄÚµåÀÇ °æ¿ì¿¡´Â ´Ù¾çÇÑ µ¥ÀÌÅ͸¦ ´Ù·ç¾î¾ß ÇÏ´Â DB ÇÁ·Î±×·¥°ú °°Àº Á»´õ °­·«ÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé±â À§Çؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ±×¸¸Å­ ÇÁ·Î±×·¥ ÀÛ¼º½Ã »ý°¢ÇÒ ¿ä¼Ò°¡ ¸¹¾Æ Áú °ÍÀÌ´Ù.

À̹ø Àå¿¡¼­´Â °íÁ¤±æÀ̸¦ °¡Áø ·¹Äڵ带 ´Ù·ç´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ °ÍÀÌ´Ù. ¿ì¸®°¡ ´Ù·ç´Â ·¹ÄÚµå´Â °³ÀÎÁ¤º¸¸¦ °¡Áö°Ô µÉ °ÍÀ̸ç, À̸¦ À§Çؼ­ ´ÙÀ½°ú °°Àº ÇʵåµéÀ» »ç¿ëÇÒ °ÍÀÌ´Ù.

  • ¼º - 8byte

  • À̸§ - 16byte

  • ÁÖ¼Ò - 240byte

  • ³ªÀÌ - 4byte

À§ÀÇ ÇʵåÁß ³ªÀ̸¦ Á¦¿ÜÇÑ ¸ðµç Çʵå´Â ¹®ÀÚ¿­ µ¥ÀÌÅͰ¡ µÈ´Ù. ³ªÀÌ´Â ¼ýÀÚ À̹ǷΠ4byteÁ¤µµ¸¦ ÇÒ´çÇÏ´Â °ÍÀ¸·Î ÃæºÐ ÇÒ °ÍÀÌ´Ù. (¹°·Ð Àΰ£ÀÇ ÃÖ´ë ¼ö¸íÀÌ 120¼¼ Á¤µµ¶ó°í º¼ ¼ö ÀÖÀ¸¹Ç·Î 1byte¸¸ ÇÒ´çÇÏ´Â Á¤µµ·Îµµ ÃæºÐÇÒ °ÍÀÌ´Ù. ±×·¯³ª ¿ì¼±Àº °£´ÜÇÏ°Ô 4byte·Î ÇϰڴÙ.)

Áö±Ý±îÁö ¿ì¸®°¡ ÀÛ¼ºÇÑ ¾î¼Àºí¸® ¿¹ÀçµéÀº ´ÜÁö ÇϳªÀÇ ÇÁ·Î±×·¥ ÆÄÀÏ·Î ÀÌ·ç¾îÁ® ÀÖ¾úÀ¸³ª ¿©±â¿¡¼­´Â ¿©·¯°³ÀÇ ÆÄÀÏ·Î ºÐ¸®Çؼ­ ÀÛ¼ºÇϵµ·Ï ÇÒ°ÍÀÌ´Ù. C¿¡¼­ ÈçÈ÷ ¸»ÇÏ´Â ¸ðµâº° ºÐÇÒ ÄÄÆÄÀÏÀ» À§ÇÔÀε¥, ÀÌ·¸°Ô ÇÏ¸é ±â´Éº°·Î ¼Ò½ºÄÚµå ÆÄÀÏÀ» À¯ÁöÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÇÁ·Î±×·¥ÀÇ À¯Áö/º¸¼ö°¡ ¼ö¿ùÇØ Áö´Â ÀåÁ¡À» °¡Áø´Ù. ÀÌ·¸°Ô ¸ðµâº°·Î ÇÁ·Î±×·¥À» ³ª´©¾î¼­ À¯ÁöÇÒ°æ¿ì ÇÁ·Î±×·¥ Àü¿ª¿¡ °ÉÃļ­ »ç¿ëµÇ´Â °øÅëµÈ °ªµéÀ» À¯ÁöÇÒ Çʿ䰡 ÀÖ´Ù. C¿¡¼­´Â includeÆÄÀÏÀ» ÅëÇØ¼­ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϴµ¥, ¾î¼Àºí¸®¿ª½Ã ºñ½ÁÇÑ ¹æ¹ýÀ» ÀÌ¿ëÇØ¼­ ¼±¾ð°ú Á¤ÀǸ¦ ºÐ¸®Çس¾ ¼ö ÀÖ´Ù.

´ÙÀ½Àº ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÒ À¯ÀúÁ¤º¸ ±¸Á¶Ã¼¸¦ À§ÇÑ ¼±¾ðÆÄÀÏ·Î record-def.s·Î ÀúÀåÇϵµ·Ï ÇϰڴÙ.

.equ RECORD_FIRSTNAME,      0
.equ RECORD_LASTNAME,      	8 
.equ RECORD_ADDRESS,       	24 
.equ RECORD_AGE,           264	 
.equ RECORD_SIZE,          268
		
ÀÌ¿Í ÇÔ²² ÇÁ·Î±×·¥ Àü¿ªÀûÀ¸·Î »ç¿ëµÉ °¢Á¾ »ó¼ö¸¦ Á¤ÀÇÇß´Ù. ÀÌµé »ó¼ö´Â ½Ã½ºÅÛ ÄÝ ¹øÈ£¿Í Ç¥ÁØÀÔÃâ·Â°ú °°Àº °ªµéÀ» ¸í½ÃÇϵµ·Ï ÇÒ°ÍÀ̸ç, linux.s¿¡ ÀúÀåÇϵµ·Ï ÇϰڴÙ.
#System Call Numbers
.equ SYS_EXIT, 1
.equ SYS_READ, 3
.equ SYS_WRITE, 4
.equ SYS_OPEN, 5
.equ SYS_CLOSE, 6
.equ SYS_BRK, 45

#System Call Interrupt Number
.equ LINUX_SYSCALL, 0x80 #Standard File Descriptors
.equ STDIN, 0 
.equ STDOUT, 1
.equ STDERR, 2

#Common Status Codes
.equ END_OF_FILE, 0
		

ÀÌÁ¦ ¿ì¸®´Â Á¤ÀÇµÈ ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇØ¼­ 3°³ÀÇ ÇÁ·Î±×·¥À» ¸¸µéµµ·Ï ÇϰڴÙ. ù¹øÂ° ÇÁ·Î±×·¥Àº ±¸Á¶Ã¼¸¦ ·¹ÄÚµå·ÎÇØ¼­ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. µÎ¹øÂ° ÇÁ·Î±×·¥Àº ÆÄÀÏÀÇ ·¹ÄÚµå ³»¿ëÀ» Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥À̸ç, ¼¼¹øÂ° ÇÁ·Î±×·¥Àº ¸ðµç ·¹ÄÚµåÀÇ ³ªÀ̸¦ ´õÇØ¼­ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù.

À̵é ÇÁ·Î±×·¥Àº ±¸Á¶Ã¼¿Í ´õºÒ¾î ÇÁ·Î±×·¥À» °¡·ÎÁú·¯¼­ »ç¿ëµÇ´Â »ó¼ö¸¦ Á¤ÀÇÇϰí ÀÖ´Â linux.s¸¦ Æ÷ÇÔÇÏ°Ô µÉ °ÍÀÌ´Ù.

ÀÌ·¯ÇÑ ÀÏÀ» ÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé±â À§Çؼ­ ¿ì¸®´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ °ÍÀÌ´Ù. ÇÔ¼ö¸¦ ÀÛ¼ºÇϱâ À§Çؼ­ ÇÔ¼ö°¡ ¾î¶°ÇÑ ÀÎÀÚ¸¦ ÇÊ¿ä·Î ÇÒÁö¸¦ »ý°¢ÇØ º¸µµ·Ï ÇÏÀÚ.

  • ·¹ÄÚµåÀÇ ÀÐÀº µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§ÇÑ ¹öÆÛÀÇ À§Ä¡

  • Àаųª ¾²±â À§ÇÑ ÆÄÀÏ ÁöÁ¤ÀÚ

´ÙÀ½Àº ÆÄÀÏ ÁöÁ¤ÀÚ·Î ºÎÅÍ Àбâ À§ÇÑ ÇÔ¼ö´Ù.

# ÇÏ´ÂÀÏ : ÀÌ ÇÔ¼ö´Â ÆÄÀÏ ÁöÁ¤ÀÚ·Î ºÎÅÍ ·¹Äڵ带 ÀÐ¾î µéÀδÙ. 
# ÀÔ  ·Â : ÆÄÀÏ ÁöÁ¤ÀÚ¿Í ¹öÆÛ 
# Ãâ  ·Â : ÇÔ¼ö´Â ¹öÆÛ¿¡ ·¹ÄÚµåÀÇ ³»¿ëÀ» ¾²°í »óŰªÀ» ¸®ÅÏÇÑ´Ù.

# »ó¼ö¸¦ Á¤ÀÇÇÑ ÆÄÀϵéÀ» Æ÷ÇÔ ½ÃŲ´Ù.
.include "record-def.s"
.include "linux.s"

# ½ºÅà Áö¿ª º¯¼ö
.equ ST_READ_BUFFER,    8
.equ ST_FILEDES,        12
.section .text
.globl read_record
.type read_record, @function
read_record:
pushl %ebp
movl  %esp, %ebp

push %ebx
movl ST_FILEDES(%ebp), %ebx
movl ST_READ_BUFFER(%ebp), %ecx
movl $RECORD_SIZE, %edx
movl $SYS_READ, %eax
int  $LINUX_SYSCALL

# %eax´Â ¸®ÅÏ °ªÀ¸·Î, ÇÔ¼öÀÇ ½ÇÇà °á°ú¸¦ È£ÃâÇÑ ÇÁ·Î±×·¥¿¡°Ô 
# µÇµ¹·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù.
popl %ebx

movl %ebp, %esp
popl %ebp
ret
		
ÀÌ ÇÔ¼ö´Â ¸Å¿ì °£´ÜÇÏ´Ù. ÀÎÀÚ·Î ÁÖ¾îÁø ÆÄÀÏ ÁöÁ¤ÀÚ·Î ºÎÅÍ ·¹ÄÚµå Å©±â(RECORD_SIZE) ¸¸Å­ÀÇ µ¥ÀÌÅ͸¦ ÀÐ¾î µéÀ̰í, ¹öÆÛ¿¡ ÀúÀåÇÏ´Â ÀÏÀ» ÇÑ´Ù.

¹öÆÛÀÇ ³»¿ëÀ» ·¹Äڵ忡 ¾²´Â ÇÔ¼ö ¿ª½Ã °£´ÜÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

# ÇÏ´ÂÀÏ : ÆÄÀÏ ÁöÁ¤ÀÚ¿¡ ·¹Äڵ带 ¾´´Ù. 
# ÀÔ  ·Â : ÆÄÀÏÁöÁ¤ÀÚ¿Í ¹öÆÛ
# Ãâ  ·Â : ÇÔ¼öÀÇ ½ÇÇà °á°ú 
.include "linux.s"
.include "record-def.s"

# ½ºÅà ·ÎÄà º¯¼ö
.equ ST_WRITE_BUFFER, 8
.equ ST_FILEDES, 12
.section .text
.globl write_record
.type write_record, @fundtion

write_record:
pushl %ebp
movl %esp, %ebp


pushl %ebx
movl $SYS_WRITE, %eax
movl ST_FILEDES(%ebp), %ebx
movl ST_WRITE_BUFFER(%ebp), %eax
movl $RECORD_SIZE, %edx
int  $LINUX_SYSCALL

# %eax´Â ¸®ÅÏ °ªÀ¸·Î È£ÃâÇÑ ÇÁ·Î±×·¥¿¡°Ô ½ÇÇà °á°ú°ªÀ» 
# ³Ñ°ÜÁØ´Ù.
popl %ebx

movl %ebp, %esp
popl %ebp
ret
		

À̰ɷΠ±âº»ÀûÀÎ ÇÔ¼ö¸¦ ¸¸µé¾úÀ¸¹Ç·Î ÀÌÁ¦ º»°ÝÀûÀ¸·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ½Ã°£ÀÌ´Ù.

6.1. ·¹ÄÚµå ¾²±â

ÀÌ ÇÁ·Î±×·¥Àº ·¹Äڵ带 ÆÄÀÏ¿¡ ¾²´Â ÇÁ·Î±×·¥Àε¥, °£´ÜÇÏ°Ô ÀÛ¼ºÇϱâ À§Çؼ­ ·¹ÄÚµåÀÇ ÇÊµå °ªÀº ÇϵåÄÚµù Çϵµ·Ï ÇϰڴÙ.

	
.include "linux.s"
.include "record-def.s"

.section .data

record1:
.ascii "yun\0"
.rept  4    #padding 
.byte  0
.endr

.ascii "dream\0"
.rept  10 
.byte  0
.endr

.ascii "Seoul city Chun-dam dong\0" 
.rept   215
.byte   0
.endr

.long 25

record2:
.ascii "yun\0" 
.rept  4
.byte  0
.endr

.ascii "mung\0"
.rept  11
.byte  0 
.endr
.ascii "Seoul city joinc dong\0"
.rept  218
.byte  0
.endr

.long 27

file_name:
.ascii "test.dat\0"
.equ ST_FILE_DESCRIPTOR, -4
.globl _start


_start:
movl %esp, %ebp
subl $4, %esp

movl $SYS_OPEN, %eax
movl $file_name, %ebx
movl $0101, %ecx
movl $0666, %edx
int   $LINUX_SYSCALL

movl %eax, ST_FILE_DESCRIPTOR(%ebp)

pushl ST_FILE_DESCRIPTOR(%ebp)
pushl $record1
call  write_record
addl  $8, %esp

pushl ST_FILE_DESCRIPTOR(%ebp)
pushl $record2
call  write_record
addl  $8, %esp

movl $SYS_CLOSE, %eax
movl ST_FILE_DESCRIPTOR(%ebp), %ebx
int  $LINUX_SYSCALL

movl $SYS_EXIT, %eax
movl $0, %ebx 
int  $LINUX_SYSCALL
			

ÀÌ ÇÁ·Î±×·¥Àº ¸Å¿ì °£´ÜÇÏ´Ù. ´ÜÁö ¸î°³ÀÇ »ó¼öµéÀÌ »ç¿ëµÇ¾úÀ¸¸ç, .data ¼½¼Ç¿¡ ÀúÀåÇØ¾ßµÉ ·¹Äڵ尡 ÀÖ´Â °Í¿ÜÀÇ ´Ù¸¥ °Íµé(Àбâ/¾²±â)´Â ÀÌ¹Ì ´Ù·é ÀûÀÌ ÀÖ´Â ³»¿ëµéÀÌ´Ù.

ÇÁ·Î±×·¥ÀÇ °¡Àå óÀ½¿¡´Â »ó¼ö°¡ ¼±¾ðµÈ ÆÄÀÏÀ» Æ÷ÇÔ(include)½ÃŰ´Â Äڵ尡 µé¾î°¬´Ù.

.include "linux.s"
.include "record-def.s"
			
C¾ð¾î¸¦ ÇØºÃ´Ù¸é ±»ÀÌ ¼³¸íÇÒ ÇÊ¿ä ¾ø´Â ÄÚµå·Î, ÇÁ·Î±×·¥ Àü¿ªÀûÀ¸·Î »ç¿ëµÇ¾î¾ß ÇÒ »ó¼ö³ª ÇÔ¼öµéÀ» º°µµÀÇ ÆÄÀÏ¿¡ ¼±¾ðÇØ ³õ°í À̸¦ »ç¿ëÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù.

´ÙÀ½ ·¹ÄÚµåÀÇ °ªÀ» Á¤ÀÇ ÇÏ´Â ºÎºÐÀÌ ³ª¿À´Âµ¥ ¿©±â¿¡¼­ .rept¶ó´Â »õ·Î¿î Áö½Ã¾î¸¦ ¸¸³ª°Ô µÈ´Ù. ÀÌ Áö½Ã¾î´Â .endr Áö½Ã¾î¿Í ÇÔ²² »ç¿ëµÇ´Âµ¥, .rept¿¡¼­ ÁöÁ¤µÈ ¼ýÀÚ ¸¸Å­ Áß°£¿¡ ¿À´Â °ªÀ¸·Î ä¿ì´Â ÀÏÀ» ÇÑ´Ù. À§ Äڵ忡¼­´Â ¹®ÀÚ¿­ ÇʵåÀÇ ³ª¸ÓÁö ºÎºÐÀ» '\0'À¸·Î ä¿ì±â À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇϰí ÀÖ´Ù. C¿¡¼­ ¸Þ¸ð¸® ¿µ¿ªÀ» ƯÁ¤ °ªÀ¸·Î ä¿ì±â À§Çؼ­ »ç¿ëÇÏ´Â memset(2)°ú ºñ½ÁÇÑ ¿ëµµ·Î »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ÀÌÁ¦ ÄÄÆÄÀϰú ¸µÅ© °úÁ¤À» °ÅÃļ­ ½ÇÇà ÆÄÀÏÀ» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.

# as write-records.s -o write-records.o
# as write.s -o write.o
# ld write-records.o write.o -o write-records
			
¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥Àº 2°³ÀÇ ÆÄÀÏ·Î ³ª´µ¾îÁ® ÀÖ´Ù. ±×·¯¹Ç·Î À̵éÀ» Çϳª·Î ¹­¾îÁÖ´Â(link)°úÁ¤ÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ¸µÅ©´Â ld linker¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. ¸¸µé¾îÁø ½ÇÇàÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ½ÇÇà ½Ãų ¼ö ÀÖ´Ù.
# ./write-records
			
½ÇÇàµÇ°í ³ª¸é test.dat¶ó´Â ÆÄÀÏÀÌ ¸¸µé¾î Áø´Ù. ÀÌ ÆÄÀÏÀ» vi¿¡µðÅÍ·Î È®ÀÌÇØ º¸¸é ÀÏ¹Ý ÅØ½ºÆ® ÆÄÀϰú´Â Á» ´Ù¸£°Ô Ãâ·ÂµÉ °ÍÀÌ´Ù. ÀÌÀ¯´Â NULL°ú °°Àº Ãâ·ÂµÉ ¼ö ¾ø´Â ¹®ÀÚµéÀÌ Æ÷ÇԵǾî Àֱ⠶§¹®ÀÌ´Ù. ¾î¶µç ·¹Äڵ带 ¼º°øÀûÀ¸·Î ½èÀ¸´Ï, ÀÌÁ¦ ·¹ÄÚµå·Î ºÎÅÍ ÀоîµéÀÌ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.

6.2. ·¹ÄÚµå Àбâ

¿©±â¿¡¼­´Â ÀúÀåµÈ ·¹ÄÚµå·Î ºÎÅÍ À̸§, ÁÖ¼Ò, ³ªÀ̸¦ Àоî¿Í¼­ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.

¿ì¸®°¡ Ãâ·ÂÇϰíÀÚ ÇÏ´Â ·¹ÄÚµåÀÇ ÇʵåÁß À̸§°ú ÁÖ¼Ò´Â °íÁ¤µÈ ±æÀ̸¦ °¡Áö°í ÀÖÁö ¾Ê´Ù. ±×·¯¹Ç·Î ¸î°³ÀÇ ¹®ÀÚ¸¦ ½á¾ßÇÏ´ÂÁö¸¦ °è¼öÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ´ÙÇàÈ÷µµ ¿ì¸®´Â ·¹Äڵ带 ÀûÀ» ¶§, ÇʵåÀÇ ³¡À» '\0'·Î Æ÷¸ËÇßÀ½À¸·Î, '\0'À» ¸¸³¯¶§±îÁö ÀоîµéÀÎ ¹®ÀÚ¸¸ °è¼öÇÏ¸é µÈ´Ù. °¡Á¤ ¸ÕÀú ¹®ÀÚÀÇ °¹¼ö¸¦ °è¼öÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÀÌ ÇÁ·Î±×·¥ÀÇ À̸§Àº count-chars.s·Î ÇϰڴÙ.

# ¸ñ    Àû : null byte¸¦ ¸¸³¯ ¶§±îÁö ¹®ÀÚÀÇ °¹¼ö¸¦ °Ë»çÇÑ´Ù.
# ÀÔ    ·Â : ¹®ÀÚ¿­ÀÇ ÁÖ¼Ò  
# Ãâ    ·Â : ¹®ÀÚ¿­ÀÇ °¹¼ö¸¦ %eax·Î 
# ÇÁ·Î¼¼½º :
#   %ecx  -  ¹®ÀÚ Ä«¿îÆ®
#   %al   -  ÇöÀç ¹®ÀÚ
#   %edx  -  ÇöÀç ¹®ÀÚ ÁÖ¼Ò 

.include "linux.s"
.include "record-def.s"

.type count_chars, @function
.globl count_chars

# ù¹øÂ° ÀÎÀÚ°¡ µé¾î ÀÖ´Â ½ºÅà 
.equ ST_STRING_START_ADDRESS, 8

count_chars:
pushl %ebp
movl  %esp, %ebp

# 0ºÎÅÍ Ä«¿îÆ®¸¦ ½ÃÀÛÇÑ´Ù.
movl $0, %ecx
movl ST_STRING_START_ADDRESS(%ebp), %edx

count_loop_begin:
# ÃÖ±Ù ¹®ÀÚ¸¦ °¡Á®¿Â´Ù.
movb (%edx), %al 

# nullÀÎÁö °Ë»çÇÑ´Ù.
cmpb $0, %al
# ¸¸¾à nullÀ̶ó¸é ·çÇÁ¸¦ ³¡³½´Ù.
je count_loop_end

# ³ÎÀÌ ¾Æ´Ï¶ó¸é Æ÷ÀÎÅÍ¿Í Ä«¿îÆ®¸¦ 1¾¿ Áõ°¡ ½ÃŲ´Ù. 
incl %ecx
incl %edx

# ·çÇÁÀÇ Ã³À½À¸·Î µÇµ¹¾Æ °£´Ù.
jmp  count_loop_begin

count_loop_end:
# Ä«¿îÆ® °á°ú¸¦ %eax·Î º¹»çÇÑ´Ù.  
movl %ecx, %eax

popl %ebp
ret
			
ÀÌÇØÇϱ⿡ º° ¾î·Á¿î Á¡ÀÌ ¾ø´Â °£´ÜÇÑ ÄÚµå´Ù. ÀÌ ÄÚµå´Â µ¥ÀÌŸ ÁÖ¼Ò·Î ºÎÅÍ 1¹ÙÀÌÆ®¾¿ ÀÐ¾î ³ª°¡¸é¼­ +1À» ÇÑ´Ù. ¸¸¾à ÀÐÀº ¹ÙÀÌÆ®°¡ '\0'À̶ó¸é Áö±Ý±îÁö °è¼öÇÑ ¼ö¸¦ ¸®ÅÏÇÑ´Ù.

ÀÌÁ¦ ½ÇÁ¦ ÆÄÀÏ·Î ºÎÅÍ ·¹Äڵ带 ÀоîµéÀÌ´Â Äڵ带 ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ÀÌ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº È帧À» °¡Áú °ÍÀÌ´Ù.

  • ÆÄÀÏÀ» ¿¬´Ù

  • ·¹Äڵ带 Àд´Ù.

  • À̸§ ¹®ÀÚ¿­ÀÇ Å©±â¸¦ °è¼öÇÑ´Ù.

  • À̸§À» Ç¥ÁØ Ãâ·ÂÇÑ´Ù.

  • °³Ç๮ÀÚ¸¦ Ãâ·ÂÇÑ´Ù.

  • ´Ù¸¥ ·¹Äڵ带 Àд´Ù.

ÀÌÁ¦ ¿ì¸®´Â °³Ç๮ÀÚ¸¦ Ãâ·ÂÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé °ÍÀÌ´Ù. À̰ÍÀº °¢ ÇʵåÀÇ °ªÀ» Ãâ·ÂÇÑ ÈÄ Çʵ带 ±¸ºÐÇØ¼­ º¸±â ÁÁ°Ô ¸¸µé±â À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº read-records.s·Î ÇϰڴÙ.

.include "linux.s"
.globl write_newline
.type write_newline, @function
.section .data

newline:
.ascii "\n"
.section .text
.equ ST_FILEDES, 8

write_newline:
pushl %ebp
movl  %esp, %ebp

movl $SYS_WRITE, %eax
movl ST_FILEDES(%ebp), %ebx
movl $newline, %ecx
movl $1, %edx
int  $LINUX_SYSCALL
movl %ebp, %esp 
popl %ebp
ret
			

ÀÌÁ¦ ½ÇÁ¦ ·¹ÄÚµå·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àоî¿À´Â ¸ÞÀÎÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº read-records.s·Î ÇϰڴÙ.

.include "linux.s"
.include "record-def.s"

.section .data

file_name:
.ascii "test.dat\0"

.section .bss
.lcomm record_buffer, RECORD_SIZE

.section .text

# Main ÇÁ·Î±×·¥ 
.globl _start

_start:
# ÀԷ°ú Ãâ·ÂÀ» À§ÇÑ ÆÄÀÏÁöÁ¤ÀÚÀÇ ½ºÅÃÀ§Ä¡¸¦ 
# °è»ê
.equ ST_INPUT_DESCRIPTOR, -4
.equ ST_OUTPUT_DESCRIPTOR, -8

# ½ºÅà Æ÷ÀÎÅ͸¦ %ebp·Î º¹»çÇÑ´Ù.
movl %esp, %ebp
# ÆÄÀÏÁöÁ¤ÀÚ¸¦ À§ÇÑ °ø°£À» ÇÒ´çÇÑ´Ù.
subl $8, %esp

# ÆÄÀÏÀ» ¿¬´Ù.
movl $SYS_OPEN, %eax
movl $file_name, %ebx
movl $0, %ecx        # Àбâ Àü¿ëÀ¸·Î ¿¬´Ù.
movl $0666, %edx
int  $LINUX_SYSCALL

# ÀÔ·ÂÀ» À§ÇÑ ÆÄÀÏ ÁöÁ¤ÀÚ¸¦ ÀúÀåÇÑ´Ù.
movl %eax, ST_INPUT_DESCRIPTOR(%ebp)

# Ç¥ÁØ Ãâ·Â(1)À» À§ÇÑ ÆÄÀÏÁöÁ¤ÀÚ¸¦ ÀúÀåÇÑ´Ù. 
movl $STDOUT, ST_OUTPUT_DESCRIPTOR(%ebp)

record_read_loop:  
pushl ST_INPUT_DESCRIPTOR(%ebp)
pushl $record_buffer
call  read_record 
addl  $8, %esp

# ÀоîµéÀÎ µ¥ÀÌÅÍÀÇ ±æÀ̰¡  
# ·¹ÄÚµå Å©±â¿Í °°ÀºÁö È®ÀÎÇÑ´Ù. 
# ·¹ÄÚµå Å©±â¿Í ´Ù¸£´Ù¸é ·çÇÁ¸¦ ¹þ¾î³­´Ù. 
cmpl  $RECORD_SIZE, %eax
jne   finished_reading

# ±×·¸Áö ¾Ê´Ù¸é ·¹ÄÚµåÀÇ À̸§À» Ãâ·ÂÇÑ´Ù. 
# À̸§À» Ãâ·ÂÇϱâ À§Çؼ­´Â ¹®ÀÚ¿­ÀÇ Å©±â¸¦ 
# Àоî¿Í¾ß ÇÑ´Ù.
pushl $RECORD_FIRSTNAME + record_buffer
call  count_chars
addl  $4, %esp

movl  %eax, %edx
movl  ST_OUTPUT_DESCRIPTOR(%ebp), %ebx
movl  $SYS_WRITE, %eax
movl  $3, %ecx
int   $LINUX_SYSCALL
ret

pushl ST_OUTPUT_DESCRIPTOR(%ebp)
call  write_newline
addl  $4, %esp

jmp   record_read_loop

finished_reading:
movl $SYS_EXIT, %eax
movl $0, %ebx
int  $LINUX_SYSCALL
			

ÀÌÁ¦ Áö±Ý±îÁöÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ°í ¸µÅ©Çؼ­ ½ÇÇà°¡´ÉÇÑ ÆÄÀÏ·Î ¸¸µé¾î º¸ÀÚ.

# as count-chars.s -o count-chars.o
# as write-newline.s -o write-newline.o 
# as read-records.s -o read-records.o
# as read.s -o read.o
# ld read.o read-records.o write-newline.o count-chars.o -o read-records
			
ÇÁ·Î±×·¥Àº ./read-records ·Î ½ÇÇà½Ãų ¼ö ÀÖ´Ù.

6.3. ·¹ÄÚµå ¼öÁ¤

ÀÌ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº Äڵ念¿ªÀ» °¡Áø´Ù.

  • ÀÔ·ÂÆÄÀϰú Ãâ·ÂÆÄÀÏÀ» ¿¬´Ù.

  • ÀÔ·ÂÆÄÀÏ·Î ºÎÅÍ ·¹Äڵ带 Àд´Ù.

  • ³ªÀ̸¦ Áõ°¡ ½ÃŲ´Ù.

  • Ãâ·ÂÆÄÀÏ¿¡ ¾´´Ù.

´ÙÀ½Àº ·¹ÄÚµåÀÇ °ªÀ» ¼öÁ¤Çؼ­ ´Ù¸¥ ÆÄÀÏ·Î ÀúÀåÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº add-year.s·Î ÇϰڴÙ.

.include "linux.s"
.include "record-def.s"

.section .data
input_file_name:
.ascii "test.dat\0"

output_file_name:
.ascii "testout.dat\0"

.section .bss
.lcomm record_buffer, RECORD_SIZE

.equ ST_INPUT_DESCRIPTOR, -4
.equ ST_OUTPUT_DESCRIPTOR, -8


.section .text
.globl _start


_start:
movl %esp, %ebp
subl $8, %esp 

movl $SYS_OPEN, %eax
movl $input_file_name, %ebx
movl $0, %ecx
movl $0666, %edx
int  $LINUX_SYSCALL

movl %eax, ST_INPUT_DESCRIPTOR(%ebp)

# ¾²±â À§Çؼ­ ÆÄÀÏ ¿­±â
movl  $SYS_OPEN, %eax
movl  $output_file_name, %ebx
movl  $0101, %ecx
movl  $0666, %edx
int   $LINUX_SYSCALL

movl  %eax, ST_OUTPUT_DESCRIPTOR(%ebp)


loop_begin:
pushl ST_INPUT_DESCRIPTOR(%ebp) 
pushl $record_buffer
call  read_record 
addl  $8, %esp

# read·Î ºÎÅÍÀÇ ¸®Åϰª°ú ·¹ÄÚµåÅ©±â¸¦ ºñ±³ÇÑ´Ù.
# ¸¸¾à ·¹ÄÚµå Å©±â¿Í °°Áö ¾Ê´Ù¸é ·çÇÁ¸¦ Á¾·áÇÑ´Ù. 
cmpl  $RECORD_SIZE, %eax
jne   loop_end

# ³ªÀ̸¦ Áõ°¡½ÃŲ´Ù.
incl  record_buffer + RECORD_AGE

pushl ST_OUTPUT_DESCRIPTOR(%ebp)
push  $record_buffer
call  write_record
addl  $8, %esp

jmp   loop_begin

loop_end:
movl  $SYS_EXIT, %eax
movl  $0, %ebx
int   $LINUX_SYSCALL
			

ÄÚµùÀ» ¸¶ÃÆ´Ù¸é ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ½ÇÇàÆÄÀÏÀ» »ý¼ºÇϵµ·Ï ÇÏÀÚ.

# as add-year.s -o add-year.o
# ld add-year.o read.o write.o -o add-year
			
ÀÌ ÇÁ·Î±×·¥À» ./add-year·Î ½ÇÇà½Ãų ¼ö ÀÖ´Ù. ½ÇÇà½ÃŰ°í ³ª¸é testout.dat¶ó´Â ÆÄÀÏÀÌ »ý¼ºµÈ°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

Áö±Ý±îÁöÀÇ ³»¿ëÀ» ÅëÇØ¼­ ¿ì¸®´Â °íÁ¤µÈ ±æÀÌÀÇ ·¹Äڵ带 Á¦¾îÇÏ´Â ÇÁ·Î±×·¥Àº °£´ÜÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¹è¿ü´Ù. ´ÜÁö ÁöÁ¤µÈ Å©±â¸¸Å­ µ¥ÀÌÅ͸¦ Àо ¹öÆÛ¿¡ ½×°í, ÀÌ·± Àú·± ÀÛ¾÷À» ÇØ¼­ Ãâ·ÂÇϱ⸸ ÇÏ¸é µÈ´Ù.

6.4. ¸¶Ä¡¸ç

6.4.1. º¹½À

  • ·¹ÄÚµå¶õ ¹«¾ùÀΰ¡ ?

  • °íÁ¤µÈ ±æÀ̸¦ °¡Áø ·¹Äڵ尡 ±×·¸Áö ¾ÊÀº ·¹Äڵ忡 ´ëÇØ¼­ ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡Àº ¹«¾ùÀΰ¡.

  • ¿©·¯°³ÀÇ ÆÄÀÏ·Î ºÐ¸®µÈ ¾î¼Àºí¸® ¼Ò½º¿¡¼­ »ó¼ö¸¦ Æ÷ÇÔ½ÃŰ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¼³¸íÇϽÿÀ.

  • ¿Ö ¿©·¯°³ÀÇ ÇÁ·Î±×·¥ ÆÄÀÏ·Î ³ª´©¾î¼­ ÇÁ·Î±×·¥À» ÀÛ¼ºÇϴ°¡.

  • record_buffer + RECORD_AGE °¡ ÀǹÌÇÏ´Â ¹Ù¸¦ ¼³¸íÇϽÿÀ. ¿Ö ¾îµå·¡½º ¸ðµå¸¦ »ç¿ëÇϰí Àִ°¡ ?

6.4.2. ¿¬½À¹®Á¦

  • ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀÎÀÚ·Î ÆÄÀÏÀ̸§À» ¹Þµµ·Ï ¿¹Á¦ ÇÁ·Î±×·¥µéÀ» ¼öÁ¤ÇØ º¸ÀÚ.

  • lseek(2) ½Ã½ºÅÛ È£Ãâ¿¡ ´ëÇØ¼­ ¿¬±¸ÇØ º¸µµ·ÏÇÏÀÚ. lseek¸¦ ÀÌ¿ëÇØ¼­ ÀÐÀº ÆÄÀÏÀÇ ³ªÀ̸¦ ¼öÁ¤ÇÑ ÈÄ ´Ù½Ã ÀúÀåÇϵµ·Ï add-year ÇÁ·Î±×·¥À» ¼öÁ¤Çغ¸ÀÚ.

  • Űº¸µå·ÎºÎÅÍ ·¹ÄÚµå °ªÀ» ÀԷ¹޾Ƽ­ ÆÄÀÏ·Î ¾²´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÑ´Ù.

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