x86 NASM 'org' directive meaning

tdenniston picture tdenniston · Nov 15, 2011 · Viewed 10.1k times · Source

I am following this tutorial as a first foray into bootloader/OS development for x86 using NASM:

http://joelgompert.com/OS/TableOfContents.htm

And I'm on Lesson 4, which is making my bootloader print the "Hello, world" string. I'm not understanding the meaning of the org instruction (directive?).

As I understand it, org defines where the program being executed is loaded into memory. This is needed when using any sort of labels or relative addresses in the program.

Suppose I have a string defined with a label like this in my program:

szHello db 'Hello, world!', 0

And I then later try to reference that label like this (only relevant snippets):

org 0x7c00
xor ax, ax
mov ds, 0
...
mov si, szHello
lodsb
...
int 0x10 ; Print first character of szHello

My question is, why is that not equivalent to this? :

org 0
mov ds, 0x7c00
...
mov si, szHello
lodsb
...
int 0x10

When I run the first example, my string appears correctly. The second example does not work.

Pointers to relevant documentation would also be greatly appreciated, if the issue is a conceptual problem on my part.

Answer

Chris Dodd picture Chris Dodd · Nov 15, 2011

org defines where the program in question EXPECTS to be loaded into memory. Not where it actually is loaded -- that is controlled by whoever does the loading -- but where it expects to be loaded.