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

成宇佳發表於2023-03-08

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


彙編語法主要有兩種: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

相關文章