6.2. Hello, world!

6.2.1. Program layout

¸®´ª½º´Â 32ºñÆ® ÇÁ·ÎÅØÆ¼µå ¸ðµå¿¡¼­ µ¿ÀÛÇϸç, ¼±Çü ¸Þ¸ð¸® ¸ðµ¨(flat memory model)À» °¡Áø´Ù. ±×¸®°í, ÀÌÁø ½ÇÇàÆÄÀÏ¿¡ ELF Æ÷¸ËÀ» °¡Áø´Ù.

ÇÁ·Î±×·¥Àº ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ Äڵ尡 ÀÖ´Â .text ¼½¼Ç°ú (ÀÌ ºÎºÐÀº Àбâ Àü¿ëÀÌ´Ù) ¿©·¯ºÐÀÇ ÃʱâÈ­µÈ(!) data °¡ ÀúÀåµÇ¾î ÀÖ´Â .data ¼½¼Ç, ÃʱâÈ­µÇÁö ¾ÊÀº(!) µ¥ÀÌŸ°¡ ÀúÀåµÇ´Â .bss ¼½¼Ç ¹× ´Ù¸¥ Ç¥ÁØÀûÀÎ ¼½¼Çµé·Î ³ª´¶´Ù. Å©°Ô º¸¸é, .text ¿Í .data ÀÇ µÎ°³ÀÇ ¼½¼ÇÀ¸·Î ³ª´¶´Ù. (Áï, ÄÚµå¿Í µ¥ÀÌŸ) ±×·¯³ª, ´Ù¸¥ ¼½¼Ç ¾øÀÌ .text ¼½¼Ç¸¸À¸·Îµµ ÇÁ·Î±×·¥ÀÌ °¡´ÉÇÏ´Ù. .text ¼½¼ÇÀº ÇÁ·Î±×·¥¿¡ ¹Ýµå½Ã ÀÖ¾î¾ß ÇÏ´Â ¼½¼ÇÀÌ´Ù. (¿ªÀÚÁÖ : »ó»óÇØº¸¶ó! ÄÚµå ¾ø´Â ÇÁ·Î±×·¥ -- ¸»µµ ¾ÈµÈ´Ù.)

ÀÌÁ¦, ù¹øÂ° ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸ÀÚ (¿ªÀÚÁÖ : ¿ª½Ã³ª.. Çï·Î¿ùµå ÇÁ·Î±×·¥ÀÌ´Ù ¤Ñ.¤Ñ)

6.2.2. NASM (hello.asm)

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	;Ä¿³ÎÀ» È£ÃâÇÑ´Ù.

6.2.3. GAS (hello.S)

.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       # Ä¿³ÎÀ» È£ÃâÇÑ´Ù.