8086-2-搭建直接通過CPU執行匯編語言的環境


搭建直接通過CPU執行匯編語言環境

我們通過編譯寫好的匯編語言代碼可以生成.bin的機器語言二進制代碼。但是這個.bin程序我們該如何運行呢?

這里其實有兩個辦法:

1: 將其作為一個Windows/linux也就是操作系統的可執行程序來運行,這個nasm是可以做到的,很多工具也可以做到,把一個匯編程序編譯鏈接成一個.exe來處理。

2: 直接通過CPU來使用。因為.bin文件是機器碼,肯定是可以直接讓CPU來使用的。操作系統也是一個需要在處理器上運行的軟件,只不過比 起一般的程序而言,體積更為龐大,功能更為復雜而已。如果我們能繞過它,或者代替它,讓計算機一開機的時候直接執行我們自己的程序, 豈不更簡單?而且很酷,不用操作系統,自己直接操作CPU。

采用第一種比較簡單,這里就不詳述了。

搭建環境原理:

前面我們講述了8086的啟動操作:

計算機的啟動過程(8086) - Sna1lGo - 博客園 (cnblogs.com)

 

在bios調用完之后cs:ip會變成物理地址0x07C00來加載主引導扇區的代碼,我們可以直接通過硬盤啟動,然后把硬盤的主引導扇區的代碼變成我們自己的代碼。這多帥,直接操作CPU,避開操作系統。

但是我們還需要有調試功能才行,因為如果不能調試,那么CPU就直接順着代碼走就完了,我們啥也看不到,所以我們需要一個帶有調試功能的虛擬機。正好有一個非常適合我們,叫做 bochs:bochs: The Open Source IA-32 Emulation Project (Home Page) (sourceforge.io)

 

預備知識

虛擬硬盤簡介:

我們把我們的代碼寫到硬盤里,然后虛擬機讀取我們的硬盤就行了。但是由於我們得往硬盤里寫東西,所以需要提前了解一下硬盤。

虛擬硬盤並不是真實的硬盤,而是用文件來模擬生成的一個硬盤。

虛擬硬盤有很多這里介紹三個:

VMDK VMWare虛擬機
VDI VirtualBox虛擬機
VHD Virtual-PC/Hyper-V虛擬機

其中VHD比較簡單,所以這里我們就采用VHD虛擬硬盤。

VHD也可以分為固定尺寸和動態尺寸,其中固定尺寸更簡單,所以采用VHD的固定尺寸硬盤。

在VHD 規范里,每個扇區是512 字節。VHD文件一開始的512 字節,就對應着物理硬盤的0 面0 道1 扇區。然后,VHD 文件的第二個512 字節,對應着0 面0 道2 扇區,后面的以此類推。再往后,因為硬盤的訪問是按柱面進行的,所以,下一個數據塊對應的是1 面0 道1 扇區,就這樣一 直往后排列,當把第一個柱面全部對應完后,再從第二個柱面開始對應。磁盤轉圈比移動快,所以最后才移動磁道。

固定尺寸的VHD 虛擬硬盤 是一個具有“.vhd”擴展名的文件,它僅包括兩個部分,前面是數據區,用來模擬實際的硬盤空間,最后面跟着一個512 字節的結尾

文件尾的內容是以一個字符串“conectix”開始的。這個標志用來告訴試圖打開它的虛擬機,這的確是一個合法的VHD 文件。該標志稱為VHD 創建者標識,就是說,該公司(conectix)創建了VHD 文 件格式的最初標准:

 

 

從這個標志字符串開始,后面的數據包含了諸如文件的創建日期、VHD 的 版本、創建該文件的應用程序名稱和版本、創建該文件的應用程序所屬 的操作系統、該虛擬硬盤的參數(磁頭數、每面磁道數、每磁道扇區 數)、VHD 類型(固定尺寸還是動態增長)、虛擬硬盤容量等。

磁盤的訪問邏輯:

傳統的訪問模式就是:CHS,通過柱面磁道磁頭,也就是前面的0 面0 道1 扇區這種類似的格式,但是這個不太方便。

 

 

然后就有了LBA(Logical Block Address)就是把所有的扇區進行一個邏輯編號,從0開始到最后一個扇區進行編號,然后單位為塊(block)其實就是扇區,只不過扇區看着確實是一塊一塊的:

 

 

