30天自制操做系統-2

這一天咱們會學到彙編語言,與makefile,還記昨天用了大量的DD,DW等指令,雖然已經很不錯了,但咱們想讓它更爲人看得懂。編輯器

一上來我也推薦個編輯器吧,我通常用Sublime(翻譯推薦的是notepad++,這個通常被我用來打開某個單獨文件)由於我之前用它習慣性寫lua代碼,因此,工程類的東西我仍是喜歡Sublime函數

ORG 0x7c00 ;指明程序裝在地址工具

JMP entry
DB 0x90oop

; 程序核心學習

entry:lua

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

    RESB    0x7dfe-$        ; 填寫0x00直到0x001fe

    DB        0x55, 0xaa

這一下基本每句代碼都比較好的來解釋他的意思了。雖然彙編是個很古老的語言了,但至少咱們看得懂。後面大部分仍是用C來寫邏輯,彙編提供底層接口函數。code

首先是ORG指令,他告訴編譯器要讓咱們的程序從這個地址開始,也就是裝載到指定內存地址中去。緣由固然是沒有啊,由於要是我來定我會定個520。
一些簡單的指令就很少講。
有幾個比較具備表明性的寄存器,這裏說說。
AX-累加寄存器
CX-計數寄存器
DX-數據寄存器
BX-基址寄存器
SP-棧指針寄存器
BP-基址指針寄存器
SI-源變址寄存器
DI-目標變址寄存器

而後這些寄存器能夠拆爲高八位與第八位分別是後綴改成LOW和HIGH這裏有個比較蛋疼的問題,就是當我要取BP,SP,SI,DI這四個寄存器的低八位與高八位的時候,就得經過一個媒婆來實現,例如,MOV AX,SI 而後再用AL,AH取出來,固然可能當時Intel大叔們這樣設計是有他們的緣由的。
這些都是16位的寄存器後來32後有了EAX等。。,EAX取高16位很是很差取,因此通常用低16位,由於要經過位運算來獲得高16位。
還有一個段寄存器
ES-附加段寄存器
CS-代碼段寄存器
SS-棧段寄存器
DS-數據段寄存器
FS-沒有名稱
GS-沒有名稱

這些寄存器均可以根據其名稱知道他們的做用

首先是jmp到一個標號,這個標號會被編譯器自動解析爲所對應的內存地址,若是你想寫指定內存地址那我認爲你是瘋了。

接下來看看[SI],這個表明的就是去取內存條中的字節
因爲用做此做用的寄存器只有BX,BP,SI,DI這幾個,因此又來了個蛋疼的問題

MOV BX,DX
MOV AL,BYTE[BX]
就得這樣玩兒。因爲AL是8位的寄存器,因此從指定內存地址中讀取一個字節內容到AL,mov的規則是左右數據必須相同,和高級語言同樣。

cmp比較指令,若成立執行下一句代碼若不成立略過下一句代碼向後執行。

如今要來說個頗有意思的指令了,int(中斷指令)其實我最開始學的時候,我據把他當成調用函數來看待,和高級語言很是相似。首先就是根據BIOS說好的我先往哪些寄存器裏填東西,而後再調用某個int則能夠實現某個功能。

MakeFile:

這個makefile在之後幾乎隨時都要用到,掌握它,不吃虧。
集成開發環境的做用就是一個軟件提供了,從代碼編寫到運行爲你最終想要看到的樣子,makefile就是在寫這樣一個規則,固然這中間的一個個具體工做的工具,做者已提供(其實我認爲做者對這部分工具沒有開源,對咱們來講是不可控的,不是一件好事)。
我在這裏講解的makefile不建議讀者學習,僅用於本身記錄(忘理解),能夠上Google參考更詳細的makefile教程。
格式:
要生成的文件 : 須要爲生成而準備的文件 若成立則會執行下一句命令
''表示此行不夠補到下行繼續

make很聰明,若須要準備的文件不存在,它會首先去檢查一下以前是否有命令能夠生成這個文件。
沒有考察過是不是根據日期來是否從新生成,或者是md5呢(對於其內部不太清楚)

關於最後:
關於做者的提問數據也能"執行"嗎?機器語言也能"顯示"嗎? 若是是初學者必定會問的問題,若提早了解過彙編,那麼這個問題,或許早就在學彙編的時候問過了。無論你是圖片仍是程序,甚至是音樂,在計算機看來都是0,1,關鍵在於你如何看待這些數據。

次日已經over啦。總結一下,從昨天到今天,主要用上了makefile對於咱們開發時常看效果簡直是太方便啦。並且又解決了一些看不懂的代碼,明天繼續

相關文章
相關標籤/搜索