2 彙編語言學習與Makefile入門
2020.10.15
第二天的任務也比較輕松,主要是學習彙編語言知識,和學會使用Makefile批處理檔案。
1. 文本編輯器
Notepad++
2. 繼續開發
文檔:helloos3
; hello-os
; TAB=4
ORG 0x7c00 ; 指明程式的裝載位址
; 以下的記述用于标準FAT12格式的軟碟
JMP entry
DB 0x90
---(中略)---
; 程式核心
entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ; 給SI加1
CMP AL,0
JE fin
MOV AH,0x0e ; 顯示一個文字
MOV BX,15 ; 指定字元顔色
INT 0x10 ; 調用顯示卡BIOS
JMP putloop
fin:
HLT ; 讓CPU停止,等待指令
JMP fin ; 無限循環
msg:
DB 0x0a, 0x0a ; 換行2次
DB "hello, world"
DB 0x0a ; 換行
DB 0
這裡的主要是鞏固彙編語言的知識,因為我已經學過了王爽的彙編語言,是以這裡過的很快。
ORG(Origin):告訴NASK,開始執行的時候,把這些機器語言指令裝載到記憶體中的哪個位置
啟動區内容的裝載位址:0x07c00-0x07dff
0x7c00的故事:
從計算機制造者IBM說起,0x7c00的前身是0x200,當時作業系統是在1980年出現的SCP的“86-DOS”,這個系統是從0x400開始放置的,而中斷向量表中0x000-0x3ff中的後半部分0x200-0x3ff的保留白間并沒有被用到,是以剛好利用了這512B的縫隙。
那後來0x7c00又是怎麼來的呢?它的第一次出現是在1981年的IBM PC機5150上,當時為了盡量讓最多的連續記憶體空間配置設定給作業系統,選擇把MBR(Master Boot Record主引導記錄——計算機開機以後通路硬碟所必要要讀取的第一個扇區)放在記憶體的最高端,另外還需要512B的堆棧/資料空間,是以從記憶體的最高處往下推,MBR的存放位置就由此而來了。
0x7c00=0x7dff(5150機器總記憶體空間32KB)-512B(堆棧/資料空間)-512B(MBR空間)
為什麼要把MBR放在高端呢?計算機啟動起來以後,堆棧/資料空間,MBR區就不再需要了,這部分記憶體可以被作業系統再次回收利用。如果把這部分記憶體放在低端就很難再被利用起來,因為程式一般都是往高位址空間方向發展的。
參考資料:Why BIOS loads MBR into 0x7C00 in x86 ?
BIOS(Basic Input Output System):電腦廠家預先寫入作業系統開發人員經常會用到的一些程式,如今的BIOS功能非常多,可以看作為作業系統開發人員準備的各種函數的集合。而INT就是調用這些函數的指令。
HLT:讓CPU停止,等待指令。即使不加HLT指令,程式也能在JMP fin無限循環,但加入HLT能讓CPU進入待機狀态,可以省電ORZ(節能環保,從我做起)。
3. 制作啟動區
文檔:helloos4
IPL(Initial Program Loader):啟動程式加載器,加載作業系統的程式
隻有512位元組
4. Makefile入門
Makefile就是一個批處理檔案,需要調用make.exe來讓Makefile發揮作用
- 指令源檔案不存在時,會找源檔案的生成方法
- 目标檔案存在時會判斷檔案的更新日期
- 目标檔案存在且無需更新,則不執行指令;需要更新時,則執行指令
# 預設動作(使用make指令時,預設使用img指令)
default :
../z_tools/make.exe img
# 檔案生成規則
ipl.bin : ipl.nas Makefile
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
helloos.img : ipl.bin Makefile
../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \
wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
# 指令
asm :
../z_tools/make.exe -r ipl.bin
img :
../z_tools/make.exe -r helloos.img
run :
../z_tools/make.exe img
copy helloos.img ..\z_tools\qemu\fdimage0.bin
../z_tools/make.exe -C ../z_tools/qemu
install :
../z_tools/make.exe img
../z_tools/imgtol.com w a: helloos.img
#清理中間生成檔案
clean :
-del ipl.bin
-del ipl.lst
#清理除源檔案以外的檔案
src_only :
../z_tools/make.exe clean
-del helloos.img