文章转自:http://liuyj03.blog.163.com/blog/static/14061922820101015104333103/
经常看到汇编代码里面有这样的一条指令:
org 0x7c00 ; A is a address
start:
mov ax msg
....(other codes)...
msg: db "hello,world"
org A :作用是使得其后面的代码从地址A开始。
假设msg前面有10个字节,那么org 0x7c00的作用将使start的地址为0x7c00,msg的地址就是0x7c0a,汇编编译器对代码进行编译的时候,会把msg的地址为0x7c0a赋值给ax,相当于 mov ax 0x7c0a;如果没有org 0x7c00的话,那么start的地址将默认为0x0000,则msg的地址为0x000a,相当于mov ax 0x000a;
那么为什么使用org使代码从某个地址(比如0x7c00)开始呢?
原因是这些代码会被其他程序加载到内存的首地址(0x7c00)中,并跳到该地址执行这些代码。一个典型的例子就是linux内核的启动代码,bios会把启动代码加载到内存0x7c00处,并跳到该地址开始执行。如上面代码,mov ax msg这句本来是期望把0x7c0a赋值给ax寄存器的,如果启动代码不使用org 0x7c00的话,则赋值给ax的便是0x000a,结果显然是不符合预期的。