從零開(kāi)發(fā)操作系統(tǒng)-第二天匯編語(yǔ)言、BIOS以及Makefile介紹

你好碳胳,我是 shengjk1勇蝙,多年大廠經(jīng)驗(yàn),努力構(gòu)建 通俗易懂的挨约、好玩的編程語(yǔ)言教程味混。 歡迎關(guān)注!你會(huì)有如下收益:

  1. 了解大廠經(jīng)驗(yàn)
  2. 擁有和大廠相匹配的技術(shù)等

希望看什么诫惭,評(píng)論或者私信告訴我翁锡!

一、背景

其實(shí)也沒(méi)有啥背景夕土。
最主要的原因就像 《30天自制操作系統(tǒng)》一書(shū)作者說(shuō)的那樣馆衔,寫(xiě)一個(gè)操作系統(tǒng)瘟判,僅僅想想就是一件特別有趣的事情呢。一兩年前曾經(jīng)入手開(kāi)始寫(xiě)過(guò)角溃,但慢慢的就不了了之了】交瘢現(xiàn)在又有這個(gè)想法了,準(zhǔn)備一直干下去减细,最終寫(xiě)一個(gè)操作系統(tǒng)出來(lái)匆瓜,算是程序員生涯的一份禮物。

其次的原因未蝌,是因?yàn)槲乙舱J(rèn)為未來(lái)初級(jí)程序員的崗位會(huì)越來(lái)越少驮吱,借助 LLM 人人都是初級(jí)程序員可能會(huì)變成現(xiàn)實(shí)。這個(gè)時(shí)候?qū)I(yè)性和底層就會(huì)越來(lái)越重要

二萧吠、匯編介紹

《30天自制操作系統(tǒng)》一書(shū)中第二課的匯編語(yǔ)言糠馆,注釋如下:

; hello-os
; TAB=4
; bootloader  code

        ORG     0x7c00          ; 指明程序裝載地址  出廠的時(shí)候BIOS就被組裝在電腦主板上的ROM單元里。電腦廠家在BIOS中預(yù)先寫(xiě)入了操作系統(tǒng)開(kāi)發(fā)人員經(jīng)常使用的一些程序

; 標(biāo)準(zhǔn)FAT12格式軟盤(pán)專(zhuān)用的代碼 Stand FAT12 format floppy code

        JMP     entry
        DB      0x90
        DB      "HELLOIPL"      ; 啟動(dòng)扇區(qū)名稱(chēng)(8字節(jié))
        DW      512             ; 每個(gè)扇區(qū)(sector)大性醣铩(必須512字節(jié))
        DB      1               ; 簇(cluster)大杏致怠(必須為1個(gè)扇區(qū))
        DW      1               ; FAT起始位置(一般為第一個(gè)扇區(qū))
        DB      2               ; FAT個(gè)數(shù)(必須為2)
        DW      224             ; 根目錄大小(一般為224項(xiàng))
        DW      2880            ; 該磁盤(pán)大邪泶(必須為2880扇區(qū)1440*1024/512)
        DB      0xf0            ; 磁盤(pán)類(lèi)型(必須為0xf0)
        DW      9               ; FAT的長(zhǎng)度(必??9扇區(qū))
        DW      18              ; 一個(gè)磁道(track)有幾個(gè)扇區(qū)(必須為18)
        DW      2               ; 磁頭數(shù)(必??2)
        DD      0               ; 不使用分區(qū)毕匀,必須是0
        DD      2880            ; 重寫(xiě)一次磁盤(pán)大小
        DB      0,0,0x29        ; 意義不明(固定)
        DD      0xffffffff      ; (可能是)卷標(biāo)號(hào)碼
        DB      "HELLO-OS   "   ; 磁盤(pán)的名稱(chēng)(必須為11字?,不足填空格)
        DB      "FAT12   "      ; 磁盤(pán)格式名稱(chēng)(必??8字?癌别,不足填空格)
        RESB    18              ; 先空出18字節(jié)

; 程序主體

entry:  ;0x7c50
        MOV     AX,0            ; 初始化寄存器    MOV:賦值
        MOV     SS,AX
        MOV     SP,0x7c00
        MOV     DS,AX
        MOV     ES,AX

        MOV     SI,msg
putloop:
        MOV     AL,[SI]         ; [] 表示內(nèi)存皂岔,表示把 SI對(duì)應(yīng)的內(nèi)存地址上數(shù)據(jù)的1個(gè)字節(jié)的內(nèi)容讀入到 AL 中。 MOV的數(shù)據(jù)傳送源和傳送目的地不僅可以是寄存器或常數(shù)展姐,也可以是內(nèi)存地址躁垛。 MOV會(huì)自動(dòng)要求源數(shù)據(jù)和目標(biāo)數(shù)據(jù)位數(shù)一致
        ADD     SI,1            ; 給SI加1
        CMP     AL,0
        JE      fin             ; 如果結(jié)果相等則跳轉(zhuǎn)到指定地址,如果不等則不跳轉(zhuǎn)
        MOV     AH,0x0e         ; 顯示一個(gè)字符    INT 0x10, AH = 0xE -- display char圾笨,這是調(diào)用 BIOS 的 “Teletype Output” 功能教馆,用于在屏幕上顯示一個(gè)字符,并推進(jìn)光標(biāo)
        MOV     BX,15           ; 指定字符顏色
        INT     0x10            ; 調(diào)用顯卡顯示文字,INT 0x10 = Video display functions (including VESA/VBE)   INT軟件中斷指令
        JMP     putloop
fin:
        HLT                     ; 讓CPU停止擂达,等待指令
        JMP     fin             ; 無(wú)限循環(huán)

msg:                            ;0x7c74
        DB      0x0a, 0x0a      ; 換行兩次
        DB      "hello, world"
        DB      0x0a            ; 換行
        DB      0

        RESB    0x7dfe-$        ; 填寫(xiě)0x00填充到0x7def, 有了 ORG土铺,$代表將要讀入的內(nèi)存地址

        DB      0x55, 0xaa


; AX —— accumulator,累加寄存器          0-7位的低8位成為AL,8-15位的高8位稱(chēng)為 AH
; CX —— counter板鬓,計(jì)數(shù)寄存器
; DX —— data悲敷,數(shù)據(jù)寄存器
; BX —— base,基址寄存器                 通常在內(nèi)存尋址中用來(lái)存放基地址俭令。它與源索引SI和目的索引DI寄存器結(jié)合后德,可以用于訪問(wèn)數(shù)組或其他數(shù)據(jù)結(jié)構(gòu)。
; SP —— stack pointer抄腔,棧指針寄存器      SP寄存器指向當(dāng)前棧的頂部瓢湃。在執(zhí)行函數(shù)調(diào)用窟赏、參數(shù)傳遞、局部變量分配和函數(shù)返回時(shí)箱季,棧指針會(huì)相應(yīng)地增加或減少。
; BP —— base pointer棍掐,基地址指針寄存器    通常用于訪問(wèn)堆棧中的局部變量和函數(shù)參數(shù)藏雏。在棧幀中,BP通常指向幀的起始位置作煌。
; SI —— source index掘殴,源變址寄存器       通常用于字符串操作和數(shù)組處理中,指向源數(shù)據(jù)的位置
; DI —— destination index粟誓,目的變址寄存器  同樣用于字符串操作和數(shù)組處理奏寨,但它指向目標(biāo)數(shù)據(jù)的位置
; 這些都是 16 位寄存器,所以可以存儲(chǔ)16位的二進(jìn)制. 按照機(jī)器語(yǔ)言中寄存器的編號(hào)順序排列的
; 指令編碼:操作碼 opcode 和 操作數(shù) operand 構(gòu)成



; CPU中的8個(gè)8位寄存器鹰服,具體為:
; AL——累加寄存器低位(accumulator low)
; CL——計(jì)數(shù)寄存器低位(counter low)
; DL——數(shù)據(jù)寄存器低位(data low)
; BL——基址寄存器低位(base low)
; AH——累加寄存器高位(accumulator high)
; CH——計(jì)數(shù)寄存器高位(counter high)
; DH——數(shù)據(jù)寄存器高位(data high)
; BH——基址寄存器高位(base high)


; 段寄存器
; 這些段寄存器都是16位寄存器病瞳。
; ES——附加段寄存器(extra segment)
; CS——代碼段寄存器(code segment)
; SS——棧段寄存器(stack segment)
; DS——數(shù)據(jù)段寄存器(data segment)
; FS——沒(méi)有名稱(chēng)(segment part 2)
; GS——沒(méi)有名稱(chēng)(segment part 3)

