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,暫存器的結構個數...