Hello, world!

Linux Assembly HOWTO
Prev | Chapter 6. Quick start | Next

# 6.2. Hello, world!

## 6.2.1. Program layout

Linux is 32-bit, runs in protected mode, has flat memory model, and uses the ELF format for binaries.

A program can be divided into sections: `.text` for your code (read-only), `.data` for your data (read-write), `.bss` for uninitialized data (read-write); there can actually be a few other standard sections, as well as some user-defined sections, but there's rare need to use them and they are out of our interest here. A program must have at least `.text` section.

Now we will write our first program. Here is sample code:

## 6.2.2. NASM (hello.asm)

    section .text				;section declaration

    			;we must export the entry point to the ELF linker or
        global _start	;loader. They conventionally recognize _start as their
    			;entry point. Use ld -e foo to override the default.

    _start:

    ;write our string to stdout

            mov     edx,len ;third argument: message length
            mov     ecx,msg ;second argument: pointer to message to write
            mov     ebx,1   ;first argument: file handle (stdout)
            mov     eax,4   ;system call number (sys_write)
            int     0x80	;call kernel

    ;and exit

    	mov	ebx,0	;first syscall argument: exit code
            mov     eax,1   ;system call number (sys_exit)
            int     0x80	;call kernel

    section .data				;section declaration

    msg     db      "Hello, world!",0xa	;our dear string
    len     equ     $ - msg                 ;length of our dear string

## 6.2.3. GAS (hello.S)

    .text					# section declaration

    			# we must export the entry point to the ELF linker or
        .global _start	# loader. They conventionally recognize _start as their
    			# entry point. Use ld -e foo to override the default.

    _start:

    # write our string to stdout

    	movl	$len,%edx	# third argument: message length
    	movl	$msg,%ecx	# second argument: pointer to message to write
    	movl	$1,%ebx		# first argument: file handle (stdout)
    	movl	$4,%eax		# system call number (sys_write)
    	int	$0x80		# call kernel

    # and exit

    	movl	$0,%ebx		# first argument: exit code
    	movl	$1,%eax		# system call number (sys_exit)
    	int	$0x80		# call kernel

    .data					# section declaration

    msg:
    	.ascii	"Hello, world!\n"	# our dear string
    	len = . - msg			# length of our dear string

Prev | Home | Next
Introduction | Up | Building an executable