官术网_书友最值得收藏!

4 加工潤色

剛才我們把程序變成了短短的22行,這成果令人欣喜。不過還有一點不足就是很難看出這些程序是干什么的,所以我們下面就來稍微改寫一下,讓別人也能看懂。改寫后的源文件增加到了48行,它位于附帶光盤的projects\01_day\helloos2目錄下,大家可以直接把helloos2文件夾復制到tolset里。現在helloos1也可以刪掉了(每個文件夾都是獨立的,用完之后就可以刪除,以后不再贅述。當然放在那里留作紀念也是可以的)。

現在的程序有50行,也占不了多少地方,所以我們將它寫在下面了。

有模有樣的源代碼

; hello-os
; TAB=4

; 以下這段是標準FAT12格式軟盤專用的代碼

        DB    0xeb, 0x4e, 0x90
        DB    "HELLOIPL"      ; 啟動區的名稱可以是任意的字符串(8字節)
        DW    512              ; 每個扇區(sector)的大小(必須為512字節)
        DB    1                ; 簇(cluster)的大小(必須為1個扇區)
        DW    1          ; FAT的起始位置(一般從第一個扇區開始)
        DB    2          ; FAT的個數(必須為2)
        DW    224       ; 根目錄的大小(一般設成224項)
        DW    2880      ; 該磁盤的大小(必須是2880扇區)
        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字節)
        DB    "FAT12   "      ; 磁盤格式名稱(8字節)
        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

■■■■■

這里有幾點新內容,我們逐一來看一下。首先是“; ”命令,這是個注釋命令,相當于C語言或是C++中的“//”。正是因為有它,我們才可以在源代碼里加入很多注釋。

其次是DB指令的新用法。我們居然可以直接用它寫字符串。在寫字符串的時候,匯編語言會自動地查找字符串中每一個字符所對應的編碼,然后把它們一個字節一個字節地排列起來。這個功能非常方便,也就是說,當我們想要變更輸出信息的時候,就再也不用自己去查字符編碼表了。

再有就是DW指令和DD指令,它們分別是“define word”和“define double-word”的縮寫,是DB指令的“堂兄弟”。word的本意是“單詞”,但在計算機匯編語言的世界里,word指的是“16位”的意思,也就是2個字節。“double-word”是“32位”的意思,也就是4個字節。

對了,差點忘記說RESB 0x1fe-$了。這個美元符號的意思如果不講,恐怕誰也搞不明白,它是一個變量,可以告訴我們這一行現在的字節數(如果嚴格來說,有時候它還會有別的意思,關于這一點我們明天再講)。在這個程序里,我們已經在前面輸出了132字節,所以這里的$就是132。因此nask先用0x1fe減去132,得出378這一結果,然后連續輸出378個字節的0x00。

那這里我們為什么不直接寫378,而非要用$呢?這是因為如果將顯示信息從“hello, world”變成“this is a pen.”的話,中間要輸出0x00的字節數也會隨之變化。換句話說,我們必須保證軟盤的第510字節(即第0x1fe字節)開始的地方是55 AA。如果在程序里使用美元符號($)的話,匯編語言會自動計算需要輸出多少個00,我們也就可以很輕松地改寫輸出信息了。

■■■■■

既然可以毫不費力地改寫顯示的信息,就一定要好好發揮這一功能,讓我們的操作系統顯示出自己喜歡的一句話,讓它成為一個只屬于我們自己的、世界上獨一無二的操作系統。不過遺憾的是現在它還不能顯示漢字。當然大家也可以嘗試一下,但由于這個程序還沒有顯示漢字的功能,所以顯示出來的都是亂碼,因此大家先將就一下,用英語或拼音吧。

■■■■■

最后再給大家解釋一下程序中出現的幾個專門術語。時間不早了,我們今天就到這吧。其他的留待明天再說。

