程序在上電之後,內存中什麼都沒有,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;將程序加載到0x7c00處
mov ax, cs;使ds和es指向與cs相同的段
mov ds, ax;
mov es, ax;
call DispStr;調用DispStr
jmp $;死循環
DispStr:
mov ax, BootMessage;將會把字符串的首地址傳給bp
mov bp, ax; es:bp 串地址
mov cx, 16; 串長度
mov ax, 01301h; ah = 13 al = 01
mov bx, 000ch; 頁號爲0 bh=0 黑底紅字bl=0ch
mov dl, 0;
int 10h; 10h號中斷
ret; 返回
BootMessage: db "Hello, OS world!";
times 510 - ($-$$) db 0; 填充剩下的空間爲0 $-$$本行距離開始處的相對距離
dw 0xaa55; 加上 結束標誌 剛好512字節
運行腳本
#!/bin/bash
nasm boot.asm -o boot.img
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
bochs -f bochsrc