重點(diǎn)關(guān)注一下幾個(gè)點(diǎn):

  1. 通過(guò)匯編開(kāi)發(fā)程序,被成為 Bootloader Code 具體 Bootloader 是什么以及在計(jì)算機(jī)啟動(dòng)過(guò)程中有啥作用悲酷,這篇文章有較為詳細(xì)的介紹
  2. 程序的裝在位置什么是:0x7c00
    這一塊是 IBM 大叔們規(guī)定的套菜,It should also be noted that your bootloader code is loaded and running in memory at physical addresses 0x7C00 through 0x7DFF.
  3. INT 0x10, MOV AH 0xE 表示 display char。這些都是在調(diào)用 BIOS function
  4. BIOS 在這篇文章中也有介紹设易。
    這里再補(bǔ)充一下:BIOS 是計(jì)算機(jī)出廠時(shí)就被組裝在電腦主板上的ROM單元里逗柴。電腦廠家在BIOS中預(yù)先寫(xiě)入了操作系統(tǒng)開(kāi)發(fā)人員經(jīng)常使用的一些程序。

三顿肺、Makefile

Makefile 是一個(gè)文本文件戏溺,用于控制自動(dòng)化構(gòu)建過(guò)程,特別是在軟件開(kāi)發(fā)領(lǐng)域屠尊。它是由 make 命令讀取的腳本旷祸,用來(lái)指導(dǎo)編譯器和鏈接器如何構(gòu)建源代碼、庫(kù)和其他依賴(lài)項(xiàng)讼昆。

Makefile 通常包含以下元素:

  1. 目標(biāo)(Targets):Makefile 中的目標(biāo)通常是最終要生成的文件肋僧,比如可執(zhí)行程序或庫(kù)文件。
  2. 依賴(lài)關(guān)系:每個(gè)目標(biāo)可以有零個(gè)或多個(gè)依賴(lài)項(xiàng)控淡,這些依賴(lài)項(xiàng)是該目標(biāo)所依賴(lài)的其他目標(biāo)和文件的列表嫌吠。
  3. 命令:當(dāng)目標(biāo)的依賴(lài)項(xiàng)比目標(biāo)本身更新時(shí),需要執(zhí)行的命令列表掺炭,例如編譯器的編譯指令等辫诅。
  4. 變量:用于簡(jiǎn)化 Makefile 的維護(hù)和增強(qiáng)其可讀性的名稱(chēng)/值對(duì)。
  5. 自動(dòng)變量和模式規(guī)則:用于進(jìn)一步抽象常見(jiàn)的構(gòu)建任務(wù)涧狮。
  6. 隱含規(guī)則:make 提供了一些內(nèi)置的規(guī)則和變量炕矮,可用于常見(jiàn)的目標(biāo)類(lèi)型么夫,如 .o 文件和可執(zhí)行文件。

Makefile 的語(yǔ)法相對(duì)簡(jiǎn)單肤视,但是非常強(qiáng)大且靈活档痪,可以適應(yīng)各種復(fù)雜的構(gòu)建場(chǎng)景。對(duì)于大型項(xiàng)目來(lái)說(shuō)邢滑,手工編譯每一個(gè)模塊不僅費(fèi)時(shí)而且容易出錯(cuò)腐螟,而 Makefile 可以幫助自動(dòng)化這一過(guò)程,確保項(xiàng)目的各個(gè)部分按照正確的順序和規(guī)則進(jìn)行編譯和鏈接困后。

在實(shí)際的開(kāi)發(fā)環(huán)境中乐纸,尤其是涉及 C/C++ 語(yǔ)言的項(xiàng)目中,Makefile 被廣泛使用摇予。此外汽绢,許多現(xiàn)代構(gòu)建系統(tǒng)和包管理器(如 CMake、GNU Build System 等)也支持或生成為舊版 make 系統(tǒng)編寫(xiě)的 Makefile侧戴。

四宁昭、BIOS 擴(kuò)展

BIOS(基本輸入輸出系統(tǒng))是一種固件,它既不屬于純粹的軟件也不完全是硬件酗宋。固件是介于軟件和硬件之間的一種特殊形式久窟,它通常被編程到計(jì)算機(jī)主板上的一塊閃存或EPROM芯片中。BIOS負(fù)責(zé)在計(jì)算機(jī)啟動(dòng)時(shí)初始化硬件本缠,并提供一個(gè)到操作系統(tǒng)的橋梁斥扛,使得計(jì)算機(jī)能夠加載操作系統(tǒng)。雖然BIOS在功能上類(lèi)似于軟件丹锹,但它的存儲(chǔ)和執(zhí)行方式又與硬件相似稀颁,因此它被看作是一種固件。

