¸®´ª½º´Â 32ºñÆ® ÇÁ·ÎÅØÆ¼µå ¸ðµå¿¡¼ µ¿ÀÛÇϸç, ¼±Çü ¸Þ¸ð¸® ¸ðµ¨(flat memory model)À» °¡Áø´Ù. ±×¸®°í, ÀÌÁø ½ÇÇàÆÄÀÏ¿¡ ELF Æ÷¸ËÀ» °¡Áø´Ù.
ÇÁ·Î±×·¥Àº ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ Äڵ尡 ÀÖ´Â .text ¼½¼Ç°ú (ÀÌ ºÎºÐÀº Àбâ Àü¿ëÀÌ´Ù) ¿©·¯ºÐÀÇ ÃʱâȵÈ(!) data °¡ ÀúÀåµÇ¾î ÀÖ´Â .data ¼½¼Ç, ÃʱâȵÇÁö ¾ÊÀº(!) µ¥ÀÌŸ°¡ ÀúÀåµÇ´Â .bss ¼½¼Ç ¹× ´Ù¸¥ Ç¥ÁØÀûÀÎ ¼½¼Çµé·Î ³ª´¶´Ù. Å©°Ô º¸¸é, .text ¿Í .data ÀÇ µÎ°³ÀÇ ¼½¼ÇÀ¸·Î ³ª´¶´Ù. (Áï, ÄÚµå¿Í µ¥ÀÌŸ) ±×·¯³ª, ´Ù¸¥ ¼½¼Ç ¾øÀÌ .text ¼½¼Ç¸¸À¸·Îµµ ÇÁ·Î±×·¥ÀÌ °¡´ÉÇÏ´Ù. .text ¼½¼ÇÀº ÇÁ·Î±×·¥¿¡ ¹Ýµå½Ã ÀÖ¾î¾ß ÇÏ´Â ¼½¼ÇÀÌ´Ù. (¿ªÀÚÁÖ : »ó»óÇØº¸¶ó! ÄÚµå ¾ø´Â ÇÁ·Î±×·¥ -- ¸»µµ ¾ÈµÈ´Ù.)
ÀÌÁ¦, ù¹øÂ° ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸ÀÚ (¿ªÀÚÁÖ : ¿ª½Ã³ª.. Çï·Î¿ùµå ÇÁ·Î±×·¥ÀÌ´Ù ¤Ñ.¤Ñ)
section .data ;¼½¼Ç .data ¸¦ ¼±¾ðÇÑ´Ù.(¿©±âºÎÅÍ ; .data ¼½¼ÇÀÌ´Ù.) msg db "Hello, world!",0xa ;Ãâ·ÂÇÒ »ç¶û½º·±(!) ½ºÆ®¸µÀÌ´Ù. len equ $ - msg ;Ä£¾ÖÇÏ´Â(!) ¹®ÀÚ¿ÀÇ ±æÀÌ section .text ;¿©±âºÎÅÍ .text ¼½¼ÇÀÌ´Ù. ÄÚµåÀÖÀ½ ;ELF ¸µÄ¿³ª ·Î´õ¿¡°Ô ÇÁ·Î±×·¥ÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¾Ë·ÁÁÖ¾î¾ß global _start ;ÇÑ´Ù. ·Î´õ ȤÀº ¸µÄ¿´Â ÀϹÝÀûÀ¸·Î ¿£Æ®¸® Æ÷ÀÎÆ®°¡ _start ;¶ó°í °¡Á¤Çϰí ÀÖ´Ù. ÀÌ µðÆúÆ® ¼³Á¤À» ¹Ù²Ü·Á¸é, ;ld -e foo ¸¦ »ç¿ëÇ϶ó. _start: ;stdout ¿¡ ¿ì¸®ÀÇ »ç¶û½º·± ¹®ÀÚ¿À» Ãâ·ÂÇÏÀÚ. mov edx,len ;½Ã½ºÅÛ ÄÝ 4¹ø(sys_write)Àº ¼¼¹øÂ° Àμö·Î Ãâ·ÂÇÒ ¸Þ¼¼ÁöÀÇ ;±æÀ̸¦ ÃëÇÑ´Ù. mov ecx,msg ;½Ã½ºÅÛ ÄÝ 4¹øÀº µÎ¹øÂ° Àμö·Î Ãâ·ÂÇÒ ¸Þ¼¼Áö°¡ ´ã±ä ¸Þ¸ð¸® ;ÁÖ¼Ò¸¦ ÃëÇÑ´Ù. Áï, Ãâ·ÂÇÒ ¸Þ¼¼Áö·ÎÀÇ Æ÷ÀÎÅ͸¦ ÃëÇÑ´Ù. mov ebx,1 ;½Ã½ºÅÛ ÄÝ 4¹øÀº ù¹øÂ° Àμö·Î ÆÄÀÏÀÇ ÇÚµé(µð½ºÅ©¸³ÅÍ)À» ;ÃëÇÑ´Ù. mov eax,4 ;eax ·¹Áö½ºÅÍ¿¡ È£ÃâÇÒ Ä¿³Î ½Ã½ºÅÛ ÄÝÀÇ ¹øÈ£¸¦ ³Ö¾î ÁØ´Ù. ;ÀÌ °æ¿ì¿¡´Â 4¹ø(sys_write) ÀÌ´Ù. int 0x80 ;Ä¿³ÎÀ» È£ÃâÇÑ´Ù. ;Ãâ·ÂÀÌ ³¡³µÀ¸¸é, exit ¸¦ È£ÃâÇÑ´Ù. mov ebx,0 ;exit ÄÚµå·Î 0À» ÁØ´Ù. (c ÄÚµå·Î´Â exit(0);) mov eax,1 ;½Ã½ºÅÛ ÄÝ 1¹ø (sys_exit) int 0x80 ;Ä¿³ÎÀ» È£ÃâÇÑ´Ù. |
.data # ¼½¼Ç .data °¡ ¿©±â¼ºÎÅÍ ½ÃÀÛÇÑ´Ù. msg: .string "Hello, world!\n" # ¿ì¸®ÀÇ »ç¶û½º·± ¹®ÀÚ¿ len = . - msg # Ä£¾ÖÇÏ´Â ¹®ÀÚ¿ÀÇ ±æÀÌ .text # ¼½¼Ç .text °¡ ¿©±â¼ºÎÅÍ ½ÃÀÛÇÑ´Ù. # ELF ¸µÄ¿³ª ·Î´õ¿¡°Ô ÇÁ·Î±×·¥ÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ¾Ë·ÁÁÖ¾î¾ß .global _start # ÇÑ´Ù. ·Î´õ ȤÀº ¸µÄ¿´Â ÀϹÝÀûÀ¸·Î ¿£Æ®¸® Æ÷ÀÎÆ®°¡ _start # ¶ó°í °¡Á¤Çϰí ÀÖ´Ù. ÀÌ µðÆúÆ® ¼³Á¤À» ¹Ù²Ü·Á¸é, # ld -e foo ¸¦ »ç¿ëÇ϶ó. _start: # stdout ¿¡ ¿ì¸®ÀÇ »ç¶û½º·± ¹®ÀÚ¿À» Ãâ·ÂÇÏÀÚ. movl $len,%edx # ½Ã½ºÅÛ ÄÝ 4¹ø(sys_write)Àº ¼¼¹øÂ° Àμö·Î Ãâ·ÂÇÒ # ¸Þ¼¼ÁöÀÇ ±æÀ̸¦ ÃëÇÑ´Ù. movl $msg,%ecx # ½Ã½ºÅÛ ÄÝ 4¹øÀº µÎ¹øÂ° Àμö·Î Ãâ·ÂÇÒ ¸Þ¼¼Áö°¡ # ´ã±ä ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ÃëÇÑ´Ù. Áï, Ãâ·ÂÇÒ ¸Þ¼¼Áö·ÎÀÇ # Æ÷ÀÎÅ͸¦ ÃëÇÑ´Ù. movl $1,%ebx # ½Ã½ºÅÛ ÄÝ 4¹øÀº ù¹øÂ° Àμö·Î ÆÄÀÏÀÇ # ÇÚµé(µð½ºÅ©¸³ÅÍ)À» ÃëÇÑ´Ù. movl $4,%eax # eax ·¹Áö½ºÅÍ¿¡ È£ÃâÇÒ Ä¿³Î ½Ã½ºÅÛ ÄÝÀÇ ¹øÈ£¸¦ # ³Ö¾î ÁØ´Ù. ÀÌ °æ¿ì¿¡´Â 4¹ø(sys_write) ÀÌ´Ù. int $0x80 # Ä¿³ÎÀ» È£ÃâÇÑ´Ù. # Ãâ·ÂÀÌ ³¡³µÀ¸¸é, exit ¸¦ È£ÃâÇÑ´Ù. movl $0,%ebx # exit ÄÚµå·Î 0À» ÁØ´Ù. (c ÄÚµå·Î´Â exit(0);) movl $1,%eax # ½Ã½ºÅÛ ÄÝ 1¹ø (sys_exit) int $0x80 # Ä¿³ÎÀ» È£ÃâÇÑ´Ù. |