title: Difference between "section" and "segment" in NASM
body: <p>I am using some baby NASM programs to help me learn the language. </p>
  
  <p>From what I've read, NASM programs can have three sections; the .data, the .bss, and the .text which is mandatory. However I am finding very often that sometimes the names of the divisions are <code>section</code> and other times it's <code>segment</code>.</p>
  
  <p>For example with this "Hello World" I found online:</p>
  
  <pre><code>;  hello.asm  a first program for nasm for Linux, Intel, gcc
  ;
  ; assemble: nasm -f elf -l hello.lst  hello.asm
  ; link:     gcc -o hello  hello.o
  ; run:          hello 
  ; output is:    Hello World 
  
      SECTION .data       ; data section
  msg:    db "Hello World",10 ; the string to print, 10=cr
  len:    equ $-msg       ; "$" means "here"
                  ; len is a value, not an address
  
      SECTION .text       ; code section
          global main     ; make label available to linker 
  main:               ; standard  gcc  entry point
  
      mov edx,len     ; arg3, length of string to print
      mov ecx,msg     ; arg2, pointer to string
      mov ebx,1       ; arg1, where to write, screen
      mov eax,4       ; write sysout command to int 80 hex
      int 0x80        ; interrupt 80 hex, call kernel
  
      mov ebx,0       ; exit code, 0=normal
      mov eax,1       ; exit command to kernel
      int 0x80        ; interrupt 80 hex, call kernel
  </code></pre>
  
  <p>If I change every instance of <code>SECTION</code> to <code>SEGMENT</code> it will still work.</p>
  
  <p>Can someone explain the difference between the two, if any?</p>