• 自己动手从零写桌面操作系统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

  • 相关阅读:
    线性代数学习笔记6-4:行列式的应用(用伴随矩阵求逆矩阵、克莱姆法则解方程、行列式求面积/体积)
    Tomcat 异步组件 —— Nio2Endpoint
    模态逻辑介绍
    高并发扣款,如何保证结果一致性
    深入了解线程:并发编程的核心要点和应用
    【操作系统内存管理(基本概念)】
    Redis —— 自动主从切换
    【数字人】4、AD-NeRF | 使用 NeRF 来实现从声音到数字人人脸的直接驱动(ICCV2021)
    如何写好测试用例以及go单元测试工具testify简单介绍
    基于SkeyeVSS系统实现政府综合性视频监控平台管理解决方案
  • 原文地址:https://www.cnblogs.com/chengyujia/p/17191614.html