沉寂了一個學期,現在要做點正事了,畢業設計打算是寫一個簡單的操作系統,今天開始寫個系列文章,也稱不上是教程,算是爲畢業設計提前做準備,也是把網絡上有關x86系統的硬件和OS啓動過程綜合發佈並實現一下,內容會涉及X86架構的CPU和BIOS的相關知識。
關於彙編語言就不多說了,高層應用開發的人也許永遠不會接觸到這個編碼複雜的開發工具,但是我個人認爲用匯編寫出來的東西比那些高層應用開發人員所提出來的概念性東西實在的多。彙編現在能幹什麼呢?彙編什麼都能幹,你能用高級語言實現的功能彙編都能做,但是沒人願意用匯編來寫個IM什麼的,也沒有這個必要。但是對於從事和硬件開發相關的人來說,彙編永遠是不可或缺的一種實用語言工具。單片機,ARM架構系統等等嵌入式開發有些功能是必須用匯編來做的,BIOS開發,還有x86架構的系統開發中有些環節也是非彙編不能完成的。喜歡用匯編也可能和個人習慣相關,我可以選擇C來開發程序,也可以選擇彙編來開發,但是彙編是更直接的一種方法。從資源的利用上來說彙編語言比其他任何語言都簡單,因爲可以使用的資源無非是有限的寄存器,端口還有主存,所以彙編也是能顯現一個人做事靈活度的語言。語法就更不用說有多簡單了,不知道用“語法”這個詞對不對,因爲寫的是指令,有些人會說,機器碼是最難的,是嗎?如果給你列個表,把二進制機器碼和彙編指令助記符一一對應,給你時間讓你寫個HELLO WORLD你認爲難度在哪裏?都說越底層的東西越是難,其實都是在說開發效率和可讀性,越是底層涉及的東西越是有限,越是高層的東西人爲制定的限制越多,概念越多,概念又往往有一定的標準需要遵循,所以高層的技術開的發效率是很高,但是最終還是轉化成了底層的實現。如果你會C/C++,或者JAVA,C#等等並且很精通,如果只有一臺X86裸機或者ARM的最小系統讓你寫個HELLO WORD,能完成嗎?彙編當然是可以的,如果你會彙編,你可以把X86當做單片機來玩。
說這麼多不是說彙編是多麼好,只是說彙編就算在如今這樣的開發語言百家爭鳴的時代總是有一着一個不可撼動的地位。彙編不僅僅是一種語言,更是一種與硬件息息相關的工具。多餘的不再敘述,下面開始搭建我們的開發環境並寫出一個簡單的程序。
準備工具:
1.EDITPLUS 最新版本是 3.20 下載地址:http://www.editplus.com/ftp.pl?epp320.exe
2.MASM32 SDK 最新版本不詳 下載地址:http://www.masm32.com/
EDITPLUS是一個短小精悍的文本編輯工具,但是提供了強大的外部應用程接口,所以可以擴展成適合自己的IDE,而MASM32是國外的一個不辭勞苦的同志整理的WIN32彙編工具開發包,但是裏面繼承的文本編輯器都比較弱,所以我們需要把這兩個工具結合起來使用。主要是在EDITPLUS的自定義工具裏面添加MASM編譯器和鏈接器。現在有很多很好的彙編程序像NASM等,但是畢竟MASM先入爲主,而且也沒有太多精力了去學習NASM的一些不同於MASM的特性,所以就一直使用MASM了。
1).下載EDITPLUS安裝
2).下載MASM32 SDK安裝,建議安裝在根目錄比如F:/MASM32
3).編寫用於彙編源程序的批處理文件,因爲16位彙編和WIN32彙編需要的文件結構不同所以需要寫不同的參數至於OMF和COFF的文件格的定義請自行查閱相關資料。彙編程序是F:/MASM32/BIN/ml.exe這個程序是微軟的編譯器,在visual studio中也有這個程序。我們的彙編過程就是使用這個程序來完成的。可以傳遞不同的參數來彙編成不同文件格式的OBJ文件。批處理寫法如下。
01 |
@echo off |
02 |
REM 設置環境變量 |
03 |
@set include=F:/masm32/Include |
04 |
|
05 |
@set lib=F:/masm32/lib |
06 |
|
07 |
@set path=F:/masm32/bin; %path % |
08 |
|
09 |
echo Environment Variables Initalization Done! |
10 |
|
11 |
ml /c %1 %2 |
把此文件保存爲asm.bat,放在目錄F:/MASM32/下。
4).編寫用於鏈接目標文件的批處理,MASM下有兩個鏈接器F:/MASM32/BIN/link16.EXE和F:/MASM32/BIN/link.exe,看名字就只到第一個是用於16位DOS程序的鏈接器,第二個肯定是用於WIN32程序的鏈接器。其實這兩個文件在MASM的發行版本中名字都是一樣的只是後來,後者只是前者的更新版本,但是link.exe只能鏈接COFF格式的OBJ文件,如果用於鏈接OMF的格式的OBJ文件則會出錯。兩個程序的版本信息。
F:/MASM32/BIN/link16.EXE
Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.
對於這個鏈接器功能單一隻是用來鏈接16位DOS程序,所以可以直接調用,不用批處理。
F:/MASM32/BIN/link.exe
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
這個鏈接器由於是鏈接WIN32程序,所以要有WINDOW程序和CONSOLE程序之分所以要寫個批處理鏈接不同的目標程序。
批處理寫法如下
01 |
@echo off |
02 |
REM 設置環境變量 |
03 |
@set include=F:/masm32/Include |
04 |
|
05 |
@set lib=F:/masm32/lib |
06 |
|
07 |
@set path=F:/masm32/bin; %path % |
08 |
|
09 |
if "%1" == "/win" link /subsystem:windows %2 .obj |
10 |
if "%1" == "/dos" link /subsystem:console %2 .obj |
注:沒有考慮包含資源的源程序編譯。
5).添加EDITPLUS的工具欄。不再文字敘述,請參照圖示設置。
彙編開發環境已經搭建好了,可以開始寫一個簡單的彙編程序了。鑑於老師一直鄙視HELLOWORLD 所以我也不寫HELLOWORLD了。寫一行變色的文字吧。
點擊新建文件按鈕,新建一個文本文件。然後就可以寫代碼了。
DB 64 DUP(?)
DATASS
DATAS SEGMENT
color DB 00H ;字符串顏色
len DW 0000H ;字符串長度
msg DB "A simple boot sector! Tishion!"
strend DB '$'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
start:
MOV AX, DATAS
MOV ES, AX
MOV AX, OFFSET msg ; 將字符串拷貝到ax
MOV BP, AX ; es:bp = 串地址
MOV CX, OFFSET strend
MOV DX, OFFSET msg
SUB CX, DX ; cl= 串長度
MOV len, CX
next: INC color ;顏色數值+1
AND color, 0FH ;與0FH相與使背景色值不變爲0
MOV AX, 1301H ; ah = 13, al = 01h
MOV BH, 00H ; 頁號爲0(bh = 0)
MOV BL, color ;黑底紅字(bl = 0ch,高亮)
MOV CX, len
MOV DX, 0815H ;第0h行15h列(dh = 0 dl = 15h)
INT 10H ; 10h號中斷
JMP next
over: RET
CODES ENDS
END start
然後直接點擊我們設置好的按鈕 Assemble-OMF
看到輸出信息
---------- Assemble-OMF ----------
Environment Variables Initalization Done!
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: BlinkText.asm
Output completed (0 sec consumed) - Normal Termination
然後點擊Link16按鈕 因爲沒有用到其他庫文件也不需要清單和定義文件所以一路回車就可以。
最後輸出
Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.
Run File [BlinkText.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
請按任意鍵繼續. . .
現在已經生成了可執行文件了。然後點擊RUN按鈕。
就可以看到我們的程序效果了。