您的位置:首页 > 其它

org 07c00h的原因

2016-01-07 11:14 225 查看
 Boot Sector(引导扇区),一个正确的Boot Sector除了以0xAA55结束之外,还应该包含一段少于512B的执行码

源码分析

    org 07c00h                ;告诉编译器程序加载到7c00处

    mov ax,cs

    mov ds,ax

    mov es,ax

    call DispStr            ;调用显示字符串例程

    jmp $                    ;无限循环

DispStr:

    mov ax, BootMessage

    mov bp, ax                ;es:bp = 串地址

    mov cx, 16                ;cx = 串长度

    mov ax, 01301h            ;ah=13,al=01h

    mov bx, 000ch            ;页号为0(bh=0) 黑底红字(bl=0ch,高亮)

    mov dl, 0

    int 10h                    ;10h号中断

    ret

BootMessage: db "hello ,OS world!"

    times 510-($-$$) db 0    ;填充剩下的空间,使生成的二进制代码恰好为

                            ;512字节

    dw 0xaa55                ;结束标记

   

nasm boot.asm -o boot.bin

硬件自检相关工作完成后,就会启动操作系统:以Windows XP为例,系统BIOS将启动盘的第一扇区(Boot Sector,引导扇区)读入到内存的0x7C00H处,并检查0x7DFE地址的内容是否等于0xAA55,如果匹配,跳转到0x7C00处执行MBR(Master Boot Record,主引导记录),MBR接着从分区表(Partition Table)中找到第一个活动分区(Active Partition ,一般是C盘分区),然后按照类似方式读取并执行这个活动分区的引导扇区(Partition Boot
Sector),而引导扇区将负责读取并执行NTLDR(NT LoaDeR,windows nt的加载程序),然后主动权就移交给了windows.(来源<使用开源软件-自己动手写操作系统> 杨文博)

从Xp启动操作系统的过程中可以看出为什么要用org 0x7c00h;

反编译

ndisasm -o 0x7c00 boot.bin >> disboot.asm

00007C00  8CC8              mov ax,cs

00007C02  8ED8              mov ds,ax

00007C04  8EC0              mov es,ax

00007C06  E80200            call 0x7c0b

00007C09  EBFE              jmp short 0x7c09

00007C0B  B81E7C    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: