二进制文件
所需工具
所需工具
操作系统:Linux : Ubuntu18:http://releases.ubuntu.com/18.04/
文本编辑器: vscode: https://code.visualstudio.com/
汇编编译器:nasm: https://www.nasm.us/
虚拟机:vitualbox: [https://www.virtualbox.org/wiki/Linux_Downloads ]
二进制编码表
英文字符的二进制码(16进制表示):
英文 | 十六进制 | 英文 | 十六进制 | 英文 | 十六进制 | 英文 | 十六进制 |
---|---|---|---|---|---|---|---|
A=65 | 41 | H | 48 | O | 4F | V | 56 |
B | 42 | I | 49 | P | 50 | W | 57 |
C | 43 | J | 4A | Q | 51 | X | 58 |
D | 44 | K | 4B | R | 52 | Y | 59 |
E | 45 | L | 4C | S | 53 | Z | 60 |
F | 46 | M | 4D | T | 54 | ||
G | 47 | N | 4E | U | 55 |
使用汇编生成二进制文件
接下来,我们使用汇编语言生成一个二进制文件。这个二进制文件包含一个极其简单的boot引导程序。整个二进制文件可以作为1.44M软盘在虚拟机上运行。
整个程序只做一件事情,就是在屏幕上输出"ratsos"这6个字。
1. 新建汇编文件
新建一个ratsos.asm的文件。打开文本编辑器,写出如下汇编代码:
db 0xEB, 0x09, 0x90, 0x52, 0x41, 0x54, 0x53, 0x42
db 0x4F, 0x4F, 0x54, 0xB8, 0x00, 0xB8, 0x8E, 0xE8
db 0x65, 0xC6, 0x06, 0x00, 0x00, 0x72, 0x65, 0xC6
db 0x06, 0x01, 0x00, 0x74, 0x65, 0xC6, 0x06, 0x02
db 0x00, 0x61, 0x65, 0xC6, 0x06, 0x03, 0x00, 0x74
db 0x65, 0xC6, 0x06, 0x04, 0x00, 0x74, 0x65, 0xC6
db 0x06, 0x05, 0x00, 0x74, 0x65, 0xC6, 0x06, 0x06
db 0x00, 0x73, 0X65, 0xC6, 0x06, 0x07, 0x00, 0x74
db 0xEB, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
resb 432
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA
db 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
resb 4600
db 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
resb 1469432
2. 编译
在命令行执行
nasm -f bin -o ratsos.ima ratsos.asm
编译。编译时有warning。但是不用去管他。
上面的命令将ratsos.asm编译编译成一个二进制文件ratsos.ima。
这个ratsos.ima文件是最基本的二进制bin格式,并且大小为1.44M(1440x1024= 1474560),我们可以将这个ratsos.ima文件直接当做1.44M软盘镜像来使用。
3. 虚拟机运行镜像
使用vitualbox创建一个系统,添加一个软盘驱动器。
使用软盘驱动器加载镜像文件ratsos.ima。
启动系统
输出如下:
二进制文件分析
以二进制的方式查看文件内容
使用xxd命令分析二进制文件(以16进制方式输出文件的前512字节)
xxd -l 512 ratsos.ima
如图:
其实上面的内容和以下汇编文件生成的内容是一致的
;RatsOS
;TAB=4
[bits 16]
org 0x7c00 ;指明程序的偏移的基地址
;boot程序
jmp Entry
;程序核心内容
Entry:
mov ax,0xb800
mov gs,ax ;显存段地址
mov byte [gs:0x00],'r' ;输出字符
mov byte [gs:0x01],0x74 ;设置颜色(背景色蓝,前景色白)
mov byte [gs:0x02],'a'
mov byte [gs:0x03],0x74
mov byte [gs:0x04],'t'
mov byte [gs:0x05],0x74
mov byte [gs:0x06],'s'
mov byte [gs:0x07],0x74
mov byte [gs:0x08],'o'
mov byte [gs:0x09],0x74
mov byte [gs:0x0a],'s'
mov byte [gs:0x0b],0x74
jmp $ ;进入死循环,不再往下执行。
Fill_Sector:
resb 510-($-$$) ;处理当前行$至结束(1FE)的填充
db 0x55, 0xaa
Fill_Disk:
resb 1474560-($-$$) ;处理当前行$至结束(1440KB)的填充
代码地址:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf