zoukankan      html  css  js  c++  java
  • 为什么是07c00h?

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

    一般而言,"真实开始执行的引导扇区"都会固定装载到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处开始编译第一条指令,那么下面的
    相对地址被编译加载后就正好和绝对地址吻合.

  • 相关阅读:
    自制404页面
    Http错误代码含义
    数据访问基础类(基于Access数据库)
    NTILE函数在SQL Server 2000中的实现方法
    矩阵螺旋输出
    分区排名方案和排名值效率分析【图文+测试代码】
    安装eclipse axis2 插件(links 方式)
    perforce关闭服务后无法重启
    A4纸网页打印中对应像素的设定和换算
    2005数据库脚本在SQL2000上执行
  • 原文地址:https://www.cnblogs.com/hare/p/2832206.html
Copyright © 2011-2022 走看看