TAB=4….......有的文本編輯器可以調整TAB鍵的寬度。請使用這種編輯器的人將TAB鍵的寬度設定成4,這樣源程序更容易讀。可能有人說,我這里只能用記事本(notepad), TAB鍵寬度固定為8,想調都沒法調。沒關系,明天筆者來推薦一個好用的文本編輯器。

FAT12格式...(FAT12 Format)用Windows或MS-DOS格式化出來的軟盤就是這種格式。我們的helloos也采用了這種格式,其中容納了我們開發的操作系統。這個格式兼容性好,在Windows上也能用,而且剩余的磁盤空間還可以用來保存自己喜歡的文件。

啟動區..........(boot sector)軟盤第一個的扇區稱為啟動區。那么什么是扇區呢?計算機讀寫軟盤的時候,并不是一個字節一個字節地讀寫的,而是以512字節為一個單位進行讀寫。因此,軟盤的512字節就稱為一個扇區。一張軟盤的空間共有1440KB,也就是1474560字節,除以512得2880,這也就是說一張軟盤共有2880個扇區。那為什么第一個扇區稱為啟動區呢?那是因為計算機首先從最初一個扇區開始讀軟盤,然后去檢查這個扇區最后2個字節的內容。如果這最后2個字節不是0x55 AA,計算機會認為這張盤上沒有所需的啟動程序,就會報一個不能啟動的錯誤。(也許有人會問為什么一定是0x55 AA呢?那是當初的設計者隨便定的,筆者也沒法解釋)。如果計算機確認了第一個扇區的最后兩個字節正好是0x55 AA,那它就認為這個扇區的開頭是啟動程序,并開始執行這個程序。

IPL.........…....initial program loader的縮寫。啟動程序加載器。啟動區只有區區512字節,實際的操作系統不像hello-os這么小,根本裝不進去。所以幾乎所有的操作系統,都是把加載操作系統本身的程序放在啟動區里的。有鑒于此,有時也將啟動區稱為IPL。但hello-os沒有加載程序的功能,所以HELLOIPL這個名字不太順理成章。如果有人正義感特別強,覺得“這是撒謊造假,萬萬不能容忍!”,那也可以改成其他的名字。但是必須起一個8字節的名字,如果名字長度不到8字節的話,需要在最后補上空格。

啟動..........….(boot)boot這個詞本是長靴(boots)的單數形式。它與計算機的啟動有什么關系呢?一般應該將啟動稱為start的。實際上,boot這個詞是bootstrap的縮寫,原指靴子上附帶的便于拿取的靴帶。但自從有了《吹牛大王歷險記》(德國)這個故事以后,bootstrap這個詞就有了“自力更生完成任務”這種意思(大家如果對詳情感興趣,可以在Google上查找,也可以在幫助和支持網頁http://hrb.osask.jp上提問)。而且,磁盤上明明裝有操作系統,還要說讀入操作系統的程序(即IPL)也放在磁盤里,這就像打開寶物箱的鑰匙就在寶物箱里一樣,是一種矛盾的說法。這種矛盾的操作系統自動啟動機制,被稱為bootstrap方式。boot這個說法就來源于此。如果是筆者來命名的話,肯定不會用bootstrap這么奇怪的名字,筆者大概會叫它“多級火箭式”吧。

主站蜘蛛池模板: 江源县| 北安市| 腾冲县| 石嘴山市| 若羌县| 合川市| 平阳县| 苗栗市| 江安县| 镇原县| 安图县| 南丹县| 石河子市| 明溪县| 平远县| 黔东| 常熟市| 花莲县| 廊坊市| 明光市| 西平县| 丹巴县| 濉溪县| 茶陵县| 苍梧县| 嘉禾县| 绵竹市| 黄平县| 新源县| 铜川市| 巧家县| 连州市| 化州市| 邓州市| 乐至县| 巨野县| 庐江县| 泰顺县| 民县| 泾川县| 太保市|