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

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

时间:2023-03-08 12:22:46浏览次数:58  
标签:bin 10 hexdump 字节 文件 boot GrapeOS 桌面操作系统 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

标签:bin,10,hexdump,字节,文件,boot,GrapeOS,桌面操作系统,NASM
From: https://www.cnblogs.com/chengyujia/p/17191614.html

相关文章

  • Oracle问题:ORA-01109解决办法
    ORA-01109:数据库未打开01109.00000-"databasenotopen"*Cause:Acommand查看数据库监听:启动启动数据库达到open状态后面发现连接的那个库没有到opened状态selectc......
  • 10N60-ASEMI高压N沟道MOS管10N60
    编辑:ll10N60-ASEMI高压N沟道MOS管10N60型号:10N60品牌:ASEMI封装:TO-220最大漏源电流:10A漏源击穿电压:600VRDS(ON)Max:0.85Ω引脚数量:3芯片个数:沟道类型:N沟道MOS管、高......
  • Python常见面试题010. Python的整形占多大内存?
    010.Python的整形占多大内存?示例代码importsysa=0print(a.__sizeof__())#24print(sys.getsizeof(a))#24所以答案是24?并不是!看下面importsysb=1pr......
  • CentOS-7-x86_64-DVD-1810
    1.点击安装 第一个选项是直接安装。 第二个选项是需不需要检测镜像。 我们选择第一个直接安装。2.选择语言3.4.5. ......
  • 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(10)-Charles如何修改请求参数和
    1.简介宏哥之前一直用postman调接口比较多(web端),也非常容易上手和操作。但有时候想要去修改APP的页面展示,造数据又会比较麻烦,你自己造相对还好些,要是让开发造,还得低眉顺眼......
  • python连接oracle 19c报错误ORA-01017: invalid username/password
    环境:db:19cpython:3.6最近有使用到cx_oracle(5.3)模块,这里记录下出现的问题由于我的项目一直在是windows上测试,最近把项目更新到linux下后,再去跑代码,发现代码报出ORA-2......
  • 【题解】[Ynoi2010] y-fast trie
    题目分析:显然可以对于所有的\(x\)对\(C\)取模后处理。那么就是两种情况:\(x+y\geC\)\(x+y<C\)对于第一种情况直接找最大的两个数就好了,关键就是第二种情......
  • 【win10优化系列】FRP内网穿透-远程桌面
    前言frp采用Golang编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。frp主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网IP的......
  • PAT Basic 1014. 福尔摩斯的约会
    PATBasic1014.福尔摩斯的约会1.题目描述:大侦探福尔摩斯接到一张奇怪的字条:我们约会吧!3485djDkxh4hhGE2984akDfkkkkggEdsbs&hgsfdkd&Hyscvnm大侦探很快就......
  • L10.面向对象
    --父类localParentClass={id="085",name="紫霞",--ParentClass.__index=ParentClass#自索引错误写法,__index赋值的是一个nil值,也就是说......