自己動手從零寫桌面操作系統GrapeOS系列教程——10.NASM彙編

學習操作系統原理最好的方法是自己寫一個簡單的操作系統。


彙編語法主要有兩種:Intel語法和AT&T語法。
由於大部分介紹x86彙編的書籍和資料用的都是Intel語法,畢竟x86就是Intel發明的,大家學過的x86彙編大概率也是Intel語法,所以GrapeOS的彙編也用Intel語法。

支持Intel語法的x86彙編器不止一種,常見的有MASM和NASM。MASM來自微軟公司,只能在微軟的操作系統Windows和MS-DOS上用。NASM是開源軟件,支持多平臺。GrapeOS選用NASM。

下面介紹一下NASM在Linux上的使用
1.首次使用需要先安裝

yum install nasm  

由於我之前已經安裝過了,所以在上面的截圖上顯示“無須任何處理”。本教程中後續用到的Linux命令如果提示沒有,一般都通過 yum install命令安裝即可。
2.使用NASM彙編器
我們以第5講中的代碼爲例:

nasm boot.asm -o boot.bin  

nasm 命令後面緊跟的boot.asm是彙編代碼的源文件,參數-o後面跟的是生成文件的文件名。

從上面的截圖我們可以看到生成了boot.bin文件。這裏的boot.bin是一個二進制文件,裏面就是生成的機器碼。CPU只認識機器碼。把這個文件中的內容給CPU,CPU就能執行。


下面我們補充一下如何查看二進制文件。
對於文本文件,Linux下可以使用cat命令查看,比如我們用cat命令查看boot.asm文件:

如果我們用cat查看二進制文件boot.bin:

從上面的截圖中可以看到,用cat查看二進制文件會顯示亂碼。
在Linux中可以使用hexdump命令來查看二進制數

hexdump boot.bin  

我們來看上面的截圖,hexdump命令默認顯示的是十六進制數。左邊第一列是每一行數據在文件內的起始字節索引,右邊其它列都是文件內的數據。文件內的數據每兩個字節寫在一起,高地址字節寫在前面,低地址字節寫在後面,一行共顯示16個字節。在第5行下面一行只有一個星號“*”,表示相同的行重複若干行,直到遇到不同的行爲止。星號上面一行都是0,這裏星號表示重複了若干行0,直到最後一行數據不是全0。在最後一行數據下面一行有個數字,表示文件總字節數,這裏是0x200,換算成十進制數是512。
在實際使用時可以加上一個參數-C:

hexdump boot.bin -C

效果如下圖:

從上面的截圖可以更加清晰的看到文件中每個字節的十六進制數。此時右邊多了一大列,用豎線包裹者的數據,裏面很多是點號。其實這是同一行中的16個字節分別以ASCII字符顯示的結果,ASCII中的不可顯示字符在這裏就都用點號代表了。我們用hexdump命令查看一個文本文件大家對比一下就明白了,下面以彙編源文件boot.asm文件爲例。

hexdump boot.asm -C

從上面截圖上可以看到,中間區域是文件中每個字節的十六進制數,右邊豎線列中顯示的就是每個字節對應的ASCII字符。


本講對應的視頻版地址:https://www.bilibili.com/video/BV1PT411X7VG/
GrapeOS操作系統交流QQ羣:643474045

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章