为什么要org 07c00h?
来源:互联网 发布:什么是办公软件 编辑:程序博客网 时间:2024/05/18 06:10
为什么要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处开始编译第一条指令,那么下面的
相对地址被编译加载后就正好和绝对地址吻合.
- 为什么要org 07c00h?
- 引导程序为什么要org 07c00h
- 为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢
- org 07c00h的原因
- org 07c00h的原因
- 关于引导程序第一条指令为什么是org 07c00h,org到底是干嘛的
- 关于引导程序第一条指令为什么是org 07c00h,org到底是干嘛的
- 汇编语言org 07c00h的作用
- 关于07c00h
- linux引导程序为什么要把自己加载到内存的7c00h这个特定的地方?
- FFFF0h与07C00h [转自blackchoc 的blog]
- BIOS选择07c00h加载引导程序的解释
- [BOOT部分]boot.asm为什么要使用org汇编指令
- 为什么org.junit.Assert.assertTrue要静态导入
- 为什么执行测试用例时报需要 org.junit 4???
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener为什么找不到?
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener为什么找不到?
- 关于mov 4c00h int 21h的说明
- MyEclipse开发java项目遇到的怪事
- 积分机制的研究!
- 喜欢的一段话
- Date类学习总结
- PHP第三方支付接口,银行接口(附下载),third party bank interface
- 为什么要org 07c00h?
- PyDev for Eclipse 简介
- 云计算七问七答
- 并发,同步异步
- Oracle中date型数据检索
- Oracle to_char格式化函数
- 由挂机程序所想到的!
- 正则(正规)表达式基础
- 静静的写我的博客