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:
| 
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
 | 
| 
.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
 |