自制操作系統(tǒng)并運(yùn)行于樹莓派4B上(二)——使用匯編

前言

由于上一章中的budOS.img都是用十六進(jìn)制寫的依痊,里面很多數(shù)據(jù)意義不明,而且大量的0x00即使復(fù)制粘貼都很花時(shí)間怎披,而且容易出錯(cuò)胸嘁。這一章中,我們將使用匯編來重寫這個(gè)系統(tǒng)钳枕,并解釋系統(tǒng)中各個(gè)參數(shù)的含義。

budOS-0.0.2

這次版本中還是只有兩個(gè)文件:

budOS-0.0.2文件

其中budOS.asm就是我們的操作系統(tǒng)啦赏壹。.asm是匯編文件的后綴鱼炒,可以用文本編輯器直接打開。但是計(jì)算機(jī)無法直接理解匯編語言蝌借,我們需要一款匯編器來將匯編語言編譯成機(jī)器語言昔瞧,這里推薦使用開源軟件NASM(原書中作者使用了自己改造的匯編器,改動(dòng)了匯編語言的語法菩佑,為了學(xué)習(xí)真正通用的匯編自晰,這里使用最為通用的NASM),下載地址NASM稍坯,請(qǐng)根據(jù)自己計(jì)算機(jī)的操作系統(tǒng)安裝合適的版本酬荞。
接下來開一下budOS.asm里面的內(nèi)容搓劫。這個(gè)文件也不是我自己寫的,只是參照《30天自制操作系統(tǒng)》以及這篇文章鏈接混巧。我也是因?yàn)榭吹竭@篇文章寫的很好枪向,才想自己也寫一下博客,可惜作者只更新了前三章就沒有再更新了咧党。這里面作者描述的很詳細(xì)秘蛔,推薦看一下,這里我只簡單地過一遍傍衡。
windows開機(jī)讀軟盤第一個(gè)扇區(qū)的讀法

這里的所謂扇區(qū)深员,是指磁盤上的一段弧形區(qū)域。磁盤被劃分成一個(gè)個(gè)同心圓(即磁道)蛙埂,每個(gè)圓又以512個(gè)字節(jié)為單位劃分為一段段圓弧倦畅,這些圓弧就是扇區(qū),扇區(qū)是最小的讀寫單元箱残。磁盤的磁道從0開始計(jì)數(shù)滔迈,0磁道是同心圓里最大的,也就是最外面的圓被辑。扇區(qū)從1開始累加計(jì)數(shù)燎悍,0磁道的第一個(gè)扇區(qū)為1扇區(qū),第二個(gè)為2扇區(qū)盼理。假如0磁道有32個(gè)扇區(qū)谈山,則1磁道的第一個(gè)扇區(qū)即為33扇區(qū)。不難得到磁盤容量為扇區(qū)數(shù)*512字節(jié)宏怔。
下面直接貼上budOS.asm的代碼:

; hello-os
; TAB=4
; 下面實(shí)現(xiàn)FAT12格式軟盤代碼
DB 0xeb, 0x4e, 0x90
DB "budOSIPL" ;啟動(dòng)區(qū)的名稱可以是任意的字符串奏路,但長度必須是8字節(jié)
DW 512; 每一個(gè)扇區(qū)的大小,必須是512字節(jié)
DB 1 ;簇的大须铩(必須為1個(gè)扇區(qū))
DW 1 ;FAT的起始位置(一般從第一個(gè)扇區(qū)開始)
DB 2 ;FAT的個(gè)數(shù) 必須是2
DW 224;根目錄的大小 一般是224項(xiàng)
DW 2880; 該磁盤的大小 必須是2880扇區(qū)
DB 0xf0;磁盤的種類 必須是0xf0
DW 9;FAT的長度 必須是9扇區(qū)
DW 18;1個(gè)磁道(track) 有幾個(gè)扇區(qū) 必須是18
DW 2; 磁頭個(gè)數(shù) 必須是2
DD 0; 不使用分區(qū)鸽粉,必須是0
DD 2880; 重寫一次磁盤大小
DB 0,0,0x29 ;擴(kuò)展引導(dǎo)標(biāo)記 固定0x29
DD 0xffffffff ;卷列序號(hào)
DB "budOS      " ;磁盤的名稱(11個(gè)字節(jié))
DB "FAT12   " ;磁盤的格式名稱(8字節(jié))
TIMES 18 DB 0; 先空出18字節(jié) 這里與原文寫法不同

;程序主體
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd

;信息顯示部分
DB 0x0a, 0x0a ;兩次換行
DB "Hello, I'm buddingpop!"
DB 0x0a ; 換行
DB 0

TIMES 0x1fe-($-$$) DB 0 ;填寫0x00,知道0x001fe
DB 0x55,0xaa

;啟動(dòng)區(qū)以外的輸出
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES 4600 DB 0
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES 1469432 DB 0

可見代碼量很小,已經(jīng)可以全部貼上來了抓艳。代碼中一些常見指令:

;:注釋
DB:define byte触机,定義一個(gè)字節(jié)(8bit)
DW:define word,定義一個(gè)字(16bit)
DD:define double word玷或,定義兩個(gè)字(32bit)
TIMES n DB m:重復(fù)DB m操作n次儡首,DB也可以是其他操作,這是我們代碼量大大減少的原因
$:當(dāng)前位置
$$:當(dāng)前扇區(qū)起始地址

對(duì)照budOS-0.0.1中的budOS.img文件偏友,不難發(fā)現(xiàn)蔬胯,我們只是用匯編的方法將他重寫了一遍。至于為什么要這么寫呢位他?看可以參照上面的windows讀軟盤第一個(gè)扇區(qū)的讀法圖氛濒,都是能夠一一對(duì)應(yīng)的产场。當(dāng)然這只是第一個(gè)扇區(qū),從0x0000到0x01ff這512個(gè)字節(jié)的內(nèi)容泼橘,后面的我們暫時(shí)不要管涝动。最后兩個(gè)字節(jié)的內(nèi)容如果是0x55與0xaa,則表示該扇區(qū)內(nèi)包含啟動(dòng)代碼炬灭。
我們按照一定規(guī)則(匯編語法)用budOS.asm重寫了budOS.img醋粟,但是計(jì)算機(jī)是看不懂.asm這種文本文件的,因此需要使用上面提到的匯編器將其翻譯成機(jī)器語言重归。打開build.bat文件米愿,可以發(fā)現(xiàn)里面有三條命令:

nasm budOS.asm -o budOS.img
qemu-system-x86_64 budOS.img
pause

其中第一條的含義為使用nasm將源文件budOS.asm編譯為名為budOS.img的目標(biāo)文件,這條命令執(zhí)行完成后會(huì)在當(dāng)前文件夾下生成文件budOS.img鼻吮,之后的流程就與上一章的一樣啦育苟。雙擊build.bat文件,我們的操作系統(tǒng)又可以整場地運(yùn)行了椎木。我們可以對(duì)比一下budOS-0.0.1和0.0.2兩個(gè)文件的內(nèi)容违柏,用二進(jìn)制編輯器打開兩個(gè).img文件,發(fā)現(xiàn)是完全一樣的(除了我改了一點(diǎn)打印的字符之外)香椎。有了匯編器以后漱竖,我們就可以不用瘋狂的敲0啦,而.img文件也可以從我們的源代碼里刪掉了畜伐。

budOS-0.0.3

以上我們只是用匯編將.img重新寫了一遍馍惹,但其中有很多地方為什么要這么寫還不是很了解,比如程序主體部分÷杲纾現(xiàn)在我們用更加清楚的匯編語法來描述這段代碼究竟在干什么万矾。從這里開始大家就可以自己手敲代碼啦。
budOS-0.0.3相對(duì)于0.0.2只是修改了匯編程序慎框,具體代碼如下:

; hello-os
; TAB=4
ORG 0x7c00 ;程序的裝載地址
; 下面實(shí)現(xiàn)FAT12格式軟盤代碼
JMP entry
DB 0x90
DB "budOSIPL" ;啟動(dòng)區(qū)的名稱可以是任意的字符串良狈,但長度必須是8字節(jié)
DW 512; 每一個(gè)扇區(qū)的大小,必須是512字節(jié)
DB 1 ;簇的大斜靠荨(必須為1個(gè)扇區(qū))
DW 1 ;FAT的起始位置(一般從第一個(gè)扇區(qū)開始)
DB 2 ;FAT的個(gè)數(shù) 必須是2
DW 224;根目錄的大小 一般是224項(xiàng)
DW 2880; 該磁盤的大小 必須是2880扇區(qū)
DB 0xf0;磁盤的種類 必須是0xf0
DW 9;FAT的長度 必須是9扇區(qū)
DW 18;1個(gè)磁道(track) 有幾個(gè)扇區(qū) 必須是18
DW 2; 磁頭個(gè)數(shù) 必須是2
DD 0; 不使用分區(qū)薪丁,必須是0
DD 2880; 重寫一次磁盤大小
DB 0,0,0x29 ;擴(kuò)展引導(dǎo)標(biāo)記 固定0x29
DD 0xffffffff ;卷列序號(hào)
DB "budOS      " ;磁盤的名稱(11個(gè)字節(jié))
DB "FAT12   " ;磁盤的格式名稱(8字節(jié))
TIMES 18 DB 0; 先空出18字節(jié) 這里與原文寫法不同

;程序核心
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加一
    CMP AL,0

    JE fin
    MOV AH,0x0e ;顯示一個(gè)文字
    MOV BX,15 ;指定字符顏色
    INT 0x10 ;調(diào)用顯卡BIOS
    JMP putloop
fin:
    HLT ;讓cpu停止,等待指令
    JMP fin ;無限循環(huán)
msg:
    DB 0x0a, 0x0a ;換行兩次
    DB "Hello, I am buddingpop!"
    DB 0x0a ;換行
    DB 0

TIMES 0x1fe-($-$$) DB 0 ;填寫0x00,直到0x001fe
DB 0x55,0xaa

這一段里面又多了一些新指令:

ORG:origin猎醇,告訴編譯器這段代碼要被搬運(yùn)至內(nèi)存的起始地址窥突;
JMP:jump努溃,跳轉(zhuǎn)指令硫嘶,跳轉(zhuǎn)至tag處;
MOV:move梧税,賦值指令沦疾;
[]:取內(nèi)存地址中的內(nèi)容称近;
ADD:加法指令;
CMP:compare哮塞, 比較刨秆;
JE:jump equal,相等則跳轉(zhuǎn)忆畅;
INT:interrupt衡未,中斷;
HLT:halt家凯,停止指令缓醋。

這里還有一些寄存器的符號(hào),寄存器屬于cpu绊诲,主要包括:


寄存器

其中AX送粱,BX,CX掂之,DX抗俄,SP,BP世舰,SI动雹,DI均是16位寄存器,AX冯乘,BX洽胶,CX,DX又可以分為低8位與高8位裆馒,例如AX就可以分為AL和AH姊氓。在32與64位cpu中,這些寄存器會(huì)被擴(kuò)展到32位(EAX等)與64位(RAX等)喷好,但仍然可以只使用低位翔横,因此向下兼容。CS梗搅,DS禾唁,SS,ES稱為段寄存器无切,不管是32位與64位cpu下都是16位的荡短。
這樣上面的代碼就很清楚啦,運(yùn)行build.bat可以發(fā)現(xiàn)我們的操作系統(tǒng)能夠正常運(yùn)行哆键。打開生成的budOS.img掘托,會(huì)發(fā)現(xiàn)這次的有一些不一樣,只包含了一個(gè)扇區(qū)籍嘹,即512字節(jié)的內(nèi)容闪盔,后面的都丟失了弯院,但程序依然正常運(yùn)行。這是為什么呢泪掀?我也不知道哈哈听绳,不過繼續(xù)看下去就知道了。


