自製作業系統2 組合語言學習與Makefile入門

2021-10-24 22:09:24 字數 2806 閱讀 2340

2020.10.15

第二天的任務也比較輕鬆,主要是學習組合語言知識,和學會使用makefile批處理檔案。

notepad++

文件: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,開始執行的時候,把這些機器語言指令裝載到記憶體中的哪個位置

0x7c00的故事:

​ 從計算機製造者ibm說起,0x7c00的前身是0x200,當時作業系統是在2023年出現的scp的「86-dos」,這個系統是從0x400開始放置的,而中斷向量表中0x000-0x3ff中的後半部分0x200-0x3ff的保留空間並沒有被用到,所以剛好利用了這512b的縫隙。

那後來0x7c00又是怎麼來的呢?它的第一次出現是在2023年的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(節能環保,從我做起)。

文件:helloos4

ipl(initial program loader):啟動程式載入器,載入作業系統的程式

​ 只有512位元組

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

作業系統之組合語言 2

現在,讓我們看看程式呼叫過程中彙編操作,乙個過程呼叫包括將資料 以過程引數和返回值的形式 和控制從 的一部分傳遞到令一部分。另外,它還必須在進入是為過程的區域性變數分配空間,並在退出時釋放這些空間。棧幀結構 ia32程式用程式棧來支援過程呼叫。機器用棧來傳遞過程引數,儲存返回資訊,儲存暫存器用於以後...

組合語言學習與記錄(2)

答 首先先看之前記錄的 乙個cpu有n根位址匯流排,我們就可以說這個cpu的位址匯流排寬度為n,那麼這個cpu就可以尋找2的n次方個儲存單元.我們知道乙個儲存單元可以儲存乙個位元組 byte 8kb 8192byte 就變成2的n次方 8192 n 13.答 我們知道儲存單元的單位是位元組,所以應為...

組合語言學習筆記2

組合語言學習筆記2 暫存器 乙個cpu是由運算器,控制器,暫存器等期間組成,這些器件是有內部匯流排連線的。運算器進行運算 資訊處理 暫存器進行資訊儲存的,控制器進行控制各種期間的工作。程式設計師對cpu的控制就是通過指令改變暫存器中的儲存資訊進行間接地控制cpu的。當然不同的cpu,暫存器的結構個數...