title: NASM memory not being accessed correctly?
body: <p>So I am trying to print a simple hello world string using NASM in real mode.  As you might be able to tell by the org 0000:7C00 define, it is a test bootloader.  For some reason or another though, 'Hello World' is not being printed correctly.  Tried in VirtualBox and real hardware.</p>
  
  <p>When ran, it ends up printing a bunch of random shapes and figures, which has no resemblance to real letters, let alone 'Hello World'.  I'm thinking that it has to do with my segment registers not being set up properly, as I noticed that moving around the definition of MESSAGE changed the values that were being printed out.  I looked at this question:</p>
  
  <p><a href="https://stackoverflow.com/questions/6644881/simple-nasm-boot-program-not-accessing-memory-correctly">Simple NASM &quot;boot program&quot; not accessing memory correctly?</a></p>
  
  <p>But there were no answers there to my problem, and I do set up ds to be 0.  Any ideas what's going on?</p>
  
  <p>Also worth noting, i am compiling it into a flat binary.  The reason why it prints 'L' at the end is so I know that everything that was supposed to print before it worked.  Or, I guess in this case, didn't.</p>
  
  <pre><code>BITS 16
  
  org 0x0000:7C00
  
  start:
          mov ax, 0
          mov ds, ax
          mov es, ax
          mov fs, ax
          mov gs, ax
  
          mov ss, ax ;Puts 0 into the segment pointer, we are using real memory.
          mov sp, 0000:7C00 ;Moves 7C00 into the stack pointer, so that all data &lt;7C00 is stack.
  
          call print_string ;Calls print string.
          jmp Exit
  
  
  ;Prints the test string for now.
  print_string:
  
          mov si, MESSAGE
  
      .nextChar:
  
          mov ah, 0x0E
          mov al, [si]
          cmp al, 0x0
          je .end
  
          int 10h
          add si, 1
          jmp .nextChar
      .end:
          ret
  
  
      MESSAGE db "Hello world!", 0
  
  Exit:
      mov ah, 0x0E
      mov al, 'L'
      int 10h  
  
  
  times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
  dw 0xAA55      ; The standard PC boot signature
  </code></pre>