为什么要org 07c00h?
有很多人看了"自己动手写操作系统"或其第二版这本书后对这一行提出疑问.
这个问题在书中作者的解释是:
告诉编译器,将来我们的这段程序要被加载到07c00处执行.
说实话"自己动手写操作系统"这本书写得确实不错,我不是佩服作者的水平,而是作者的毅力,能把
这么枯橾的知识系统地一步一步地亲身实践并写成书(难度比我们随意地写BLOG要难千百倍吧),而且
作者尽自己的最大努力让读者能清楚明白.但是这几句话,作者说得一点也不明白.当然我们相信作者
自己肯定明白,但这样的表述"显示出"不明白.
我们知道编译器本身在汇编时对指令的地址计算的是相对地址.而对于引导扇区,一切只是从无生有的
阶段,是按绝对地址执行.那么对于用相对地址编译的执行码就要换算成绝对地址.
一般而言,"真实开始执行的引导扇区"都会固定装载到07c00处,主意这句话是说一个真正的引导扇区.
对于硬盘上,会有一个主引导扇区,然后由它来控制和其它引导扇区,比如grub控制windows,linux等.
那么这个主引导扇区会加载在0600h处,当选择其它可引导扇区时再将真正的可引导扇区加载到07c00h.
所以一般而言真正的可引导扇区都装载到07c00h处.
因为编译器在编译时的地址是从第一行开始用0000h开始相对计算的.假如我们定义一个str: dw"zxy"
它的相对地址是0100h,如果我们mov ax str那么就是将0100h传给ax,这在编译后的执行码中是固定的.
而引导扇区是使用绝对地址执行的,指令从07c00h处开始执行,那么访问0100h绝对是错误的访问.真实
的绝对地址是07c00h+0100h,所以如果你不写org 07c00h,把mov ax str写成mov ax str+07c00h对于
传址操作是一样的目的.对于作者的那段程序可以去掉第一行的org 07c00h.把"mov ax,BootMessage"
改成"mov ax,BootMessage+07c00h",效果是一样的.
但是如果有大量的传址操作,那就要在每个地方都要+07c00h,那是一件非常头痛的事.
所以在第一行加上org 07c00h只是让编译器从相对地址org 07c00h处开始编译第一条指令,那么下面的
相对地址被编译加载后就正好和绝对地址吻合.
分享到:
相关推荐
nosql07c.mp4
ALL07C编程器软件。。
大学生英语竞赛 07c卷 适合非英语专业本科生 需要下载阅读器
SERV2_07C_DoCuppt,SERV2_07C_DoCu
本人已经测试,灵图9 pc07c完全破解补丁。里面有破解说明,一定要按此步骤做。
OP07C 友顺UTC 电子元器件芯片
数据分析与R语言 视频 R07c.mp4
Python基础入门班 第7周 week07c.mp4
一款很老的编程器驱动,估计用的人也没有,发到这给老玩儿家用。
2007年的C语言上机一百题,有用没用看看再说。
R语言数据分析入门基础:07、 数据展现:R07c.flv
3.1.2仪表校正方法 请先将仪表的外壳打开,并将[W2]插头短接,通电后仪表显示[F1 0],即进入设定状态,按数字键[1~4]可以选择各大项,选择后按[确认]键进入该项,进入该项后可直接输入数字键选择...
我找了好久的,不知道有没有人需要就上传来了
源码07 多功能计算器源码07 多功能计算器源码07 多功能计算器源码07 多功能计算器源码07 多功能计算器
SERV2_07C_DoCu.pdf 介绍了关于SERV2_07C_DoCu的详细说明,提供理论教程的技术资料的下载。
人文英语1-国家开放大学电大机考网考题目答案-b6dab07c0a12a21614791711cc7931b764ce7b51.docx
搭建DNS服务器 MaraDNS MaraDNS是一个安全的DNS服务器。它最初被设计于工作在Linux和Unix类操作系统 ,现在已经被移植到了Windows平台。MaraDNS设计的尽可能安全,包含了抵抗缓冲区溢出的功能,要求以非特权用户...
OP07芯片资料,由于运算放大器芯片型号众多,本节通过几个实际电路的分析,明确运算放大器的对信号放大的影响,最后总结如何选择运放。 例一:运算放大器的对直流小信号放大的影响 这里的直流小信号指的是信号幅度...
1.为什么开始启动计算机的时候,执行的是BIOS代码而不是操作系统自身的代码? 因为CPU的逻辑电路被设计为只能运行内存中的程序,没有能力直接从软盘运行操作系统。...为什么BIOS把bootsect加载到0x07c00,而不是0