天天看點

自制作業系統2-彙編語言學習與Makefile入門2 彙編語言學習與Makefile入門

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
           

繼續閱讀