x86开机处于实模式, CS=0xFFFF, IP=0x0000, 实模式CS<<4+IP, 寻址0xFFFF0(ROM BIOS), 检查RAM, 键盘, 显示器, 磁盘, 主板, 磁盘0磁道0扇区读入0x7c00, 512bytes, 这个是操作系统的第一段代码, 设置CS=0x07c0, IP=0x0000, 接着进入下面的代码,也就是bootsect。
START(0x7c00):
mov ax, 0x07c0 mov ds, ax ; ds = 0x07c0
mov ax, 0x9000 mov es, ax ; es = 0x9000
; src_address = ds:si = 0x07c00
; dest_address = es:di = 0x90000
sub si, si sub di, di ; si = di = 0
; 将主引导扇区从0x07c00拷贝到0x90000
; 256 * word = 512 byte
mov cx, 0x0100 rep movw ; 0100H = 256D
; CS:IP = 0x9000:BOOTLOADER
jmpi BOOTSECT, 0x9000
BOOTSECT:
; cl = 2 从第二个扇区开始读,第一个扇区是bootsect
; al = 4 读取扇区的个数,setup占四个扇区
; bx = 512D 将bootsect读到0x90200,bootsect占512字节
... ; 省略了一些操作,如设置寄存器等
mov dx, 0x0000 ; dh磁头号 dl驱动器号
mov cx, 0x0002 ; ch柱面号 cl开始扇区
mov bx, 0x0200 ; es:bx待写入内存地址
mov ax, 0x0204 ; ah = 02读驱动器扇区 al扇区数量
int 0x13 ; BIOS读磁盘中断
; 在屏幕上显示字符串
... ; 省略了显示字符中断对寄存器的设置
mov bp, msg
int 0x10 ; BIOS显示字符中断
; 继续使用0x13中断读入system,启动盘的第6个扇区
...
call read_system
jmpi 0x0200, 0x9000 ; bootmain
msg:
.byte 13, 10
.ascii "loading system..."
.byte 13, 10
该段代码执行完毕后,控制权就交给setup了。