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),輸入以下指令(提示符部分不用輸入):
提示符>..\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文件夾。操作系統就是這樣一點一點地成長起來的。
每次進行匯編編譯的時候,我們都要輸入剛才的指令,這太麻煩了,所以筆者就做了一個批處理文件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語言是一樣的。
- Cybersecurity:Attack and Defense Strategies
- Linux Mint Essentials
- 無蘋果不生活 OS X Mountain Lion隨身寶典
- 嵌入式應用程序設計綜合教程(微課版)
- Learning Magento 2 Administration
- 從實踐中學習Kali Linux無線網絡滲透測試
- Linux內核設計的藝術:圖解Linux操作系統架構設計與實現原理
- Advanced TypeScript Programming Projects
- Social Data Visualization with HTML5 and JavaScript
- Kali Linux高級滲透測試(原書第3版)
- 從實踐中學習Windows滲透測試
- iOS 10 開發指南
- Windows Server 2008組網技術與實訓(第3版)
- 辦公自動化教程(Windows7+Office2010)
- BuddyPress Theme Development