|
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¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. ¸¸µé¾îÁø
½ÇÇàÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ½ÇÇà ½Ãų ¼ö ÀÖ´Ù.
½ÇÇàµÇ°í ³ª¸é 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 ÇÁ·Î±×·¥À» ¼öÁ¤Çغ¸ÀÚ.
Űº¸µå·ÎºÎÅÍ ·¹ÄÚµå °ªÀ» ÀԷ¹޾Ƽ ÆÄÀÏ·Î ¾²´Â ÇÁ·Î±×·¥À»
¸¸µé¾î º¸µµ·Ï ÇÑ´Ù.
|
|