引导程序为什么要org 07c00h
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相关推荐
- 自己写操作系统学习总结
怎样自己写一个简单的操作系统? https://www.zhihu.com/question/20207347 我写的时候一些经历: 第一次写的时候3000行左右的就无法调试了,当时主要参考了linu ...
- 如何读emmc里的引导程序_自制操作系统学习1 引导程序
本系列学习有前面的汇编学习基础最好,如果没有影响也不大本系列学习主要资源来自<[30天自制操作系统].(川合秀实)>,<自己动手写操作系统>两本书 一.准备工作 bochs v ...
- [reprint]如何编写引导程序 Hello World
在存储介质(硬盘.软盘.光盘)中有一块特殊的区域,叫做引导区.在计算机启动后,BIOS会读取引导区内的代码到内存中去,然后将执行这些代码.引导区的位置和大小与计算机的平台有关,对于IBM-PC兼容机, ...
- 为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢
这是因为 .com 载入内存后的起始偏址就是100h. 前面的100h字节是该程序的PSP 部分. 所以, 为了程序中对地址引用的正确, 必需加上org 100h语句. ----- ...
- 简单计算机java程序_JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单...
JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单 JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单制作 汇编实现引导程序 ; 文件名 boot.asm org 7c ...
- linux引导程序切换
#++++++++++++++++++++++++++++++++++++++++++++++++++ # 课题:linux引导程序切换 # 作者:胡昌文 # 日期:2008-6-30 # 系统平台: ...
- GRUB启动过程分析 GRUB 引导程序配置
计算机在启动的时候,首先由BIOS中的程序执行自检,自检通过后,就根据CMOS的配置找到第一个可启动磁盘的MBR中的Boot Loader程序(一般在启动盘的第一个物理扇区,占416字节),并把控制权 ...
- org 07c00h的原因
Boot Sector(引导扇区),一个正确的BootSector除了以0xAA55结束之外,还应该包含一段少于512B的执行码 源码分析 org07c00h ;告诉编译 ...
- 自己动手实现操作系统引导程序(OS bootloader)——借助QEMU/GDB/losetup/dd等工具
引导程序可以认为是PC加电启动后运行的第一段代码,它是一段长度为512字节的16位运行于实模式的代码.事实上,机器启动后会首先运行0xFFFF0处(也有的资料说是0xFFFFFFF0,BIOS这块我也 ...
最新文章
- SpringSecurity入门01(含源码)
- ESB与可插拨系统的思考
- stm32 hal uart_STM32 非阻塞HAL_UART_Receive_IT解析与实际应用
- Java8 - 使用工厂方法 supplyAsync创建 CompletableFuture
- 洛谷 - P3980 [NOI2008]志愿者招募(最小费用最大流+思维建边)
- Java big file debug - random access
- 硬盘结构,主引导记录MBR,硬盘分区表DPT,主分区、扩展分区和逻辑分区,电脑启动过程...
- 第二十二篇 玩转数据结构——构建动态数组
- yum安装mysql5.6
- Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态
- tensorrt基础知识+torch版lenet转c++ trt
- BLOB:大数据,大对象,在数据库中用来存储超长文本的数据,例如图片等
- JAVA集合系列(6):HashMap
- 中国范围的经纬度及部分城市经纬度
- 2000级2班同学聚会邀请函
- 忘记vmware虚拟机系统登入密码如何破解,破解vmware登录密码。
- MATLAB机器人工具箱使用
- 苹果鼠标右键怎么按_IOS13.4更新后的鼠标用途在哪?
- ubuntu和kubuntu换源
- Network Switching Software Platform Guide学习笔记
热门文章
- 【Linux 内核】调度器 ② ( sched_class 调度类结构体源码 | 源码路径 linux-5.6.18\kernel\sched\sched.h )
- 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )
- 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )
- [转]docker 部署 mysql + phpmyadmin 3种方法
- 新版谷歌浏览器设置flash插件不提示步骤
- 题解 P4753 【River Jumping】
- hihocoder 1061.Beautiful String
- C#学习笔记(C#与C++的差异)001
- day18 正则表达式
- 微软宣布Azure Function支持Python