orange's一个操作系统的实现--学习过程 第一章:a 为什么要org 07c00h?

为什么要org 07c00h? 这个问题在书中作者的解释是:
我们知道,当计算机电源被打开时,它会先进行加电自检(POST),然后寻找启动盘,如果是选择从软盘启动,计算机就会检

查软盘的0面0磁道1扇区,如果发现它以0xAA55(9)结束,则BIOS认为它是一个引导扇区。当然,一个正确的引导扇区除了以0xAA55结束之外,还应该包含一段少于512字节的执行码。好了,一旦BIOS发现了引导扇区,就会将这512字节的内容装载到内存地址0000:7c00处,然后跳转到0000:7c00处将控制权彻底交给这段引导代码。

到此为止,计算机不再由BIOS中固有的程序来控制,而变成由操作系统的一部分来控制。现在,你可能明白了为什么在那段代码的第一行会出现“org0  7c00”这样的代码。没错,这行代码就是告诉编译器,将来我们的这段程序要被加载到内存偏移地址0x7c00处。


--百度结果

因为编译器在编译时的地址是从第一行开始用0000h开始相对计算的.假如我们定义一个str: dw "zxy"它的相对地址是0000h,如果我们mov ax str那么就是将0000h传给ax,这在编译后的执行码中是固定的.而引导扇区是使用绝对地址执行的,指令从07c00h处开始执行,那么访问0000h绝对是错误的访问.真实的绝对地址是07c00h+0000h,所以如果你不写org 07c00h,把mov ax str写成mov ax str+07c00h对于传址操作是一样的目的.对于作者的那段程序可以去掉第一行的org 07c00h.把"mov ax,BootMessage"改成"mov ax,BootMessage+07c00h",效果是一样的.但是如果有大量的传址操作,那就要在每个地方都要+07c00h,那是一件非常头痛的事.所以在第一行加上org 07c00h只是让编译器从相对地址org 07c00h处开始编译第一条指令,那么下面的相对地址被编译加载后就正好和绝对地址吻合。


可以反汇编出来代码进行比较:
bootNOorg.asm仅仅把boot.asm的org命令注释掉

nasm  boot.asm  -o  boot.bin 
ndisasm -o 0x7c00 boot.bin >> disboot.asm 

nasm  bootNOorg.asm  -o  bootNOorg.bin
ndisasm -o 0x7c00 bootNOorg.bin >> disbootNOorg.asm 

比较一下  disboot.asm 和disbootNOorg.asm ,除了引用的变量地址不一样其他都是一样的:

orange's一个操作系统的实现--学习过程 第一章:a 为什么要org 07c00h?