官术网_书友最值得收藏!

3 初次體驗匯編程序

好,現在就讓我們馬上來寫一個匯編程序,用它來生成一個跟剛才完全一樣的helloos.img吧。我們這次使用的匯編語言編譯器是筆者自己開發的,名為“nask”,其中的很多語法都模仿了自由軟件里享有盛名的匯編器“NASM”,不過在“NASM”的基礎之上又提高了自動優化能力。

超長的源代碼

DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
(為節省紙張,這里省略中間的18萬4314行)
DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

我們使用復制粘帖的方法,就可以寫出這樣一個超長的源代碼來,將其命名為“helloos.nas”,并保存在helloos0中。仔細看一下就能發現這個文件內容與我們用二進制編輯器輸入的內容是一模一樣的。

接著,我們用“! cons_nt.bat”或是“! cons_9x.bat”(我們在前面已經說過,要根據Windows的版本決定用哪一個。以后每次都這樣解釋一遍的話比較麻煩,所以我們就將它簡寫為!cons好了)打開一個命令行窗口(console),輸入以下指令(提示符部分不用輸入):

提示符prompt,出現在命令行窗口中,提示用戶進行輸入的信息。>..\z_tools\nask.exe helloos.nas helloos.img

這樣我們就得到了映像文件helloos.img。

好,我們的第一個匯編語言程序就這樣做成了!……不過這么寫程序也太麻煩了,要做個18萬行的程序,不但浪費時間,還浪費硬盤空間。與其這樣還不如用二進制編輯器呢,不用輸入“0x”、“, ”什么的,還能輕松一點。

■■■■■

其實要解決這個問題并不難,如果我們不只使用DB指令,而把RESB指令也用上的話,就可以一下將helloos.nas縮短了,而且還能保證輸出的內容不變,具體我們來看下面。

正常長度的源程序

DB  0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB  0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
DB  0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
DB  0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
DB  0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
DB  0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB  0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
DB  0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
RESB     16
DB  0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB  0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB  0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB  0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB  0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
DB  0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
DB  0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
RESB     368
DB  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB     4600
DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB     1469432

我們自己動手輸入這段源程序比較麻煩,所以筆者把它放在附帶光盤的projects\01_day\helloos1目錄下了。大家只要把helloos1文件夾復制粘帖到tolset文件夾里就可以了。之前的helloos0文件夾以后就不用了,我們可以把它刪除,也可以放在那里留作紀念。順便說一下,筆者將helloos0文件夾名改為了helloos1,刪掉了其中沒用的文件,新建并編輯了需要用到的文件,這樣就做出了新的helloos1文件夾。操作系統就是這樣一點一點地成長起來的。

每次進行匯編編譯的時候,我們都要輸入剛才的指令,這太麻煩了,所以筆者就做了一個批處理文件batch file,基本上只是將命令行窗口里輸入的命令寫入文本文件。雖然還有功能更強的處理,但本書中我們用不到。所謂批處理就是批量處理,即一次處理一連串的命令。asm.bat。有了這個批處理文件,我們只要在用“! cons”打開的命令行窗口里輸入“asm”,就可以生成helloos.img文件。在用“asm”作成img文件后,再執行“run”指令,就可以得到與剛才一樣的結果。

■■■■■

DB指令是“define byte”的縮寫,也就是往文件里直接寫入1個字節的指令。筆者喜歡用大寫字母來寫匯編指令,但小寫的“db”也是一樣的。

在匯編語言的世界里,這個指令是程序員的殺手锏,也就是說只要有了DB指令,我們就可以用它做出任何數據(甚至是程序)。所以可以說,沒有用匯編語言做不出來的文件。文本文件也好,圖像文件也好,只要能叫上名的文件,我們都能用匯編語言寫出來。而其他的語言(比如C語言)就沒有這么萬能。

RESB指令是“reserve byte”的略寫,如果想要從現在的地址開始空出10個字節來,就可以寫成RESB 10,意思是我們預約了這10個字節(大家可以想象成在對號入座的火車里,預訂了10個連號座位的情形)。而且nask不僅僅是把指定的地址空出來,它還會在空出來的地址上自動填入0x00,所以我們這次用這個指令就可以輸出很多的0x00,省得我們自己去寫18萬行程序了,真是幫了個大忙。

這里還要說一下,數字的前面加上0x,就成了十六進制數,不加0x,就是十進制數。這一點跟C語言是一樣的。

主站蜘蛛池模板: 郸城县| 玛曲县| 普定县| 信宜市| 顺义区| 建宁县| 开远市| 邮箱| 平和县| 青海省| 鄂尔多斯市| 繁峙县| 巴马| 海原县| 诸暨市| 山东省| 泗阳县| 泸西县| 额尔古纳市| 五寨县| 嘉荫县| 阜阳市| 龙井市| 云梦县| 乌海市| 江源县| 河源市| 拉萨市| 镇远县| 铅山县| 婺源县| 龙江县| 潞西市| 凤翔县| 泾阳县| 江陵县| 濮阳县| 金溪县| 宿迁市| 临沭县| 盐山县|