LBA和CHS的對應方式:

 

 

存儲容量 = 磁頭數 × 磁道(柱面)數 × 每道扇區數 × 每扇區字節數

移動方式稍微不一樣點,先移動扇區再磁頭最后再更改柱面。因為更改柱面磁頭需要移動。 也就是以柱面為單位來讀取的意思。

LBA = 磁道*磁頭 *每個磁道的扇區數+ 磁頭 * 每個磁道的扇區數 + 扇區位置-1

比如這里的: 1面0道2扇區 == 0* 2*17 + 1 *17 +2 -1 ==18

0面1道2扇區 == 1*2 *17 +2 -1 == 35

 

需要工具:

安裝bochs:(在這里選擇自己的需要的版本)

Bochs x86 PC emulator - Browse /bochs/2.7 at SourceForge.net

安裝 VirtualBox:

Downloads – Oracle VM VirtualBox

下載李忠老師的軟件包:

http://www.lizhongc.com/myfiles/download.php?id=201

下載二進制查看軟件:

Download HexView 2.0 (softpedia.com)

 

搭建環境

創建一個固定尺寸的VHD虛擬硬盤,然后將其安裝到Bochs虛擬機上。

第一步創建一個虛擬硬盤:

創建虛擬硬盤:

1:打開Virtual Box,單擊管理—>虛擬介質管理器,就會得到這個界面:

 

 

2:點擊創建,選擇VHD虛擬硬盤:

 

 

3:選擇固定大小:

 

 

4:自己選擇硬盤位置和大小(我這里拿來學習所以不需要太大)

 

 

5:查看結果

 

 

配置bochs環境

1:選中配置:

 

 

2:關閉軟盤:(軟盤基本上絕跡了)

 

 

3:選中ATA channel0:(這個就默認值不改就好)

 

 

4:選中ATA channel0的子目錄 First HD/CD on channel0

然后修改,其中Path開頭那個是前面創建的虛擬硬盤。

 

 

然后剩下的信息需要查看虛擬磁盤的信息才可以,這里要用到前面李忠老師的資源包里的一個軟件:

叫做fixvhdwr.exe,用它來打開我們前面創建的虛擬硬盤

 

 

然后根據里面的信息來填充到前面:

 

 

 

 

Cylinders為柱面,Heads為磁頭,Sectors per track為每個磁道有多少扇區。

5:修改計算機的啟動順序:

改成第一個用磁盤,第二個用光盤。

 

 

 

編寫程序放到主引導扇區,讓計算機在啟動后執行:

編譯程序:

首先先采用匯編語言來簡單編寫一個程序:

mov ax,0x30
mov dx,0xc0
add ax,dx

然后將其編譯成.bin二進制文件:

 

 

不知道這一步怎么處理的可以查看我的一篇博客:

搭建一鍵化編譯匯編語言的環境 - Sna1lGo - 博客園 (cnblogs.com)

 

然后采用前面下載的二進制查看文件HexView來打開我們的.bin文件:

 

 

可以看到我們這個只有8個字節的內容,但是扇區是以512個字節為單位的,所以我們必須填充成512個字節才行。而且主引導扇區的結尾必須是16進制的55和AA不然就是無效的。

所以我們還得修改一下匯編代碼:

mov ax,0x30
mov dx,0xc0
add ax,dx

times 502 db 0x0

db 0x55
db 0xAA

這里的times 502 db 0x0 相當於填充了502個字節的內容且為0。

然后最后結尾為0x55和0xAA。

來查看一下編譯后的結果:

 

 

一共是512個字節(0x200),且結尾為0x55和0xAA。

將程序寫入到虛擬硬盤:

這里需要用到李忠老師提供的軟件包的一個軟件:fixvhdwr.exe

這個只能寫入固定硬盤的內容:

 

 

選中我們剛剛的編譯好的二進制.bin文件。

然后選擇LBA,前面我們了解了LBA的知識所以第一個扇區0面0道1扇區就等於 LBA的0,這里就選0然后選擇寫入就好了:

 

 

然后采用二進制查看工具,查看我們寫入了的VHD磁盤是否成功:

 

 

前0x200個字節完全對應,所以是成功了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM