自己动手从零写桌面操作系统GrapeOS系列教程——10.NASM汇编语言

发布时间 2023-03-22 19:13:42作者: 成宇佳

学习操作系统原理最好的方法是自己写一个简单的操作系统。


汇编语法主要有两种: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