引导系统系列一

 

;++++++++++++++++++++++++++++++++++++++++++++++++++
;  操作系统引导程序  by: yunlong4310 2012-01-11
;                    tool:nasm
;++++++++++++++++++++++++++++++++++++++++++++++++++

org 07c00h     ;bios把引导扇区加载到0:7c00处并开始执行
                         ;※(我们知道编译器本身在汇编时对指令的地址计算的是相对地址.而对于引导扇区,一切只是从无生有的
                         ;阶段,是按绝对地址执行.那么对于用相对地址编译的执行码就要换算成绝对地址.
                         ;一般而言,"真实开始执行的引导扇区"都会固定装载到07c00处,注意这句话是说一个真正的引导扇区.
                         ;对于硬盘而言,会有一个主引导扇区,然后由它来控制和引导其它扇区,
                         ;比如grub(GNU GRUB 是GRUB是GRand Unified Bootloader的缩写,它是一个多重操作系统启动管理器。用来引导不同系统)控制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处开始编译第一条指令,那么下面的
                         ;相对地址被编译加载后就正好和绝对地址吻合.)
     

BaseOfStack  equ  07c00h    ;这时cs:ip的地址为0:07c00(07c00 作为堆栈底,从这里向低地址方向分配)
                                                    ;0:7c00下面有一部分地址是空闲的可以用来做堆栈空间
                                                    ;              ┣━━━━━━━━━━━━━━━━━━┫
                                                    ;              ┃■■■■■■■■■■■■■■■■■■┃
                                                    ;        7C00h ┃■■■■■■BOOT  SECTOR■■■■■■┃
                                                    ;              ┣━━━━━━━━━━━━━━━━━━┫
                                                    ;              ┃                                    ┃
                                                    ;         500h ┃              F  R  E  E            ┃
                                                    ;              ┣━━━━━━━━━━━━━━━━━━┫   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值