今天先搞清楚電腦的啓動過程:shell
一、電腦通電啓動後,CPU 立刻就從絕對內存地址 FFFF:0000H 處開始執行指令。放在這裏的只是一條跳轉指令,跳到固化在主板 ROM(Read Only Memory,只讀存儲器)中的系統 BIOS(Basic Input/Output System,基本輸入輸出系統)中的啓動代碼處。小程序
二、系統 BIOS 的啓動代碼首先進行硬件檢查,並加載相關硬件設備。ide
三、檢查完成後,系統 BIOS 的啓動代碼按照 CMOS(Complementary Metal Oxide Semiconductor,互補金屬氧化物半導體,就是保存計算機硬件配置和參數設定的可讀寫芯片) 中對啓動設備的設置順序,檢測可用的啓動設備。檢測到可用的啓動設備後,比較其第一個扇區的最後 2 位(結束標誌位)是否等於 0xAA55,若等於 BIOS 就把該設備的第一個扇區讀入絕對內存地址 0000:7C00H 處,而後將控制權交給該處。spa
四、操做系統就從內存 0x7C00 處開始接管電腦。操作系統
照貓畫虎,對着書抄代碼:
code
org 07C00h ; org 指令告訴編譯器本程序將要被加載到內存的起始地址,編譯器會把本程序 ; 中全部用到的段內偏移地址自動加上 org 後跟隨的數值。 ; org 指令指示地址偏移調整是編譯期概念,隻影響內存尋址指令的編譯,編譯 ; 產生的程序已經加上偏移量。 ; 初始化寄存器 mov ax, cs mov ds, ax mov es, ax ; 顯示一個字符串 mov ax, 1301h ; ah = 功能號(13h,在Teletype模式下顯示字符串), ; al = 顯示方式(01h,顯示屬性在BL中,光標跟隨移動) mov bx, 000Ch ; bh = 頁號(0h), bl =(AL = 0、1時)顯示屬性(0Ch,黑底紅字) mov bp, BootMessage ; es:bp = 字符串地址,變量和標籤無區別,無[]爲地址,有[]爲值 mov cx, 25 ; cx = 字符串長度 mov dx, 0 ; DH、DL = 屏幕行、列 int 10h jmp $ BootMessage db 'Hello, First OS World!', 0 ; 空白部分填 0 times 510 - ($ - $$) db 0 ; $ = 編譯後本行的地址,$$ = 編譯後本節的起始地址 ; times = 重複 ; Boot Sector 最後2個字節爲 0xAA55,表示這是啓動程序 dw 0xAA55
編譯,用昨天寫的小程序覆寫,虛擬機加載啓動。。。。。。成功!內存