自己动手从零写桌面操作系统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
相关文章
- 线程的生命周期
- LVS+KeepAlived高可用部署实战应用
- 多线程简介
- 程序里随处可见的interface,真的有用吗?真的用对了吗?
- Elasticsearch + Logstash + Filebeat + Kibana搭建ELK日志分析平台(官方推荐的BEATS架构)
- 都是中文用户名惹的祸~
- SpringMVC实战入门教程,四天带你快速搞定springmvc框架
- RESTful与Swagger(接口架构风格)- SpringBoot(17)
- 图解用户登录验证流程,写得太好了!
- Spring实战入门,带你轻松掌握Spring框架
- 【github项目】-CRM客户管理系统(基于SSM)
- java:eclipse设置代码提示
- 三天学会使用MyBatis框架,绝对干货,只实战,不学究!
- JavaWeb详解
- day02
- 萌新也能看懂的KMP算法
- Nginx作反向代理时超时重试配置
- 03-SpringAMQP入门
- 我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景
- 线程池,我是谁?我在哪儿?