1.介紹文本編輯器
本小節內容只是編者介紹了一個免費的文本編輯器,因為是日語的緣故,譯者向我們推薦了一個可編輯中文的文本編輯器: Notepad++,筆者也正用這個編輯器,放上下載鏈接:
>>>> Download Notepad++ >>>>
↑Notepad++使用界面
2.繼續開發
節選了projects/02_day中的helloos3中的部分內容,原文檔中注釋用的是日文,所以這里截取了書中的代碼片段:
因為是從零開始做一個操作系統,作者對代碼中的匯編格式進行了非常詳細的介紹。
ORG指令
ORG指令來源於英文"origin",意思是“源頭、起點”,它會告訴nask(應該是一個匯編語言編譯器)程序要從這個地址開始,也就是要把程序裝載到內存的指定地址,這里指定的地址是 0x7c00。(后續再討論原因)
如果有匯編語言的基礎(寫過匯編程序),那么對於這條指令應該是非常熟悉,該指令類似於筆者學習時用的masm編譯器中的 start 指令。
↑使用masm編譯器風格的匯編代碼
jmp指令
在CPU中由CS(Code Segment, 代碼段寄存器) + IP(Instruction Pointer,指令指針寄存器)來指示它執行的位置。目前只需要知道它是用於改變程序執行位置的即可。
entry標號
標號在書寫匯編代碼時經常用到,因為程序時常需要完成跳轉進行:循環、執行函數都是以轉移為基礎的,轉移也就是改變CS:IP的值,標號可以指明CS:IP需要變更的值,當然了CPU是不認識標號的,只能通過編譯程序將標號程序的首地址計算出來。
mov指令
這個指令應該是匯編中最常用的一個了,類似於高級語言中的賦值號,比如:
mov ax, 0 相當於 ax = 0
mov ss, ax 相當於 ss = ax(注意:ax並沒有改變,還是原有的數據)
基本寄存器介紹
這里的內容較為基礎,介紹了CPU中的各種寄存器。
上述都是16位寄存器,后來的32位寄存器只是在原有寄存器名稱前加了字母 ‘E’, 意為 Extend(擴展)
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
還有一些段寄存器:
HLT指令
HLT指令源自於英文"Halt", 意思是停止。
HLT是讓CPU停止動作的指令,不過並不是徹底地停止(如果要徹底停止CPU的動作,只能切斷電源),而是讓CPU進入待機狀態。只要外部發生變化,比如按下鍵盤,或是移動鼠標,CPU就會醒過來,繼續執行程序。
如上圖所示,這里的HLT即使去掉了也不影響(循環還是會無限進行下去),但是CPU會全力以赴地去執行這個循環,非常費電,所以使用HLT讓CPU初一睡眠狀態是一個不錯的選擇。
C語言改寫后的helloos.nas程序節選
程序的功能是將0:msg的內容循環寫入到顯卡中(在讀到0時停止),當讀到0時,程序跳轉到fin(final)進入無限循環。“hello world”就是這樣顯示出來的。
對於ORG從0x7c00的疑惑
為什么必須從0x7c00處開始執行程序呢:
操作系統中的很多內存位置是不能隨便使用的,里面可能有各種數據、核心程序段,因此很早之前IBM的大佬們規定了
0x00007c00 - 0x00007dff 這塊區域位啟動區內容的裝載地址,至於為什么要選這個,感興趣的同學可以查閱當年IBM開發操作系統的歷史~
↑截取自原書P73
3.先制作啟動區
順序輸入: asm -> makeimg -> run
4.Makefile入門
這部分是對Makefile文檔的介紹:Makefile的功能、格式、使用。由於筆者在學習Linux時有接觸,在這里放上幾篇筆者認為非常不錯的博客供大家學習:
跟我一起寫 Makefile(一)
跟我一起寫 Makefile(二)
感受
今天學的東西都比較基礎(筆者在假期自學了匯編語言),主要是對匯編語言的各種寄存器、指令、訪問內存的方式進行了介紹,正因如此沒有太多自己的想法,都是用的書上的解析,當然了這里還有中斷作者沒有深入講解。再就是引入了Makefile,對於大工程來說,這是必不可少的。
再接再厲~
over~~ 明天見