WHY

我们知道编译器本身在汇编时对指令的地址计算的是相对地址。而对于引导扇区,一切只是从无生有的
阶段,是按绝对地址执行,那么对于用相对地址编译的执行码就要换算成绝对地址。

一般而言,“真实开始执行的引导扇区"都会固定装载到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 0x12345h,那么在该指令以后的变量的地址将被修正为0x12345+old_addr。

对于DOS中的COM文件,在被DOS装载进内存后,系统会在内存的CS:0000 – CS:0100区域创建一个PSP,这里存放了一些系统所需的信息,比如通过

引导程序为什么要org 07c00h

命令行所传递的参数等,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的位置

引导程序为什么要org 07c00h相关推荐

  1. 自己写操作系统学习总结

    怎样自己写一个简单的操作系统? https://www.zhihu.com/question/20207347 我写的时候一些经历: 第一次写的时候3000行左右的就无法调试了,当时主要参考了linu ...

  2. 如何读emmc里的引导程序_自制操作系统学习1 引导程序

    本系列学习有前面的汇编学习基础最好,如果没有影响也不大本系列学习主要资源来自<[30天自制操作系统].(川合秀实)>,<自己动手写操作系统>两本书 一.准备工作 bochs v ...

  3. [reprint]如何编写引导程序 Hello World

    在存储介质(硬盘.软盘.光盘)中有一块特殊的区域,叫做引导区.在计算机启动后,BIOS会读取引导区内的代码到内存中去,然后将执行这些代码.引导区的位置和大小与计算机的平台有关,对于IBM-PC兼容机, ...

  4. 为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢

    这是因为 .com   载入内存后的起始偏址就是100h.   前面的100h字节是该程序的PSP 部分.   所以, 为了程序中对地址引用的正确,   必需加上org   100h语句. ----- ...

  5. 简单计算机java程序_JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单...

    JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单 JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单制作 汇编实现引导程序 ; 文件名 boot.asm org 7c ...

  6. linux引导程序切换

    #++++++++++++++++++++++++++++++++++++++++++++++++++ # 课题:linux引导程序切换 # 作者:胡昌文 # 日期:2008-6-30 # 系统平台: ...

  7. GRUB启动过程分析 GRUB 引导程序配置

    计算机在启动的时候,首先由BIOS中的程序执行自检,自检通过后,就根据CMOS的配置找到第一个可启动磁盘的MBR中的Boot Loader程序(一般在启动盘的第一个物理扇区,占416字节),并把控制权 ...

  8. org 07c00h的原因

    Boot Sector(引导扇区),一个正确的BootSector除了以0xAA55结束之外,还应该包含一段少于512B的执行码 源码分析     org07c00h            ;告诉编译 ...

  9. 自己动手实现操作系统引导程序(OS bootloader)——借助QEMU/GDB/losetup/dd等工具

    引导程序可以认为是PC加电启动后运行的第一段代码,它是一段长度为512字节的16位运行于实模式的代码.事实上,机器启动后会首先运行0xFFFF0处(也有的资料说是0xFFFFFFF0,BIOS这块我也 ...

最新文章

  1. SpringSecurity入门01(含源码)
  2. ESB与可插拨系统的思考
  3. stm32 hal uart_STM32 非阻塞HAL_UART_Receive_IT解析与实际应用
  4. Java8 - 使用工厂方法 supplyAsync创建 CompletableFuture
  5. 洛谷 - P3980 [NOI2008]志愿者招募(最小费用最大流+思维建边)
  6. Java big file debug - random access
  7. 硬盘结构,主引导记录MBR,硬盘分区表DPT,主分区、扩展分区和逻辑分区,电脑启动过程...
  8. 第二十二篇 玩转数据结构——构建动态数组
  9. yum安装mysql5.6
  10. Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态
  11. tensorrt基础知识+torch版lenet转c++ trt
  12. BLOB:大数据,大对象,在数据库中用来存储超长文本的数据,例如图片等
  13. JAVA集合系列(6):HashMap
  14. 中国范围的经纬度及部分城市经纬度
  15. 2000级2班同学聚会邀请函
  16. 忘记vmware虚拟机系统登入密码如何破解,破解vmware登录密码。
  17. MATLAB机器人工具箱使用
  18. 苹果鼠标右键怎么按_IOS13.4更新后的鼠标用途在哪?
  19. ubuntu和kubuntu换源
  20. Network Switching Software Platform Guide学习笔记

热门文章

  1. 【Linux 内核】调度器 ② ( sched_class 调度类结构体源码 | 源码路径 linux-5.6.18\kernel\sched\sched.h )
  2. 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )
  3. 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )
  4. [转]docker 部署 mysql + phpmyadmin 3种方法
  5. 新版谷歌浏览器设置flash插件不提示步骤
  6. 题解 P4753 【River Jumping】
  7. hihocoder 1061.Beautiful String
  8. C#学习笔记(C#与C++的差异)001
  9. day18 正则表达式
  10. 微软宣布Azure Function支持Python