程序在上电之后,内存中什么都没有,Intel将所有CPU的硬件都设计为加电即进入16位实模式状态运行,同时将CPU的硬件逻辑设计为加电瞬间强行将CS的值置为0xf000,IP的值置为0xfff0,
这样CS:IP就指向0xFFFF0这个地址,这个地址就是BIOS的入口地址
程序自动从这里开始执行,内存在刚上电时,里面是没有东西的,程序怎么能运行呢?这个地址究竟指向什么呢?
指向Rom
BIOS程序是被固化在计算机主板上的一块很小的ROM芯片里,是计算机出产的时候被设置好的,它主要的功能就是自检,随着程序运行,屏幕上会显示显卡的信息,内存的信息,还有一项很重要的操作:
BIOS在内存中建立中断向量表和中断服务程序,利用中断服务程序,可以把系统内核的程序从软盘加载到内存
在中断表和中断服务程序建立好之后,硬件体系和BIOS联合操作,使CPU接收到一个0x19中断,这个
中断服务程序的主要功能就是把软盘第一个扇区中的512B加载到内存0x07c00处。
这个第一扇区的真正内容在后面介绍,这里写一个测试程序,打印一串字符,当程序运行到加载第一扇区时,会把这个测试程序加载到内存中,继而会在显示器中显示
Hello, OS world!
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db "Hello, OS world!"
times 510 - ($-$$) db 0
dw 0xaa55
运行脚本
#!/bin/bash
nasm boot.asm -o boot.img
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
bochs -f bochsrc