BIOS(基本輸入輸出系統(tǒng))的概念最初是在1975年由Gary Kildall為Intel 8080微處理器設(shè)計(jì)的CP/M操作系統(tǒng)(Control Program/Monitor)的一部分而產(chǎn)生的楣黍。以下是BIOS發(fā)展的一些關(guān)鍵點(diǎn):

  1. CP/M操作系統(tǒng):Gary Kildall創(chuàng)建的CP/M操作系統(tǒng)需要一個(gè)方法來(lái)與不同的硬件進(jìn)行通信匾灶。為了解決這個(gè)問(wèn)題,他設(shè)計(jì)了一個(gè)BIOS租漂,它包含了一系列底層硬件接口的例程阶女,這些例程可以被CP/M調(diào)用以執(zhí)行輸入輸出操作。
  2. IBM PC的推出:1981年哩治,IBM推出了第一臺(tái)個(gè)人計(jì)算機(jī)IBM PC秃踩。為了使軟件開(kāi)發(fā)變得更加容易,IBM決定在其PC上使用BIOS來(lái)提供一個(gè)標(biāo)準(zhǔn)的硬件接口业筏。這樣憔杨,軟件開(kāi)發(fā)者就可以編寫(xiě)應(yīng)用程序,而不必?fù)?dān)心與各種硬件的直接交互蒜胖。
  3. BIOS的作用:在IBM PC中消别,BIOS負(fù)責(zé)在計(jì)算機(jī)啟動(dòng)時(shí)執(zhí)行POST(電源自檢)來(lái)檢查硬件配置抛蚤,初始化硬件組件,并提供一個(gè)引導(dǎo)加載程序來(lái)從磁盤(pán)或其他存儲(chǔ)設(shè)備加載操作系統(tǒng)寻狂。
  4. 兼容性和標(biāo)準(zhǔn)化:隨著IBM PC及其兼容機(jī)的普及岁经,BIOS成為行業(yè)標(biāo)準(zhǔn)。其他硬件制造商開(kāi)始為他們的主板編寫(xiě)兼容的BIOS蛇券,以保持與IBM PC軟件的兼容性缀壤。
  5. BIOS的發(fā)展:隨著時(shí)間的推移,BIOS的功能不斷擴(kuò)展怀读,以支持新的硬件技術(shù)和功能。盡管后來(lái)UEFI(統(tǒng)一可擴(kuò)展固件接口)開(kāi)始逐漸取代傳統(tǒng)的BIOS骑脱,但BIOS的概念和基本功能仍然在現(xiàn)代計(jì)算機(jī)系統(tǒng)中發(fā)揮著作用菜枷。

BIOS的產(chǎn)生是計(jì)算機(jī)歷史上一個(gè)重要的里程碑,它為硬件和軟件之間的標(biāo)準(zhǔn)化交互奠定了基礎(chǔ)叁丧,并且極大地推動(dòng)了個(gè)人計(jì)算機(jī)的普及和發(fā)展啤誊。

五、總結(jié)

通過(guò)匯編語(yǔ)言的介紹拥娄,作者展示了操作系統(tǒng)開(kāi)發(fā)的基礎(chǔ)蚊锹,包括Bootloader Code的重要性和BIOS在計(jì)算機(jī)啟動(dòng)過(guò)程中的作用。Makefile的自動(dòng)化構(gòu)建過(guò)程和BIOS的歷史發(fā)展也被詳細(xì)闡述稚瘾,為讀者提供了計(jì)算機(jī)系統(tǒng)開(kāi)發(fā)的深入理解牡昆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市摊欠,隨后出現(xiàn)的幾起案子丢烘,更是在濱河造成了極大的恐慌,老刑警劉巖些椒,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件播瞳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡免糕,警方通過(guò)查閱死者的電腦和手機(jī)赢乓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)石窑,“玉大人牌芋,你說(shuō)我怎么就攤上這事∷裳罚” “怎么了姜贡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棺棵。 經(jīng)常有香客問(wèn)我楼咳,道長(zhǎng)熄捍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任母怜,我火速辦了婚禮余耽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苹熏。我一直安慰自己碟贾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布轨域。 她就那樣靜靜地躺著袱耽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪干发。 梳的紋絲不亂的頭發(fā)上朱巨,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音枉长,去河邊找鬼冀续。 笑死,一個(gè)胖子當(dāng)著我的面吹牛必峰,可吹牛的內(nèi)容都是我干的洪唐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吼蚁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凭需!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肝匆,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤功炮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后术唬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體薪伏,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年粗仓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫁怀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡借浊,死狀恐怖塘淑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚂斤,我是刑警寧澤存捺,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響捌治,放射性物質(zhì)發(fā)生泄漏岗钩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一肖油、第九天 我趴在偏房一處隱蔽的房頂上張望兼吓。 院中可真熱鬧,春花似錦森枪、人聲如沸视搏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浑娜。三九已至,卻和暖如春式散,著一層夾襖步出監(jiān)牢的瞬間筋遭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工杂数, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宛畦,地道東北人瘸洛。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓揍移,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親反肋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子那伐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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