1. 程式人生 > >《30天自制作業系統》 第一天 從計算機結構到彙編程式入門

《30天自制作業系統》 第一天 從計算機結構到彙編程式入門

效果圖

這裡寫圖片描述

相關概念

CPU

中央處理單元,除了與別的電訊號交換以外什麼都不會,對於電訊號只能理解開與關兩種狀態。
CPU就是個整合電路板,它只是忠實地執行電訊號給它的指令,輸出相應的電訊號。

指定位置顯示0還是1等。
CPU最早只是發明用於處理電訊號,後續發現開/關與0/1,可以結合到一起,變成二進位制數計算機。

給每一個文字都編上號(位元組碼),就可以建立一個文字與數字的對應關係,把文字轉成電訊號。
二進位制與十六進位制
因為書寫二進位制過長,所以通過十六進位制進行簡寫。
二進位制轉十六進位制,從後往前,每四位替換成一個十六進位制數字
數字前加ox代表數字為十六進位制

開發環境搭建

  1. 下載安裝VirtualBox 虛擬機器
  2. 下載安裝Windows xp作業系統
  3. 編寫程式碼,編譯使用qemu虛擬機器執行

原始碼

; hello-os
; TAB=4


; 以下這段是標準FAT12格式軟盤專用的程式碼
    DB 0xeb, 0x4e, 0x90
    DB "HELLOIPL"       ; 啟動區的名稱可以是任意的字串(8位元組)
    DW 512              ; 每個扇區(sector)的大小(必須為512位元組)
    DB 1                ; 簇(cluster)的大小(必須為一個扇區)           
    DW 1
; FAT的起始位置(一般從第一個扇區開始) DB 2 ; FAT的個數(必須為2) DW 224 ; 根目錄的大小(一般設定成224項) DW 2880 ; 該磁碟的大小(必須是2880扇區 1440*1024/512) DB 0xf0 ; 磁碟的種類(必須是0xf0) DW 9 ; FAT的長度(必須是9扇區) DW 18 ; 1個磁軌(track)有幾個扇區(必須是18) DW 2
; 磁頭數(必須是2) DD 0 ; 不使用分割槽,必須是0 DD 2880 ; 重寫一次磁碟大小 DB 0, 0, 0x29 ; 意義不明,固定 DD 0xffffffff ; 卷標號碼 DB "HELLO-OS " ; 磁碟的名字(11個位元組) 注意總共11個位元組包括3個空格 DB "FAT12 " ; 磁碟格式名稱(8位元組) 5個字母3個空格 RESB 18 ; 先空出18位元組 ; 程式主體 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd ; 資訊顯示部分 DB 0x0a, 0x0a ; 2個換行 DB "hello, world" DB 0x0a ; 換行 DB 0 RESB 0x1fe-$ ; 填寫0x00,直到0x001fe DB 0x55, 0xaa ; 以下是啟動區以外部分到輸出 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432

編譯組合語言:

echo 生成img檔案
..\tolset\z_tools\nask.exe helloos.nas helloos.img

echo 虛擬機器qemu載入img檔案
copy helloos.img ..\tolset\z_tools\qemu\fdimage0.bin
..\tolset\z_tools\make.exe  -C ../tolset/z_tools/qemu

pause

彙編程式指令解釋

指令 英文全稱 含義
DB define byte 可以直接寫字串,組合語言會自動查詢字串對應的編碼,然後一個位元組一個位元組排列起來。
RESB reserve byte 從現在的地址開始空出10個位元組,可以寫成RESB 10
DW define word 單詞,16位,2個位元組
DD define double-word 32位,4個位元組

RESB ox1fe-$

啟動區 boot sector

軟盤第一個扇區稱為啟動區。
扇區:計算機讀軟盤的時候,並不是一個位元組一個自己的讀寫,而是以512位元組為一個單位進行讀寫。軟盤第一個512位元組稱為一個扇區。
為什麼第一個扇區稱為啟動區呢?
計算機首先從最初一個扇區開始讀軟盤,然後檢查這個扇區最後2個位元組的內容。
如果是0x55AA,計算機認為這個盤第一個扇區是一個啟動程式,並執行啟動程式。

ox55AA,十進位制21930,二進位制101010110101010,32進位制 lda

IPL:initial program loader 的縮寫
啟動區僅512位元組,根本無法容納實際的作業系統,所以把載入作業系統本身的程式放在啟動區裡。