有很多人看了"自己动手写操作系统"或其第二版这本书后对这一行提出疑问。 这个问题在书中作者的解释是: 告诉编译器,将来我们的这段程序要被加载到07c00处执行。 我们知道编译器本身在汇编时对指令的地址计算的是相对地址。而对于引导扇区,一切只是从无生有的 一般而言,“真实开始执行的引导扇区"都会固定装载到07c00处,主意这句话是说一个真正的引导扇区。 因为编译器在编译时的地址是从第一行开始用0000h开始相对计算的。假如我们定义一个str: dw "zxy" 但是如果有大量的传址操作,那就要在每个地方都要+07c00h,那是一件非常头痛的事。 所以在第一行加上org 07c00h只是让编译器从相对地址org 07c00h处开始编译第一条指令,那么下面的 另一篇文章的解释(其实差不多) 简单说来,该指令用来修正该指令以后出现的(变量/标志的)内存地址,也就是说如果有ORG 0x12345h,那么在该指令以后的变量的地址将被修正为0x12345+old_addr。 对于DOS中的COM文件,在被DOS装载进内存后,系统会在内存的CS:0000 – CS:0100区域创建一个PSP,这里存放了一些系统所需的信息,比如通过命令行所传递的参数等,COM文件的代码将被装载到CS:0100 – CS:XXXX的内存区域,所以说如果COM代码中不通过使用ORG 100h来进行修正的话,该段中的变量将不能被正确访问,这时,对改变量的访问将导致PSP中的数据被访问了,从而得不到预期的结果。对于EXE文件,其所采用的方式可能就不一样了,具体是怎样的,目前还不知道。。。 对于一些引导程序,这些程序将被BIOS装载到内存中的指定地方,通常为0000:7C00,这跟DOS装载COM文件的机制是一样的,只不过DOS是将COM文件的代码装载到CS:0100处。所以在,引导程序的汇编代码中,需要指定ORG 7C00H来对代码中的变量的内存地址进行修正。 如: ORG 7C00H msg db ‘HELLO WORLD’,0 MOV DX, OFFSET msg 在有ORG 7C00H的情况下,MOV DX, OFFSET msg对应的指令为MOV DX,7C4B(这里4B为msg在当前数据段中的偏移位置)如果没有ORG 7C00H,那么真正被执行的指令将为MOV SI,004B,试想,BIOS已经将该代码装载到0000:7C00处,0000:0000 – 0000:7C00之间的数据可能为其他更重要的数据,如果使用004B就得不到我们所要访问字符串msg,因为我们的字符串被BIOS放在7C4B这里了,所以我们的程序(最终由编译器来完成)就必须迎合BIOS的这种规定了。 计算机接电启动后,先运行存储在ROM中BIOS程序,然后BIOS程序将 系统引导程序的开始位置 加载到内存:0000:7C00的位置 |