只有512字節(jié)的內(nèi)容了

總結(jié)

我們使用匯編指令替代了十六進(jìn)制异赫。匯編器能夠幫助我們將匯編翻譯成機(jī)器語言椅挣,但機(jī)器語言具體是怎么調(diào)用顯卡的呢?以及這些寄存器為什么要這樣用呢塔拳?我們暫時(shí)不得而知贴妻,不過后面就會(huì)學(xué)習(xí)到啦。下一次我們就要開始引入c語言啦蝙斜。
P.S. 感覺每次程序更新的比較少名惩,現(xiàn)在開始我每個(gè)版本盡量多加一點(diǎn)內(nèi)容進(jìn)去。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載孕荠,如需轉(zhuǎn)載請(qǐng)通過簡信或評(píng)論聯(lián)系作者娩鹉。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稚伍,隨后出現(xiàn)的幾起案子弯予,更是在濱河造成了極大的恐慌,老刑警劉巖个曙,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈嫩,死亡現(xiàn)場離奇詭異,居然都是意外死亡垦搬,警方通過查閱死者的電腦和手機(jī)呼寸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猴贰,“玉大人对雪,你說我怎么就攤上這事∶兹疲” “怎么了瑟捣?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長栅干。 經(jīng)常有香客問我迈套,道長,這世上最難降的妖魔是什么碱鳞? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任桑李,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芙扎。我一直安慰自己,他們只是感情好填大,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布戒洼。 她就那樣靜靜地躺著,像睡著了一般允华。 火紅的嫁衣襯著肌膚如雪圈浇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天靴寂,我揣著相機(jī)與錄音磷蜀,去河邊找鬼。 笑死百炬,一個(gè)胖子當(dāng)著我的面吹牛褐隆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剖踊,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庶弃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了德澈?” 一聲冷哼從身側(cè)響起歇攻,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梆造,沒想到半個(gè)月后缴守,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镇辉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年屡穗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忽肛。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸡捐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麻裁,到底是詐尸還是另有隱情箍镜,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布煎源,位于F島的核電站色迂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏手销。R本人自食惡果不足惜歇僧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诈悍,春花似錦祸轮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舷夺,卻和暖如春苦酱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背给猾。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工疫萤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敢伸。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓扯饶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親池颈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帝际,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 王爽匯編全書知識(shí)點(diǎn)大綱 第一章 基礎(chǔ)知識(shí) 機(jī)器語言 匯編語言的產(chǎn)生 匯編語言的組成 存儲(chǔ)器 cpu對(duì)存儲(chǔ)器的讀寫 ...
    2c3ba901516f閱讀 2,419評(píng)論 0 1
  • 書籍簡介 閱讀目的 本意是為了調(diào)試coredump時(shí)候,通過寄存器饶辙、匯編命令定位產(chǎn)生coredump原因蹲诀。了解常見...
    賣女孩的小火柴18閱讀 1,711評(píng)論 0 2
  • OS課程 ucore_lab1實(shí)驗(yàn)報(bào)告 練習(xí)一:理解通過make生成執(zhí)行文件的過程。 ? ? 列出本實(shí)驗(yàn)各練習(xí)中...
    frans4x閱讀 451評(píng)論 0 1
  • 前面應(yīng)該有一章,“一:操作系統(tǒng)的概述”,懶得寫溯泣,但是很重要扑庞,最好去看下視頻,如果有人看的話,以后有空再補(bǔ) 首先我們...
    Wcdaren閱讀 1,739評(píng)論 0 1
  • 謫詩仙人天外來,月下花間酒香開。古來多少圣賢事掖举,今夕唯傳李太白。
    欲倚闌干不自由閱讀 295評(píng)論 0 0