`
yesjavame
  • 浏览: 697158 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

为什么要org 07c00h?

阅读更多

为什么要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处开始编译第一条指令,那么下面的
相对地址被编译加载后就正好和绝对地址吻合.

分享到:
评论

相关推荐

    问题清单1

    2. 为什么要把boot.bin放到第一个扇区?直接复制为什么不行?BIOS程序检查软盘0面0磁道1扇区,如果扇区以0xaa55结束,则认定为引导扇区,将其512字节的数据加载到内存的07c00处,然后设置PC,跳到内存07c00处开始...

    ffmpeg-20160901-be07c25-win32-static

    这个名为 "ffmpeg-20160901-be07c25-win32-static" 的压缩包是 FFmpeg 的一个特定版本,日期为2016年9月1日,Git提交哈希为be07c25,且是针对32位Windows系统的静态编译版本。这意味着它包含了所有必要的依赖项,...

    引导扇区分析

    最后,`mov sp, 7C00`指令将堆栈指针`sp`设置为`7C00h`,这使得堆栈的顶部位于内存的高地址端。 **允许中断** ``` 07C0:0008FB sti ;允许中断 ``` 中断再次被启用(`sti`),这表示系统已经完成了基本的初始化工作...

    开发一个最简单的操作系统

    org 07c00h ; 告诉编译器将此段程序加载到内存0x0000:07C00处 mov ax, cs mov ds, ax mov es, ax call PrintStr ; 调用屏幕打印函数 jmp $ ; 无限循环 PrintStr: ; 屏幕打印函数 mov ax, HelloWorld ; 将...

    很详细的保护模式编程

    org 07c00h ; 实际运行时从07C00H开始 %endif mov ax, cs ; 将CS寄存器的值赋给AX mov ds, ax ; 将AX的值赋给DS mov es, ax ; 将AX的值赋给ES call HelloWorld ; 调用HelloWorld子程序 jmp $ ; 无限循环 _Hello...

    DirectShow过滤器-ALAW解压缩过滤器

    本过滤器将ALAW音频流解压缩为PCM音频流。 参见介绍文章:https://blog.csdn.net/h3974/article/details/141267964?...

    第一次问答题参考答案1

    `org 0700h`表示程序在内存中的装载位置是0x07C00,这是BIOS加载引导扇区的标准位置。 2. 引导扇区的位置:BIOS在启动时会查找软盘上的第一个扇区(0面0磁道1扇区),如果该扇区以0xAA55作为结束标志,就会加载该...

    一个操作系统的实现借鉴.pdf

    - `org 07c00h`指令告诉编译器程序应加载到内存的哪个位置,这是软盘引导扇区的标准加载地址。 - `DispStr`子程序用于在屏幕上显示字符串。它使用了BIOS中断10h,这是早期IBM PC兼容机上的图形和文本输出接口。 -...

    第一次试验问题1

    `org 0700h`指示汇编器从07c00h的绝对地址开始编译。BIOS加载引导扇区(第一个扇区)到内存的07c00h位置,因此程序必须放在该位置,以符合BIOS的加载机制。`boot.bin`必须位于扇区以满足这个要求,直接复制无法满足...

    BIOS内存分布详图

    在地址`07C00H`处,有一个31KB的区域被预留用于存储引导扇区(Boot Sector)的入口。当计算机启动时,BIOS会读取磁盘上的引导扇区并将其加载到此区域,然后执行引导扇区中的代码。这通常是指定的操作系统引导加载...

    usb-C8T6.rar

    压缩包内的“usb-C8T6”文件可能包含了以下内容:源代码文件(如.c和.h),可能有STM32的HAL库函数、USB设备驱动代码、SPI Flash驱动代码、FATFS配置和API调用、以及相关的配置文件(如Makefile或IDE工程文件)。...

    操作系统实现—boot启动并读软盘

    参照《linux完全剖析》一文中的程序自己写了 ... org 07c00h jmp start msg: db Now,begin to load kernel….,0ah msgLen equ $-msg start: mov ax,cs mov ds,ax

    最小的操作系统(堪称经典)

    - **组织结构**:通过`org 07c00h`指令告知编译器将程序加载至内存地址0x7c00处。 - **初始化设置**:利用`mov ax, cs`等指令进行数据段寄存器的初始化,并调用显示字符串例程。 - **无限循环**:通过`jmp $`指令...

    一个操作系统的实现Playing.with.OS

    - `org 07c00h`: 定义代码起始位置。 - `mov ax, cs`: 将当前代码段的段选择符加载到AX寄存器。 - `mov ds, ax`: 将AX寄存器的值复制到DS寄存器,用于数据段。 - `mov es, ax`: 将AX寄存器的值复制到ES寄存器,...

    nasm实现的用vmware运行自做的linux启动盘的引导代码

    org 07c00h ; 告诉编译器加载到07c00h处 mov ax, cs mov ds, ax mov es, ax call DispStr ; 调用显示字符串函数 jmp $ ; 无限循环 DispStr: mov ax, BootMessge mov bp, ax mov cx, 16 mov ax, 01301h mov bx, 000ch...

    永宏 PLC FATEK 通讯协议.pdf

    站号为1~FEH,其中00H表示对所有PLC的广播命令。 6. 通讯命令与响应: 通讯协议中,主系统发出的命令包括对PLC的控制和数据操作请求。永宏PLC收到命令后,将根据命令要求执行相应的操作,并将执行结果或状态以响应...

    Lab. 1 First Bootloader - 副本1

    现在,让我们尝试编写一个简单的引导加载程序,看看BIOS如何自动调用引导加载程序,并将其放置在特定的物理内存位置(07C00H)。为此,建议阅读"os-dev.pdf"这本书,直到“3.4.3 定义字符串”部分。 **练习1:(6分...

    16337341-朱志儒-实验一-1.01

    示例代码中,`mov ax,07C0H`是将数据段地址加载到DS寄存器,`mov cx, word[namelen]`和后续指令则是显示名字的过程。 实验过程中,学生需要使用Notepad++编写汇编代码,通过NASM汇编器生成二进制文件,再用WinHex将...

Global site tag (gtag.js) - Google Analytics