日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

第一章--最小的“操作系统”

發布時間:2025/6/15 windows 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一章--最小的“操作系统” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、最簡單的“操作系統”

最最簡單的“操作系統”就是一個最最簡單的引導扇區(Boot Sector)。雖然它不具有任何功能,但是它卻能夠直接在裸機上運行,不依賴其他軟件。一個引導扇區是512個字節,并且以0xAA55為結束標識的扇區。下面就是那個最最簡單的引導扇區。

[cpp] view plaincopy
  • org?07C00h??????????????????????????;?告訴編譯器程序加載到07C00處??
  • ???????mov?ax,?cs??
  • ???????mov?ds,?ax??
  • ???????mov?es,?ax??
  • ???????call?DispStr?????????????????????;?調用顯示字符串例程??
  • ???????jmp?$????????????????????;?無限循環??
  • DispStr:??
  • ???????mov?ax,?BootMessage??
  • ???????mov?bp,?ax???????????????????????;?es:bp?=?串地址??
  • ???????mov?cx,?16???????????????????????;?cx?=?串長度??
  • ???????mov?ax,?01301h???????????????;?ah?=?13,?al?=?01h??
  • ???????mov?bx,?000Ch????????????????;?頁號為0(bh?=?0)?黑底紅字?(bl?=?0Ch,高亮)??
  • ???????mov?dl,?0??
  • ???????int?10h??????????????????????????;?10h號中斷??
  • ???????ret??
  • BootMessage:??db?"Hello,OS?world!"??
  • times?510-($-$$)???db???0???????????????;?填充剩下的空間,使生成的二進制代碼恰好為512字節??
  • dw?0xaa55???????????????????????????????;?結束標志??
  • 1、org 07C00h

    org偽指令: org + 數值表達式

    其中,org是操作碼,不可省略。數值表達式給出偏移地址值,即org語句后的指令或數據以數值表達式給出的值作為起始的偏移地址。數值表達式必須是一個可計算得到的正整數,數值范圍在0~65535之間。

    org偽指令用來指出其后的程序段或數據塊存放的起始地址的偏移量。匯編程序匯編時把語句中表達式的值作為起始地址,連續存放org語句之后的程序和數據,直到出現一個新的org指令。若省略org語句,則從本段起始地址開始連續存放。

    在大多數情況下,不需要用org語句設置位置指針。由于段定義語句是段的起點,它的偏移地址為0000H,以后每分配一個字節,位置指針自動加1,所以每條指令都有確定的偏移地址。只有程序要求改變這個位置指針時,才需要安排org語句。通常org語句可以出現在程序中任何位置上。 ??

    org示例:

    在數據段中依次定義以下變量,由于此時沒有使用org語句,則變量word1的偏移地址為0。
    word1 DW ?1234h
    byte1 ?DB ? 56h
    word2 DW ?abcdh
    其在數據段中word1,byte1,word2的存儲位置如下圖所示(采用小端存儲,按單字節對齊)。


    在數據段中依次定義以下變量,由于此時使用org語句,則變量word1的偏移地址為1。
    org 0001h
    word1 DW ?1234h
    byte1 ?DB ? 56h
    word2 DW ?abcdh
    其在數據段中word1,byte1,word2的存儲位置如下圖所示(采用小端存儲,按單字節對齊)。

    我們知道編譯器本身在匯編時對指令的地址計算是相對地址,而對于引導扇區,是按絕對地址執行,那么對于用相對地址編譯的執行碼就要換算成絕對地址。一般而言,“真實開始執行的引導扇區”都會固定裝載到07C00h處。

    由于編譯器在編譯時的地址是從第一行開始用0000h開始相對計算的,而且我們要寫的是“引導扇區”程序,所以我們要將下面的代碼加載到地址07C00h處,所以我們需要org 07C00h,通過該偽指令,將代碼和數據加載到07C00h地址。

    2、jmp $

    $被稱為當前位置計數器

    在匯編程序對源程序進行匯編的過程中,使用地址計數器來保證當前正在匯編的指令地址。地址計數器值可用“$”來表示,匯編語言也允許用戶直接用“$”來引用地址計數器的當前值,因此,org $+5可表示從當前地址開始跳過5個字節存儲單元,在指令和偽指令中,也可直接用“$”表示地址計數器的當前值。故jmp $進入了一個無限循環。

    3、int ?10h

    int ?10H號中斷

    int 10H 是由BIOS 對屏幕及顯示器所提供的服務程序。使用int 10H 中斷服務程序時,先指定 AH 寄存器為下表編號其中之一,該編號表示欲調用的功用,而其他寄存器的詳細說明,參考表后文字,當一切設定好之后再調用 int 10H。

    在這里我們只詳細講解本程序中的10號中斷。由于ah=13,故調用編號為13的功能:即顯示字符串。其中ES:BP=串地址,CX=串長度 ,AH=13,當AL=01h時,光標會跟隨顯示移動。BH為頁號,BH=0表示頁號為0,BL=0CH,表示屬性,即黑底紅字高亮。因此在調用10號中斷之前,無非就是對各個寄存器進行初始化。

    關于10號中斷的其他信息,請參考 http://blog.csdn.net/yes_life/article/details/6778834

    4、times 510-($-$$) ?db ?0

    times:重復指令或數據

    times前綴引起指令被匯編多次。其中

    510?($? )次。也就是用0來填充剩下的空間,達到510字節。

    二、如何運行該“操作系統”

    1、環境準備

    (1)計算機操作系統(Windows)
    (2)虛擬機(VMware)
    (3)匯編編譯器(NASM)
    (3)軟盤(虛擬軟盤RamDiskNT)
    (4)rawrite.exe/本書光盤自帶OS/Tools/FloppyWriter,負責將程序寫入到軟盤。

    2、編譯boot.asm

    將上述代碼文件命名為boot.asm,然后使用nasm命令編譯該文件。
    nasm boot.asm –o boot.bin

    3、虛擬軟盤A


    點擊Start之后,查看“我的電腦”里是否有虛擬軟盤A,如果沒有,重啟。

    4、將boot.bin寫入到軟盤A


    點擊Enter。(注意boot.bin與Rawrite.ext在同一文件目錄下)。

    5、創建虛擬機

    安裝VMware,在VMware創建一個虛擬機,命名為Tinix,并設置系統引導盤為軟盤A。


    啟動該系統,得出結果圖為:


    三、本操作系統啟動流程

    打開計算機電源;加電自檢(POST);尋找啟動盤,該系統設置從軟盤啟動,計算機檢查軟盤的0面0磁道1扇區,如果發現它以0xAA55結束,則BIOS會認為它是一個引導扇區;BIOS將該512字節扇區內容加載到內存地址0000:7c00;跳轉到0000:7C00出將控制權交給這段引導代碼。到此為止,計算機不再由BIOS中固有的程序來控制,而變成由操作系統的一部分來控制。

    總結

    以上是生活随笔為你收集整理的第一章--最小的“操作系统”的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。